При вводе необходимо, чтобы переменная была обязательно числом, если вводится иной символ, программа должна запросить повторный ввод. Но чтобы определить что это именно какой то иной символ нужно определить его тип данных, а как это сделать я не знаю. Заранее спасибо за помощь)
Отслеживать
задан 11 сен 2019 в 23:54
Михаил Мудриченко Михаил Мудриченко
неправильно подходишь к вопросу: нужно попробовать считать число, а если не вышло, то обработать ошибку. хинт: функции семейства scanf возвращают то сколько значений они успешно распознали, а также надо считать другими средствами то, что не смог считать при первой попытке. ЗЫ: стоит добавлять свой код прямо в вопрос, нажав серенькую кнопочку править
12 сен 2019 в 0:15
То есть, стоит попробовать завести счетчик полученных значений?
12 сен 2019 в 0:27
Число — это никак не один символ. 55 — число. 48 — число. Потом, какое число — целое? вещественное? это разные вещи, потому что 0.314e1 — тоже число 🙂 Непонятно из вопроса, как реагировать на ввод, скажем, 123abc — как на число 123 или рассматривать его как ошибку.
ТИПЫ ДАННЫХ В C# | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | Урок # 3
12 сен 2019 в 3:44
Михаил, у вас путаница в терминологии. При вводе с клавиатуры вы можете получить только строку (ну или один символ как частый случай). Ваш вопрос в том, можно ли эту строку считать представлением числа или нет, а не в типе введенных данных.
12 сен 2019 в 5:14
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
В двух словах, ответ выглядит так:
- Вводим строку с помощью функции fgets(. )
- errno = 0;
- Пытаемся преобразовать введённую строку в число, с помощью функции strtol(. )
- Проверяем значение переменной errno
- Если есть ошибка — печатаем сообщение и переходим к пункту 1.
Функция *strtol(const char *nptr, char **endptr, int base)* преобразует начальную часть строки nptr в длинное целое число согласно системе счисления base, значение которой может быть от 2 до 36 включительно или равно специальному значению 0.
Это кусок из моего рабочего кода:
unsigned int ConvertToUInt(const char *nptr) < unsigned long int ret_val = 0; char *endptr; unsigned int rc; // Пытаемся выполнить преобразование errno = 0; ret_val = strtoul(nptr, //——————————————- // Проверяем все мыслимые ошибки //——————————————- if ((errno == ERANGE (ret_val == ULONG_MAX || ret_val == 0)) || (errno != 0 ret_val == 0)) < syslog(LOG_ERR, «Функция strtol сообщила об ошибке»); return 0; >if (endptr == nptr) < syslog(LOG_ERR, «Строка не содержит цифр»); return 0; >rc = ret_val; return rc; >;
Замечание: в примере я использую strtoul, но смысл остаётся тот же.
Отслеживать
9,507 9 9 золотых знаков 24 24 серебряных знака 35 35 бронзовых знаков
ответ дан 12 сен 2019 в 2:52
13.3k 1 1 золотой знак 13 13 серебряных знаков 27 27 бронзовых знаков
У вас еще не отработан случай строки, скажем, 123abc .
12 сен 2019 в 3:43
12 сен 2019 в 4:17
Типы данных JAVASCRIPT. Null String Undefined Boolean Number и другие. Уроки JAVASCRIPT с нуля 2020
22 ноя 2019 в 18:33
23 ноя 2019 в 5:39
попробовал так, превышается время
#include #include int main(void) < int length,k; while (k != 1) < scanf(«%d», if isdigit(length) ++k; >length = length * 4; printf(«%d», length); return 0; >
Отслеживать
ответ дан 12 сен 2019 в 0:08
Михаил Мудриченко Михаил Мудриченко
Какое начальное значение у k ?
12 сен 2019 в 11:52
Тип данных
Как уже написали в комментариях, у вас путаница понятий. С клавиатуры нельзя ввести тип данных «число», это в любом случае будет строка (она может содержать цифры, но это не важно в данном случае). Поэтому тип данных вам никак не поможет, это все равно будет char * .
Представление числа
Числа могут иметь несколько представлений в виде строки. Если проще — вариантов записи числа:
- 123 (десятичное целое)
- 0x123ab (шестнадцатеричное целое)
- 0123 (восьмеричное целое)
- b10110 (двоичное целое)
- 0.01 (десятичное вещественное)
- 10e2 (десятичное вещественное в научной записи)
Все, приведенное выше — числа. В вопросе вы не указали, какое именно текстовое представление числа вас интересует.
Проверка введенных данных
Теперь о проверке введенных данных. Способов несколько:
Я приведу пример использования scanf :
#include #include int ClearStdin() < int rv = 1; int ch; while (1) < ch = getchar(); if (ch == ‘n’ || ch == EOF) < break; >rv = 0; > return rv; > int main(int argc, char **argv) < int num; int readCount; int isEmpty; while (1) < readCount = scanf(«%d», isEmpty = ClearStdin(); if (readCount == 1 isEmpty != 0) < break; >printf(«Неверный формат числаn»); > printf(«%dn», num); return EXIT_SUCCESS; >
Обратите внимание на функцию ClearStdin . У нее два назначения: во-первых, если функция scanf не смогла считать необходимые данные, то они остаются в буфере ввода и программа будет пытаться считать их оттуда бесконечно. Во-вторых, данная функция проверяет, что буфер ввода был прочитан до конца и там не осталось лишних символов, таким образом ввод вида 123someword не будет валидным. В примере указан ввод с клавиатуры десятичного целого числа. Если вам нужен другой формат, посмотрите документацию на функцию scanf .
Источник: ru.stackoverflow.com
9. Типы данных, их классификация и способы задания.
Любые данные, т. е. константы, переменные, свойства, значения функций или выражения, характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Кроме того, тип определяет также и формат внутреннего представления данных в памяти ПК.
Различают переменные следующих простых типов: целые (Integer, Byte, ShortInt, Word, LongInt), вещественные (Real, Double, Single, Extended), логический (Boolean), символьный (Char), перечисляемый, диапазонный (интервальный).
Иерархия типов в языке Pascal характеризуется разветвленной структурой.
Рис. Структура типов данных
К простым типам относятся порядковые, вещественные типы.
Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда — название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число — порядковый номер значения.
Вещественные типы,строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
Объявления типа данных служат для компилятора источником информации о свойствах величин, используемых в программе, и установления связи между этими величинами и их идентификаторами.
Согласно объявленным переменным и их количеству компилятор резервирует необходимый объем памяти для хранения значений величин, над которыми выполняются требуемые операции.
идентификатор переменной: тип;
Var d, c, n : Integer;
LogPer : Boolean;
Тип переменной определяет:
- диапазон допустимых значений, принимаемых величинами этого типа;
- набор операций, допустимых над данной величиной;
- объем памяти, отводимой под эту переменную;
- способ представления величин в памяти компьютера.
Каждый тип имеет свой идентификатор.
Идентификатор | Количество байт | Диапазон (множество) значений | Операции |
Целые типы | |||
integer | 2 | –32768..32767 | +, –, /, *, Div, Mod, >=, , |
byte | 1 | 0..255 | |
word | 2 | 0..65535 | |
shortint | 1 | –128..127 | |
longint | 4 | –2147483648..2147483647 | |
Вещественные типы | |||
real | 6 | 2,9×10 –39 — 1,7×10 38 | +, –, /, *, >=, , |
single | 4 | 1,5×10 –45 — 3,4×10 38 | |
double | 8 | 5×10 –324 — 1,7×10 308 | |
extended | 10 | 3,4×10 –4932 — 1,1×10 4932 | |
Логический тип | |||
Boolean | 1 | true, false | Not, And, Or, Xor, >=, , |
Символьный тип | |||
char | 1 | все символы кода ASCII | +, >=, , |
Порядковые типы.Целые типы.Имеется пять целочисленных типов, диапазон возможных значений которых зависит от их внутреннего представления. Типы целых, объем занимаемой памяти, и диапазон возможных значений приведен в табл. Набор встроенных математических функций применимых к данными целого типа в Паскале приведен в табл. Табл. Набор встроенных математических функций применимых к данными целого типа в Паскале
Обращение | Назначение |
abs(x) | Возвращает модуль x |
sqr(x) | Возвращает квадрат x |
random(w) | Генерирует псевдослучайное число на интервале. |
odd(i) | Возвращает true если i нечетное |
chr(b) | Возвращает символ по коду i |
dec(x, k) | Уменьшает x на k или 1 |
inc(x, k) | Увеличивает x на k или 1 |
hi(i) | Возвращает старший байт |
lo(i) | Возвращает младший байт |
swap(i) | Меняет байты местами |
где: x –любой тип; i –integer тип; b –byte тип; w — word тип. Логический типданных носит название BOOLEAN. Значением логического типа может быть одна из двух констант FALSE (ложь) или TRUE (истина). Символьные данные.Наряду с числовой информацией в Паскале используется алфавитно-цифровая или символьная информация, которая включает в себя заглавные, строчные буквы, цифры от 0 до 9 и вспомогательные символы. Для описания символьных переменных используется тип данных CHAR или STRING. Тип данных CHAR Каждая переменная символьного типа может принимать значение только одного символа. Все символы упорядочены в соответствии с принятым в ЭВМ коде (например ASCII). При этом порядковый номер символов называется кодом (например, код латинского символа ‘А ‘ равен 65; символа ‘3’ равен 51). Для символьных данных не определены никакие арифметические операции, но они могут сравниваться по своим кодам, участвовать в чтении, печати, операторах присваивания. Переменная типа STRING может принимать значения переменной длины. Максимально возможная длина переменной 255 символов. Перечисляемый типпредставляет собой ограниченную упорядоченную последовательность скалярных констант, составляющих данный тип. Значение каждой константы задается ее именем. Имена отдельных констант отделяются друг от друга запятыми, а вся совокупность констант, составляющих данный перечисляемый тип, заключается в круглые скобки. Программист объединяет в одну группу в соответствии с каким-либо признаком всю совокупность значений, составляющих перечисляемый тип. Например, перечисляемый тип Rainbow (РАДУГА) объединяет скалярные значения RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET (КРАСНЫЙ, ОРАНЖЕВЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, СИНИЙ, ФИОЛЕТОВЫЙ). Перечисляемый тип описывается в разделе описания типов, например: typeRainbow = (RED, ORANGE, YELLOW,GREEN, LIGHT_BLUE, BLUE, VIOLET);Интервальный тип.Отрезок (диапазон значений) любого порядкового типа может быть определен как интервальный (ограниченный) тип. Отрезок задается диапазоном от минимального до максимального значения констант, разделенных двумя точками. В качестве констант могут быть использованы константы, принадлежащие к целому, символьному, логическому или перечисляемому типам. Скалярный тип, на котором строится отрезок, называется базовым типом. Примеры отрезков: 1..10-15..25’a’..’z’ Минимальное и максимальное значения констант называются нижней и верхней границами отрезка, определяющего интервальный тип. Нижняя граница должна быть меньше верхней. Над переменными, относящимися к интервальному типу, могут выполняться все операции и применяться все стандартные функции, которые допустимы для соответствующего базового типа. Вещественные типы данных. В Турбо Паскале имеется пять видов вещественных типов, диапазон возможных значений которых зависит от их внутреннего представления. Типы целых, объем занимаемой памяти, количество значащих цифр и диапазон возможных значений приведен в табл.
Тип | Длина, байт | К-во зн. цифр | Диапазон |
REAL | 6 | 11..12 | ![]() |
SINGLE | 4 | 7..8 | ![]() |
DOUBLE | 8 | 15..16 | ![]() |
EXTENDED | 10 | 19..20 | ![]() |
COMP | 8 | 19..20 | ![]() |
Над данными вещественного типа определены следующие операции: — арифметические: +, -, /, * — соотношения: =, <>, , = Набор встроенных математических функций применимых к данными вещественного типа приведен в табл. ниже.
Обращение | Назначение | Пример |
sin(x) | Возвращает синус, угол в радианах | |
cos(x) | Возвращает синус, угол в радианах | |
arctan(x) | Возвращает арктангенс | |
abs(x) | Возвращает абсолютную величину | |
sqr(x) | Возвращает квадрат | |
exp(x) | Возвращает экспоненту | |
ln(x) | Возвращает логарифм натуральный | |
trunc(x) | Отбрасывает дробную часть | trunc(5.6)=5 |
round(x) | Округляет до ближайшего целого | round(5.6)=6 |
frac(x) | Выделяет дробную часть | frac(10.1)=0.1 |
int(x) | Выделяет целую часть | int(10.1)=10.0 |
random | Датчик случайных чисел (ДСЧ) 0 | |
random(x) | Датчик случайных чисел (ДСЧ) 0 | |
randomize | Инициализация ДСЧ |
Структурированный типданных. Структурированный тип данных – это множество элементов данных (компонент) с одним именем. В отличие от данных скалярного типа, которые могут принимать одно значение, данные структурированного типа могут принимать множество значений одного типа (регулярный тип, например, массивы), либо разных типов (комбинированные типы, например, записи). Массив ‑ это упорядоченное, ограниченное множество однотипных элементов, объединенных общим именем. Тип компонент (элементов) называется базовым и м.б. любым кроме файлового. Для обозначения элементов массива используется переменная с индексами. Например: A[25], B[5, 8], X[i], Y[i, j], R[n+1]. Размер массива (длина) – число элементов массива. Размерность массива – число индексов в массиве. Индекс определяет положение элемента в массиве. Тип индексов д.б. скалярным, упорядоченным и конечным. Чаще всего используются индексы интервального типа, при этом они м.б. отрицательными. Все компоненты массива одинаково доступны и могут выбираться в произвольном порядке. Строки – это по сути, одномерный массив символов. Строка — это массив символов; проявляется её «массивность» в том, что к её элементам (то есть, символам) можно обращаться по индексам, можно перебирать множество символов строки в цикле так же, как и обычный массив. Записи.Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. В отличие от массива, элементами записей (их называют полями) могут быть даные различных типов. Изначально записи были созданы для хранения баз данных. Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры
Источник: studfile.net
Типы данных в языке Си
Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и способ реализации хранения значений и выполнения операций.
Процесс проверки и накладывания ограничений на типы используемых данных называется контролем типов или типизацией программных данных . Различают следующие виды типизации:
- Статическая типизация — контроль типов осуществляется при компиляции.
- Динамическая типизация — контроль типов осуществляется во время выполнения.
Язык Си поддерживает статическую типизацию, и типы всех используемых в программе данных должны быть указаны перед ее компиляцией.
Различают простые, составные и прочие типы данных.
Простые данные
Простые данные можно разделить на
- целочисленные,
- вещественные,
- символьные
- логические.
Составные (сложные) данные
- Массив — индексированный набор элементов одного типа.
- Строковый тип — массив, хранящий строку символов.
- Структура — набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.
Другие типы данных
- Указатель — хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.
Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данным в программе осуществляется по их именам (идентификаторам).
Идентификатор — это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a — z, A — Z, цифры 0 — 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.
Несмотря на то, что допускается имя, имеющее до 32 символов, определяющее значение имеют только первые 8 символов. Помимо имени, все данные имеют тип. Указание типа необходимо для того, чтобы было известно, сколько места в оперативной памяти будет занимать данный объект.
Компилятор языка Си придерживается строгого соответствия прописных и строчных букв в именах идентификаторов и лексем.
Верно | Неверно |
int a = 2, b; b = a+3; |
Целочисленные данные
Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.
Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n -1, где n-количество занимаемых битов.
Знаковые целые числа представляются в диапазоне -2 n-1 …+2 n-1 -1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).
Основные типы и размеры целочисленных данных:
Количество бит | Беззнаковый тип | Знаковый тип |
8 | unsigned char 0…255 |
char -128…127 |
16 | unsigned short 0…65535 |
short -32768…32767 |
32 | unsigned int | int |
64 | unsigned long int | long int |
Вещественные данные
Вещественный тип предназначен для представления действительных чисел. Вещественные числа представляются в разрядной сетке машины в нормированной форме.
Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как
12345,678 = 1,2345678·10 4
Число 0,009876 в нормированной форме можно представить как
0,009876 = 9,876·10 -3
В двоичной системе счисления значащий разряд, стоящий перед разделителем целой и дробной части, может быть равен только 1. В случае если число нельзя представить в нормированной форме (например, число 0), значащий разряд перед разделителем целой и дробной части равен 0.
Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа .
В общем случае вещественное число в разрядной сетке вычислительной машины можно представить в виде 4 полей.
- знак — бит, определяющий знак вещественного числа (0 для положительных чисел, 1 — для отрицательных).
- степень — определяет степень 2, на которую требуется умножить число в нормированной форме. Поскольку степень 2 для числа в нормированной форме может быть как положительной, так и отрицательной, нулевой степени 2 в представлении вещественного числа соответствует величина сдвига, которая определяется как 2 n -1, где n — количество разрядов, отводимых для представления степени числа.
- целое — бит, который для нормированных чисел всегда равен 1, поэтому в некоторых представлениях типов этот бит опущен и принимается равным 1.
- мантисса — значащие разряды представления числа, стоящие после разделителя целой и дробной части в нормированной форме.
Различают три основных типа представления вещественных чисел в языке Си:
Тип | Обозна- чение в Си |
Кол-во бит | Биты степени | Мантисса | Сдвиг |
простое | float | 32 | 30…23 | 22…0 | 127 |
двойной точности | double | 64 | 62…52 | 51…0 | 1023 |
двойной расширен- ной точности | long double | 80 | 78…64 | 62…0 | 16383 |
Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:
Пример : представить число -178,125 в 32-разрядной сетке (тип float ).
Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:
178,12510 = 10110010,0012=1,0110010001·2 111
Для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).
Для определения степени числа применяем сдвиг:
0111111+00000111 = 10000110.
Таким образом, число -178,125 представится в разрядной сетке как
Символьный тип
Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char .
Подробнее о кодировке символов
Логический тип
Логический тип применяется в логических операциях, используется при алгоритмических проверках условий и в циклах и имеет два значения:
- истина — true
- ложь — — false
В программе должно быть дано объявление всех используемых данных с указанием их имени и типа. Описание данных должно предшествовать их использованию в программе.
Пример объявления объектов
Источник: prog-cpp.ru