Вещественные типы данных языка Паскаль
Одинарный (single) 4 10-45 - 1038 7 или 8
Вещественный (real) 6 10-39 - 1038 11 или 12
Двойной (double) 8 10-324 – 10308 15 или 16
Расширенный (extended) 10 10-4932 - 104932 19 или 20
Цикл while. Сравните с аналогичным оператором цикла в Паскале.
Конструкция оператора цикла начинается со служебного слова while (от англ. – пока):
while(условие) {Q1; Q2;...}
Вход в такой цикл начинается с проверки условия, заданного в круглых скобках. Если это условие истинно, то тело цикла (операторы Q1, Q2,…) выполняется. В случае невыполнения условия тело цикла обходится. С помощью оператора while тоже можно организовать суммирование элементов массива:
s=0; i=0;
while(i<10)
{ s=s+a[i]; i++; }
Паскаль
while(a>=c) do
begin
...
end;
Билет 4
Данные символьного типа. Массивы типа char и понятие строки в языке Си. Чем строки Си отличаются от данных типа string в Паскале. Ввод и вывод символов и строк.
Языки C, C++ разделяют текстовые данные на примитивы, значением которых являются одиночные символы (символьные данные) и последовательности примитивов в виде цепочек символов, завершающихся установленным признаком конца (строковые данные). Символьные данные могут быть представлены как скалярными величинами (символьные константы, символьные переменные), так и массивами таких данных
Одиночным символьным данным (константам и переменным) в оперативной памяти ЭВМ выделяется по одному байту, в которых хранятся соответствующие значения – числовые коды конкретных символов в соответствии с их кодировкой в той или иной странице. Значения однобайтовых символьных констант заключаются в одинарные кавычки и могут быть заданы тремя способами. Первый распространяется на отображаемые символы таблицы ASCII (см. рис. 5.1) и заключается в том, что отображаемый символ заключается в одинарные кавычки:
'F', '%', '$', 'ы', '5', '+', '"', 'q', 'Я', ' '
Последняя константа в приведенном перечислении соответствует пробелу. Сам символ апострофа таким образом "закодировать" нельзя.
Второй способ заключается в записи шестнадцатеричного кода символа после знака "обратный слэш":
'\x27' (код символа "апостроф", 39)
'\x5C' (код символа \, 92)
Обратите внимание на то, что шестнадцатеричный код записывается без лидирующего нуля (в отличие от записи числовых шестнадцатеричных констант). Так можно записать любой управляющий код, расположенный в начале таблицы ASCII. Однако в языках C, C++ чаще используются Escape-последовательности, о которых речь шла при управлении выводом (см. табл. 4.6). Вот несколько примеров:
'\'' – символ "апостроф"
'\\' – символ "обратный слэш"
Третий способ заключается в записи восьмеричного кода символа после знака "обратный слэш":
'\47' (код символа "апостроф", 39)
'\134' (код символа \, 92)
Обратите внимание на то, что восьмеричный код записывается без лидирующего нуля (в отличие от записи числовых восьмеричных констант) и должен принадлежать диапазону [0, 377].
Символьные переменные объявляются с помощью спецификаторов char или
unsigned char. Одновременно их можно проинициализировать тем или иным способом:
char ch1='Я',ch2='\x9F',ch3='\237',ch4= 0x9F,ch5=0237,ch6=159;
Значения строковых констант или начальные значения строковых "переменных" в отличие от символьных данных заключаются в двойные кавычки:
const char c1[]="ABCDEFGH";
char str1[]="1234";
char letter[]="a";
char symbol='a';
Байт с нулевым кодом система автоматически добавляет вслед за последним символом строки. Поэтому для символьного массива c1 будет выделено 9 байтов, а для символьного массива str1 – 5 байтов. Обратите внимание на то, что массив letter занимает в памяти 2 байта, тогда как символьная переменная symbol – 1 байт. Так как строка представлена одномерным массивом символов, то доступ к каждому ее символу осуществляется самым обычным способом:
c1[3] – четвертый символ в массиве c1 (т.е. буква 'D')
str1[0] – первый символ в массиве str1 (т.е. цифра '1')
Значение любого символа в строковой "переменной" можно изменить во время работы программы:
str1[3]='L';
Ввод текстовых данных во время работы программы
Форматный ввод
Список форматных указателей функции scanf предусматривает возможность ввода значений односимвольных (%c) и многосимвольных (%s) переменных:
#include <stdio.h>
void main()
{ char ch1,ch2;
char str1[10];
scanf("%c %c",&ch1,&ch2);
scanf("%s",str1);
....................
Обратите внимание на то, что для ввода данных в скалярные переменные ch1 и ch2 в списке ввода необходимо указывать их адреса (&ch1, &ch2), а при вводе в массив str1 – достаточно написать его имя. Дело в том, что имя массива одновременно выполняет роль адреса своего первого элемента. Поэтому str1 и &str1[0] указывают на один и тот же адрес.
Ввод значений символьных переменных ch1 и ch2 можно организовать одним из двух способов. Во-первых, в строке ввода можно набрать два требуемых символа либо слитно, либо разделяя их хотя бы одним пробелом и нажать клавишу Enter. Во-вторых, можно набрать первый символ, предназначенный для переменной ch1, и нажать клавишу Enter. Затем повторить аналогичным образом ввод следующего символа.
Значение, предназначенное для строковой "переменной" str1, не должно содержать более 9 символов (признак конца строки система добавляет автоматически) и среди них не должен присутствовать пробел. Дело в том, что пробел при форматном вводе воспринимается как разделитель данных. Это не означает, что среди символов строки пробел вообще не допустим, просто для организации ввода в строку нескольких слов надо использовать другие средства.
Довольно неожиданно, но с помощью задания ширины поля ввода и одного форматного указателя %с можно за один прием ввести несколько символов в элементы символьного массива:
char q[20];
............
scanf("%20c",q); //ввод 20 символов в массив q
В отличие от ввода по форматному указателю %s в массив q здесь не записывается признак конца строки – вводятся только запрашиваемые символы, которые набираются в одной строке с последующим нажатием клавиши Enter.
Функция scanf предусматривает еще два интересных форматных указателя, которые обеспечивают ввод либо тех символов, которые указаны в заданном множестве, либо всех символов, которые не принадлежат заданному множеству. Например, для ввода цифр из диапазона от 0 до 9 такой указатель имеет вид %[0-9], а для ввода символов, не являющихся цифрами – %[^0-9]. Рассмотрим следующий пример, который не только демонстрирует ввод по таким форматным указателям, но и содержит непредвиденный пассаж, связанный с использованием "грязного" буфера ввода.
#include <stdio.h>
#include <conio.h>
void main()
{ char str[10];
int j;
printf("Enter 123ABC\n");
scanf("%[0-9]",str);
printf("str=%s\n",str);
for(j=0; j<10; j++)
printf("%3x",str[j]);
printf("\nEnter DEF123\n");
scanf("%[^0-9]",str);
printf("str=%s\n",str);
for(j=0; j<10; j++)
printf("%3x",str[j]);
getch();
}
//=== Результат работы ===
Enter 123ABC
str=123
31 32 33 0 0 1 0 0 1 0
Enter DEF123
str=ABC
DEF
41 42 43 a 44 45 46 0 1 0
После ввода первой строки программе были переданы символы '123', вслед за которыми в массив str был записан нулевой байт – признак конца строки. Однако в буфере ввода остались невостребованными символы 'ABC' и код клавиши Enter (код 0xa). После набора второй строки к содержимому буфера ввода добавились еще три символа 'DEF' и т.к. все семь первых символов не являются кодами цифр, то все они были переданы в массив str. При выводе первые три отобразились в одной строке, затем сработал управляющий код 0xa и три следующие символа были выведены в следующей строке. Для наглядности содержимое массива после каждого вывода по формату %s отображалось еще и в шестнадцатеричном формате. Значения байтов, начиная с str[4], объясняются тем, что массив str является локальным, и под него выделяется "грязная память". Если его описание вынести за пределы main, то он станет глобальным и будет расписан нулями.
Чтобы не пострадать от непредвиденного ввода символов, задержавшихся в буфере ввода, рекомендуется после обращения к функции scanf чистить буфер ввода с помощью функции fflush(stdin). Если бы мы включили в предыдущий пример обращение к функции fflush, то после ввода второй строки в массиве str оказались бы только символы 'DEF' .
Потоковый ввод
Потоковый ввод в символьные и "строковые" переменные организуется следующим образом:
#include <iostream.h>
void main()
{ char ch1,ch2;
char str1[10];
cin >> ch1 >> ch2;
cin >> str1;
....................
Набор вводимой информации на клавиатуре осуществляется точно таким же образом, как и при форматном вводе.