Самые распространенные данные с которыми мы сталкиваемся при написании программ — это строки и числа.
— Целые числа (integer) – положительные, отрицательные целые числа и 0. Например, 4, 663, -27, 0.
- Числа с плавающей точкой (float) – дробные числа. Например, 1.5, -6.32136, 0.05321.
Важно: разделителем целой и дробной части служит точка, а не запятая. - Строки (string) — набор символов, заключенных в кавычки (например, «cat», «Hello, 世界!», ‘qwerty’, ‘3388’). Примечание: кавычки в Python могут быть одинарными или двойными.
Операции
Операция — это выполнение действий над данными (операндами) с использованием операторов.
Сложение двух чисел — операция:
>>> 2.5 + 3.8 6.3
Одни и те же операции с разными типами данных могут работать по-разному. Например сложение двух строк (конкатенация):
>>> «This is » + » a cat.» «This is a cat.»
При умножении одного числа на другое мы получаем их произведение:
Метод split и метод join Python
>>> 5 * 5 25
При умножении строки на число эта строка повторяется N раз:
>>> «Meow, » * 4 «Meow, Meow, Meow, Meow, »
Список доступных операций над числами
# сложение >>> 10 + 20 30 # вычитание >>> 35 — 20 15 # умножение >>> 5 * 7 35 # деление >>> 35 / 7 5.0 # целочисленное деление >>> 5 // 2 2 # остаток целочисленного деления >>> 5 % 2 1 # возведение в степень >>> 5 ** 2 25
Преобразование типов
Для разных типов данных схожие операции могут работать по-разному, но самое главное — тип данных результата может измениться после выполнения.
Например, при сложении двух целых чисел результат будет целым числом. Если же попробовать сложить целое число с дробным (числом с плавающей точкой), то результат будет преобразован в число с плавающей точкой. При попытке сложить строку с числом интерпретатор Python’а выдаст ошибку.
# складываем два целых числа, int + int = int >>> 13 + 14 27 # складываем два числа, одно — int, другое — float, # результат — float >> 2 + 3.423 5.423 # пытаемся сложить строку (str) и целое число (int), # результат — ошибка >>> «cat » + 4 TypeError: Can’t convert ‘int’ object to str implicitly
Часто в программу передаются данные в виде строк, но она должна работать с ними как с числами. В таком случае используются функции преобразование типов.
# функция int() преобразует строку в целое число >>> int(«21») 21 # функция float() преобразует строку в число с плавающей точкой >>> float(«2.3154») 2.3154 # функция str() преобразует переданный ей # аргумент (например число) в строку >>> str(20961) «20961» # Если функция не может привести данные к нужному типу, # то возникает ошибка # Например при попытке перевести символы в число >>> int(«batman») ValueError: invalid literal for int() with base 10: ‘batman’ >>>
Переменные
Данные хранятся в памяти компьютера.
Урок 11 Строки и их методы Python
Например, если мы сложим два числа, то получим результат. К сожалению, мы не можем повторно обратиться к нему, поскольку не знаем где он хранится.
>>> 13 + 14 27
Для сохранения данных в памяти, мы связываем их с определенным именем — переменной, чтобы в будущем обращаться к этим данным по имени.
# сохраним слагаемые в переменные a и b >>> a = 13 >>> b = 14 # посчитаем сумму a + b и запишем ее в переменную c >>> c = a + b # выведем значение переменной c >>> print(c) 27
Правила именования переменных
- Переменные должны иметь осознанное имя, чтобы в будущем было легко понять какие данные в них находятся.
Например если мы сохраняем имя пользователя в переменную, то логичнее всего назвать ее user_name или просто name - Имя переменной должно начинаться с буквы или символа подчеркивания _
- Имя переменной не должно совпадать с командами языка, например нельзя называть переменные print, float, int и т.п.
Источник: thisizasqd.wordpress.com
Я пытаюсь сложить две строки вместе, но получаю ошибку 3221225477.
Я пытаюсь получить число и число повторений, а затем добавляю столько чисел, сколько число повторений один за другим. Но я получаю результат 3221225477. Что я должен делать?
char *repetitor(char number[], int repFactor)< char* temp; while(repFactor>0) < strcat(temp, number); repFactor—; >return temp;
int main(int argc, char *argv[]) < char* number; int repFactor = 0; printf(«Please enter a number (n=) :»); scanf(«%s», printf(«Please enter repetition factor (k=) :»); scanf(«%d», char* numberRep = (repetitor(number,repFactor));
Musa ÖZKAN 14 Май 2022 в 13:21
Вы не выделили память для number .
JASLP doesn’t support the IES
14 Май 2022 в 13:26
temp не инициализирован.
14 Май 2022 в 13:26
ОЗКАН Ваша программа имеет неопределенное поведение, потому что вы используете неинициализированные указатели для хранения строк.
Vlad from Moscow
14 Май 2022 в 13:26
Даже когда/если вы выделяете память для хранения, scanf(«%s», все равно будет неправильным. %s», читает стандартный ввод и сохраняет ввод в буфере, на который указывает второй аргумент. число не является ожидаемым буфером, это указатель, поэтому вы передаете адрес указателя (char **) в scanf(). число sizeof(char *) байтов большое, поэтому вы можете обойтись без ввода символа или трех, но число должно быть массивом символов:
Номер символа[100]; … scanf(«%s», число); // нет проверки на переполнение!
Re: repetitor(), не только временная неинициализированная (вы копируете в случайное пространство, а strcat() нужно найти конечный NUL), буферное пространство не выделено, и вы возвращаете переменную стека, которой больше не существует, когда repetitor () возвращается.
Когда вы учитесь, включите ВСЕ предупреждения вашего компилятора.
Источник: question-it.com
Защита от дурака. Ввод числовых типов данных в C/C++ с проверкой на корректность
Большинство программ должны взаимодействовать с пользователем посредством ввода определённых данных, будь то ФИО, рост, вес для внесния в базу данных или геометрические размеры какого-то объекта, для которого нужно что-то рассчитать. Все эти данные вводит пользователь — человек, а значит в ответ может придти всё что угодно. Что выдаст программа, если вместо требуемого ей возраста пользователь напишет его словом? Скорее всего программа аварийно завершится или зависнет, но только не в том случае, если в ней предусмотрена «защита от дурака».
Почему программа может завершиться или зависнуть? Программа попытается перевести набор символов в число, что сделать не удастся, а значит дальнейшая работа приложения не определена. Поэтому очень важно организовывать структуру программы так, чтобы при вводе неожиданных для программы данных (некорректных с точки зрения требуемого формата: нужно число, а вводится слово), приложение не «падало», а сообщало пользователю о том, что произошла ошибка и предлагало повторить ввод. Это и есть «защита от дурака».
Реализация защиты от дурака на языке C
Чтобы реализовать хорошую защиту от дурака для ввода различных числовых (int, double. ) данных, необходимо считывать не сами числа, а всю вводимую строку и уже потом анализировать ввод. В языке C есть очень хорошая функция sscanf(const char *, const char *, args) , которая работает аналогично функции scanf(const char *, args) , возвращая количество успешно считанных аргументов, только чтение данных происходит не из стандартного потока ввода, а из переданной ей первым аргументом строки.
Рассмотрим несколько примеров функций, которые реализуют проверку на дурака, используя функцию sscanf .
Ввод целого числа с проверкой на некорректный ввод
int get_integer(const char *msg) < char answer[256]; // строка для чтения int n; // итоговое целое число printf(«%s», msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будет считано целое число while (sscanf(answer, «%d», printf(«Incorrect input. Try again: «); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку >return n; // возвращаем корректное целое число >
Чтобы считать целое число, алгоритм считывает всю строку и затем пытаеся получить из неё целое число. В том случае, если это не удалось, функция выводим сообщение об ошибке с предложением повторить ввод до тех пор, пока не будет введено корректное значение целого числа.
Ввод вещественного числа с проверкой на некорректный ввод
double get_double(const char *msg) < char answer[256]; // строка для чтения double x; // итоговое вещественное число printf(«%s», msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будет считано вещественное число while (sscanf(answer, «%lf», printf(«Incorrect input. Try again: «); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку >return x; // воозвращаем корректное вещественное число >
Ввод точки на координатной плоскости (структура с двумя вещественными полями)
// описание структуры даных typedef struct point_t < double x; // координата x double y; // координата y >point_t; point_t get_point(const char *msg) < char answer[256]; // строка для чтения point_t point; // итоговая точка printf(«%s», msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будут считаны обе координаты точки while (sscanf(answer, «(%lf,%lf)», point.y) != 2) < printf(«Incorrect input. Try again: «); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку >return point; // возвращаем корректную точку >
Как видно из примеров, особенность возвращения функцией sscanf числа считанных аргументов позволяет контролировать корректность введённых данных в указанном формате, а считывание всей строки защищает от того, что в потоке ввода останутся символы пробела или переноса строки ‘n’ , которые уж очень часто заставляют потратить на поиск ошибки ни один час или даже день.
Программист, соосновательница programforyou.ru, рукодельница, всегда готова придти на помощь и помочь во всём разобраться
Языки программирования: Python, C, C++, Pascal
Выпускница МГТУ им. Н.Э. Баумана
Programforyou — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.
Источник: programforyou.ru