Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная работа информатика зИФСТ.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
709 Кб
Скачать
☆

Ввод-вывод целых чисел

Функции и объекты стандартных потоков ввода/вывода могут, в частности, вводить и выводить целые числа, представленные в десятичной, восьмеричной и шестнадцатеричной системах счисления. При этом происходят некоторые преобразования, связанные с различной формой представления целого в памяти (внутренняя) и устройствах символьного ввода-вывода (внешняя форма представления).

int a

char s[20]

1052 (0x041C)

'1'

'0'

'5'

'2'

….

'\0'

Внутренняя форма Внешняя форма

представления числа представления числа

Так, при выводе на экран или вводе с клавиатуры целое число представлено строкой символов в виде последовательности цифр числа (в нашем примере "1052"). В памяти это же число представлено целой переменной (машинным словом), которое хранит двоичный эквивалент десятичного числа 1052 (в шестнадцатеричной системе -0x041C). Преобразования при вводе и выводе целых чисел заключаются в переходе от символа-цифры к значению целой переменной, соответствующему этой цифре, и наоборот:

char c; int n;

n = c - '0';

c = n + '0';

ВНУТРЕННЯЯ ФОРМА ПРЕДСТАВЛЕНИЯ ЧИСЛА -- представление числа в виде целой (int,long) или вещественной переменной.

По своей природе внутренняя форма представления числа является двоичной. Однако для внешнего наблюдателя это вообще не существенно. Он может считать ее какой угодно, хоть десятичной. Дело в том, что в целом важно, что компьютер производит в этой форме корректные вычисления.

ВНЕШНЯЯ ФОРМА ПРЕДСТАВЛЕНИ ЧИСЛА -- представление числа в виде строки символов – цифр, соответствующих числу в заданной системе счисления.

Таким образом, о системе счисления имеет смысл говорить только во внешней форме представления числа.

Ввод целого числа

В преобразовании используется тот факт, что при добавлении к числу очередной цифры справа старое значение увеличивается в 10 раз и к нему добавляется значение новой цифры, например:

.

Число: '123' '1234'

Значение: 123 1234 = 123 * 10 + 4

Тогда в основе алгоритма лежит итерационный цикл просмотра всех цифр числа слева направо, в котором значение числа на текущем шаге цикла получается умножением на 10 результата предыдущего цикла и добавлением значения очередной цифры:

n = n * 10 + c[i] - '0';

где s[i]-'0' -двоичное значение цифры, представленной символом c[i].

//------Преобразование внешней формы во внутреннюю в 10СС

int StringToInt(char c[])

{

int n,i;

for (i=0; !(c[i]>='0' && c[i]<='9'); i++)

if (c[i]=='\0') return(0); // Поиск первой цифры

for (n=0; c[i]>='0' && c[i]<='9'; i++)

// Накопление целого

n = n * 10 + c[i] - '0'; // "цифра за цифрой"

return n;

}

Вывод двоичного числа

В преобразовании используется тот факт, что значение младшей цифры целого числа n равно остатку от деления его на 10, вторая цифра -остатку от деления на 10 частного n/10 и т.д.. Тогда в основе алгоритма лежит итерационный цикл, в котором на каждом шаге получается значение очередной цифры справа как остаток от деления числа на 10, а само число уменьшается в 10 раз. Поскольку цифры получаются в обратном порядке их размещения в строке, массив символов также необходимо заполнять в обратном порядке. При этом надо либо вычислить заранее количество цифр, либо заполнять лишние позиции слева нулями или пробелами.

//Преобразование внутренней формы во внешнюю в 10СС

void IntToString(char c[], int n)

{ int nn,k;

for (nn=n, k=1; nn!=0; k++, nn/=10); // Подсчет количества

c[k] = '\0'; // цифр числа

for (k--; k >=0; k--, n /= 10) // Получение цифр числа

c[k] = n % 10 + '0'; // в обратном порядке

}