Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Контроль правильности ввода




Состояние потока ввода можно проверить следующим образом:

Чтобы программа могла определить, как прошла операция ввода-вывода, каждый поток (в том числе стандартный) в каждый момент времени имеет связанное с ним состояние (находится в некотором состоянии):

· состояние good означает, что во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операция ввода-вывода, в остальных случаях следующая операция выполнена не будет;

· состояние fail означает, что операция завершилась неудачно, операции обмена не выполняются, однако поток не испорчен и никакие символы не потеряны; состояние устанавливается обычнопри ошибках форматирования в процессе чтения (например, попытке прочитать целое число, а символ оказывается недопустимым); поток из этого состояния можно вернуть в нормальное состояние с помощью метода clear() (например: if(stream. fail()) stream. clear(); 

· состояние bad – «тяжелое»; состояния fail и bad являются состояниями ошибки потока и операции обмена не выполняются; состояние bad включает в себя состояние fail;

· состояние hardfail означает фатальную ошибку;

· состояние eof может возникнуть только при операции чтения; для стандартного потока ввода это состояние возникает при нажатии Ctrl+Z; для файлов это состояние устанавливается при первой попытке чтения после последнего байта файла, при этом поток переводится в состояние fail;

-----------------------------------------------------------------------------------------

 

//пример 79.

while (cin >> i) cout << i << endl;
     //неявный вызов оператора проверки состояния потока
      // true возвращается в случае успешной операции

или

while ((cin >> i), cin.good())   //явный вызов функции cin.good()

                 cout << i << endl;

 

Уточнить ошибку поможет наличие после указанного оператора цикла следующих операторов:

if (cin.bad())

cout << "badbit set" << endl;

else if (cin.fail())

cout << "failbit set" << endl;

else if (cin.eof())

cout << "End of file" << endl;

-----------------------------------------------------------------------------------------

 

//пример 80.

//сложение двух чисел с проверкой правильности их ввода

 

#include <iostream>                                   

#include <conio.h>

using namespace std;

 

int main()         

 

{

Int integer1, integer2, sum;

                                                

cout << "Input chislo 1\n ";  

if ( cin >> integer1, cin.good() )

{

 cout << " Input chislo 2\n ";

  if ( cin >> integer2, cin.good() )

     {

 sum = integer1 + integer2;

      cout << "sum = " << sum << endl;

      }

      else {

        cout << "chislo 2?" << endl;

       _getch();

        return 1;

  }

}

else {

   cout << "chislo 1?" << endl;

   _getch();

   return 2;

}

 

_getch();                                                          

return 0;

 }

 

Результаты работы:

Input chislo 1

 11

Input chislo 2

 22

sum = 33

Input chislo 1

 11

Input chislo 2

 ff

chislo 2?

 

Input chislo 1

 ff

chislo 1?

-----------------------------------------------------------------------------------------

//пример 81.

У состояния потока есть одна особенность – если в нем установился какой-то из «нехороших» битов, то он сам по себе не сбросится, и любая операция ввода-вывода с этим потоком будет в дальнейшем проигнорирована. Поэтому, если нужно продолжить ввод после анализа ошибки, то надо сначала очистить флаги специальной функцией clear(), аргументом которой по умолчанию является состояние потока goodbit:

if (cin.bad()) {

cin.clear(); // очищаем флаги

cin. sync (); // очищаем поток   

cin >> i; // пытаемся повторить ввод

}

 

или:

int main()

{

Int i;

while (true) //бесконечный цикл

  {

cout << "input int" << endl;

cin >> i;

if (cin.good())  //если нет ошибок при вводе

    { //……

break;     //выход из бесконечного цикла              

  }

cin.clear();   //если ошибка при вводе, очищаем флаги

cout << "error" << endl;

cin.ignore(10, '\n'); //функция извлекает оставшиеся символы из потока,
     // ее параметры: 10- количество удаляемых символов (1–по умолчанию),
     //’\n’ – символ-ограничитель – тоже удаляется из потока,
     //по умолчанию символ-ограничитель – конец файла

  }

cout << i << endl;

_getch();

return 0;

 }

-----------------------------------------------------------------------------------------

Перекодировка кириллицы

//пример 82.

int main()

{

     //кодовая таблица 866 – MS-DOS 

char * d = " Минск ";             

    

cout << d << endl;           //╠шэёъ                 

 

cout << char('\x80') << endl; //A, код в 16 с/с

cout << char('\200') << endl; //A, код в 8 с/с

_getch();     

return 0;

 }

-----------------------------------------------------------------------------------------

 

//пример 83.

#include <locale.h>  

int main()

{    // кодовая таблица 1251 – MS Windows

setlocale(LC_ALL, ".1251");      // или setlocale(LC_ALL, "rus");

    

char * d = " Минск ";            

    

cout << d << endl;           //Минск         

cout << char('\xC0') << endl; //A, код в 16 с/с

cout << char('\300') << endl; //A, код в 8 с/с

_getch();     

return 0;

 }

-----------------------------------------------------------------------------------------

//пример 84.    

#include <clocale>

int main()

{        

setlocale(LC_ALL, ".1251");

    

char * d = " Минск ";            

    

cout << d << endl;           //Минск         

cout << char('\xC0')<< endl; //A, код в 16 с/с

cout << char('\ 0 300') << endl; // 0, код в 8 с/с (error!!!)

                                 // неверное задание кода символа

_getch();     

return 0;

 }

-----------------------------------------------------------------------------------------

//пример 85.

#include <locale.h>   

int main()

{    // кодовая таблица 1251 – MS Windows

setlocale(LC_ALL, ".1251");

    

char * d = " Минск ";

               

cout << d << endl;           //Минск                 

 

cout << char('\xA1') << endl; //Ў, код в 16 с/с

cout << char('\241') << endl; // Ў, код в 8 с/с

_getch();     

return 0;

 }

-----------------------------------------------------------------------------------------

 

Кодовые таблицы

Исторически сложилось так, что первые разработчики компьютеров были носителями английского языка. Для вывода информации им требовалось: 26 букв английского алфавита (строчных), 26 прописных, 9 знаков препинания (.,:! ";? ()), пробел, 10 цифр, 5 знаков арифметических действий (+,-,*, /, ^) и специальные символы (№ % _ # $, и так далее ^, &, >, <, |, \). Получается чуть больше 100 символов. Такой сравнительно небольшой базовый набор символов можно закодировать набором двоичных чисел от 0 до 27 (всего 128 позиций), при помощи таблиц соответствия этого набора машинным кодам (фактически, двоичным числам), что и было сделано. Таблица соответствия была названа ASCII (A merican S tandard C ode for I nformation I nterchange, произносим «аскей»).

Однако базового набора кодов стало быстро не хватать, что потребовало расширения таблицы ASCII. Из соображений удобства кодирования и из технических соображений при представлении символов стали пользоваться равномерными кодами, т.е. двоичными группами из 8 двоичных знаков (1 символ – 1 байт) – получили 28 = 256 двоичных символов (256 комбинаций двоичных символов 0 и 1). В результате возникла новая таблица кодировок, получившая название «расширенная таблица ASCII».

Эта система является международной (общепринятой) только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран. В рамках таблицы ASCIIсоздание многоязычных документов являлось проблематичной, а в большинстве случаев и невыполнимой задачей.

Программист, используя в программах, выполняемых в консольном режиме, строковые и символьные константы с русскими буквами, сталкивается с проблемой различия кодировок. В консольном режиме примеряется ОЕМ-кодировка, в которой для представления символов со значениями кодов 128-255 используется кодовая таблица 866 – MS DOS. В программах, исполняемых и создаваемых под управлением MS Windows, применяется для тех же символов кодовая таблица 1251 (ANSI-кодировка). Поэтому текст с русскими буквами (их коды находятся в диапазоне 128-255), подготовленный в редакторе MS Windows, нельзя правильно отобразить в консольном окне – нужна перекодировка из MS Windows в MS DOS и обратно.

Рассмотрим структуру таблицы ASCII. Для удобства символы в ней пронумерованы и в шестнадцатеричной системе счисления от 0 - 7F. Первые знакоместа в таблице занимают непечатаемые символы (0 до 7F), затем следуют печатаемые символы (20 - 7F).

 

Таблица 1. ASCII-Коды (символы с кодами 0-127)

 


dec hex char dec hex char dec hex char
0 0   46 2E . 92 5C \
1 1   47 2F / 93 5D ]
2 2   48 30 0 94 5E ^
3 3   49 31 1 95 5F _
4 4   50 32 2 96 60 '
5 5   51 33 3 97 61 a
6 6   52 34 4 98 62 b
7 7 звонок 53 35 5 99 63 c
8 8   54 36 6 100 64 d
9 9   55 37 7 101 65 e
10 A перевод строки 56 38 8 102 66 f
11 B   57 39 9 103 67 g
12 C   58 3A : 104 68 h
13 D возврат каретки 59 3B ; 105 69 i
14 E   60 3C < 106 6A j
15 F   61 3D = 107 6B k
16 10   62 3E > 108 6C l
17 11   63 3F ? 109 6D m
18 12   64 40 @ 110 6E n
19 13   65 41 A 111 6F o
20 14   66 42 B 112 70 p
21 15   67 43 C 113 71 q
22 16   68 44 D 114 72 r
23 17   69 45 E 115 73 s
24 18   70 46 F 116 74 t
25 19   71 47 G 117 75 u
26 1A   72 48 H 118 76 v
27 1B   73 49 I 119 77 w
28 1C   74 4A J 120 78 x
29 1D   75 4B K 121 79 y
30 1E   76 4C L 122 7A z
31 1F   77 4D M 123 7B {
32 20 пробел 78 4E N 124 7C ¦
33 21 ! 79 4F O 125 7D }
34 22 '' 80 50 P 126 7E ~
35 23 # 81 51 Q 127 7F del
36 24 $ 82 52 R      
37 25 % 83 53 S      
38 26 & 84 54 T      
39 27 ' 85 55 U      
40 28 ( 86 56 V      
41 29 ) 87 57 W      
42 2A * 88 58 X      
43 2B + 89 59 Y      
44 2C , 90 5A Z      
45 2D - 91 5B [      

 

 

 


Таблица 2. Кодовая таблица 866 – MS-DOS

 (символы с кодами 127-255)

dec hex char dec hex char dec hex char dec hex char dec hex char dec hex char
128 80 А 150 96 Ц 172 AC м 193 C1 214 D6 235 EB ы
129 81 Б 151 97 Ч 173 AD н 194 C2 215 D7 236 EC ь
130 82 В 152 98 Ш 174 AE о 195 C3 216 D8 237 ED э
131 83 Г 153 99 Щ 175 AF п 196 C4 217 D9 238 EE ю
132 84 Д 154 9A Ъ 176 B0 - 197 C5 218 DA 239 EF я
133 85 Е 155 9B Ы 177 B1 - 198 C6 219 DB 240 F0 Ё
134 86 Ж 156 9C Ь 178 B2 - 199 C7 220 DC 241 F1 ё
135 87 З 157 9D Э 179 B3 200 C8 221 DD 242 F2
136 88 И 158 9E Ю 180 B4 201 C9 222 DE 243 F3
137 89 Й 159 9F Я 181 B5 202 CA 223 DF 244 F4
138 8A К 160 A0 а 182 B6 203 CB 224 E0 р 245 F5
139 8B Л 161 A1 б 183 B7 204 CC 225 E1 с 246 F6 +
140 8C М 162 A2 в 184 B8 205 CD 226 E2 т 247 F7
141 8D Н 163 A3 г 185 B9 206 CE 227 E3 у 248 F8  
142 8E О 164 A4 д 186 BA 207 CF 228 E4 ф 249 F9  
143 8F П 165 A5 е 187 BB 208 D0 229 E5 х 250 FA
144 90 Р 166 A6 ж 188 BC 209 D1 230 E6 ц 251 FB
145 91 С 167 A7 з 189 BD 210 D2 231 E7 ч 252 FC n
146 92 Т 168 A8 и 190 BE 211 D3 232 E8 ш 253 FD 2
147 93 У 169 A9 й 191 BF 212 D4 233 E9 щ 254 FE
148 94 Ф 170 AA к 192 C0 213 D5 234 EA ъ 255 FF  
149 95 Х 171 AB л                        

 

 

Таблица 3. Кодовая таблица 1251 – MS Windows

 (символы с кодами 127-255, даны выборочно)

 

dec hex char dec hex char dec hex char dec hex char dec hex char dec hex char

128 80   150 96   172 AC   193 C1 Б 214 D6 Ц 235 EB л

129 81   151 97   173 AD - 194 C2 В 215 D7 Ч 236 EC м

130 82   152 98   174 AE ® 195 C3 Г 216 D8 Ш 237 ED н

131 83   153 99   175 AF Ï 196 C4 Д 217 D9 Щ 238 EE о

132 84   154 9A   176 B0 º 197 C5 Е 218 DA Ъ 239 EF п

133 85   155 9B   177 B1 ± 198 C6 Ж 219 DB Ы 240 F0 р

134 86   156 9C   178 B2 199 C7 З 220 DC Ь 241 F1 с

135 87   157 9D   179 B3 i 200 C8 И 221 DD Э 242 F2 т

136 88   158 9E   180 B4 r 201 C9 Й 222 DE Ю 243 F3 у

137 89   159 9F   181 B5 μ 202 CA К 223 DF Я 244 F4 ф

138 8A   160 A0   182 B6 203 CB Л 224 E0 а 245 F5 х

139 8B   161 A1 Ў 183 B7 . 204 CC М 225 E1 б 246 F6 ц

140 8C   162 A2 ў 184 B8 ë 205 CD Н 226 E2 в 247 F7 ч

141 8D   163 A3 J 185 B9 206 CE О 227 E3 г 248 F8 ш

142 8E   164 A4   186 BA ε 207 CF П 228 E4 д 249 F9 щ

143 8F   165 A5 ¤ 187 BB » 208 D0 Р 229 E5 е 250 FA ъ

144 90   166 A6 ¦ 188 BC j 209 D1 С 230 E6 ж 251 FB ы

145 91   167 A7 § 189 BD S 210 D2 Т 231 E7 з 252 FC ь

146 92   168 A8 Ё 190 BE s 211 D3 У 232 E8 и 253 FD э

147 93   169 A9 © 191 BF ï 212 D4 Ф 233 E9 й 254 FE ю

148 94   170 AA Є 192 C0 А 213 D5 Х 234 EA к 255 FF я

149 95   171 AB «              

 

 

 䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü  䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü  䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü
                                           

 

 

Литература

 

  1. Лафоре Р. Объектно-ориентированное программирование на С++. Классика Computer Science/ 4-е изд –СПб.: Питер, 2007. – 928с.
  2. Павловская Т.А. С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2005. – 461с.
  3. Подбельский В.В. Стандартный С++: учеб.пособие. - М.: Финансы и статистика, 2008. – 688с.
  4. Дейтел Харви, Дейтел Пол. Как программировать на С++: Пер. с англ. – М.: ЗАО «Издательство БИНОМ», 1998г. – 1024с.
  5. Шилдт Г. Искусство программирования на С++. – СПб.:БХВ – Петербург, 2005. – 496с.
  6. Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. –
    СПб.: Питер, 2007. – 239с.
  7. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование:
    Практикум. – СПб.: Питер, 2008. – 265с.
  8. Шиманович Е.Л. С/С++ в примерах и задачах. Минск, ООО «Новое знание», 2004, –528с.
  9. Буч Г. Объектно – ориентированный анализ и проектирование. Москва, Бином, 2000.
  10. Стрикелева Л.В. Конспект лекций (в электронном виде). 2017 год!!!
  11. Стрикелева Л.В. Для каждой лабораторной работы (в электронном виде):
                           задания, методические указания. 201 7 год!!!
  12. Стрикелева Л.В. Тесты в среде E- University

 





Поделиться с друзьями:


Дата добавления: 2018-10-15; Мы поможем в написании ваших работ!; просмотров: 200 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Свобода ничего не стоит, если она не включает в себя свободу ошибаться. © Махатма Ганди
==> читать все изречения...

4395 - | 4095 -


© 2015-2026 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.