СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Лекция 4 "Программирование на Си"

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Лекция 4 "Программирование на Си"»

 Лекция 4. ПОСЛЕДОВАТЕЛЬНАЯ  ОБРАБОТКА ДАННЫХ

Лекция 4.

ПОСЛЕДОВАТЕЛЬНАЯ ОБРАБОТКА ДАННЫХ

 Задача 4.1. Задана непустая числовая последовательность. Определить, является ли последовательность знакочередующейся. Тест 1.  Вход:  -5 3.1 -2 1 -7    Выход: Знаки чередуются.    Тест2.  Вход:  -5 3.1 2 -1 7    Выход: Знаки не чередуются.   Используем алгоритм 3.3. для обработки последовательности.
  • Задача 4.1. Задана непустая числовая последовательность. Определить, является ли последовательность знакочередующейся.
  • Тест 1. Вход: -5 3.1 -2 1 -7 Выход: Знаки чередуются.

Тест2. Вход: -5 3.1 2 -1 7 Выход: Знаки не чередуются.

  • Используем алгоритм 3.3. для обработки последовательности.

   Одного текущего элемента последовательности недостаточно, будем сохранять два соседних элемента:  xpred – предыдущий элемент последовательности,  x – текущий элемент последовательности.   При обработке последовательности необходимо искать нарушение знакочередования.   Используем дополнительную переменную  flag – признак знакочередования.  flag = 1 - знаки чередуются, 0 – нет,  инициализация: flag =1.

Одного текущего элемента последовательности недостаточно, будем сохранять два соседних элемента:

xpred – предыдущий элемент последовательности, x – текущий элемент последовательности.

При обработке последовательности необходимо искать нарушение знакочередования.

Используем дополнительную переменную flag – признак знакочередования. flag = 1 - знаки чередуются, 0 – нет,

инициализация: flag =1.

/*  Программа 4.1. Знакочередование последовательности чисел  */  #include   void main(void) { float xpred, x;  /* предыдущее и текущее числа    */   int flag = 1;    /* flag = 1 - знаки чередуются, 0 - нет  */  scanf(0) { if (xpred * x = 0) flag = 0; xpred = x; } if (flag) printf ("\n Знаки чередуются. "); else printf ("\n Знаки не чередуются. "); } " width="640"

/* Программа 4.1. Знакочередование последовательности чисел */ #include void main(void)

{ float xpred, x; /* предыдущее и текущее числа */ int flag = 1; /* flag = 1 - знаки чередуются, 0 - нет */

scanf("%f", &xpred) ;

while( scanf("%f", &x)0) { if (xpred * x = 0) flag = 0;

xpred = x; }

if (flag) printf ("\n Знаки чередуются. ");

else printf ("\n Знаки не чередуются. "); }

ПОСЛЕДОВАТЕЛЬНАЯ  ОБРАБОТКА  СИМВОЛОВ

ПОСЛЕДОВАТЕЛЬНАЯ ОБРАБОТКА СИМВОЛОВ

Значением символьного типа является одиночный символ.  В языке C символьные данные рассматриваются как разновидность целых чисел. Числовым значением символа является его код.  В языке C над символами разрешаются не только операции присваивания и сравнения, но и арифметические операции. В международном стандарте ASCII код символа обычно занимает один байт, но иногда и два байта (в международном коде UNICODE).

Значением символьного типа является одиночный символ.

В языке C символьные данные рассматриваются как разновидность целых чисел. Числовым значением символа является его код.

В языке C над символами разрешаются не только операции присваивания и сравнения, но и арифметические операции.

В международном стандарте ASCII код символа обычно занимает один байт, но иногда и два байта (в международном коде UNICODE).

Примеры символьных констант:     ‘*’   ‘a’   ‘5’   ‘n’ Специальные (управляющие) символьные константы:  '\n'    Новая строка (new line),  '\t'  '\v'   Табуляция горизонтальная,        вертикальная,  '\b'    Возврат на шаг (backspace),  '\\'  - \ (обратный слэш) ,  '\''  - ‘ (апостроф) ,  '\
  • Примеры символьных констант: ‘*’ ‘a’ ‘5’ ‘n’
  • Специальные (управляющие) символьные константы:

'\n' Новая строка (new line),

'\t' '\v' Табуляция горизонтальная, вертикальная,

'\b' Возврат на шаг (backspace),

'\\' - \ (обратный слэш) , '\'' - ‘ (апостроф) , '\"' - " (кавычка) ,

'\0' Нулевой символ (байт с нулевым кодом).

  • Объявление символьных переменных char [,]…; или int [,]…; Например: char s, sim = ‘Z’, c;

Кодировка цифровых символов:   '0' = 48  '1' = '0' + 1 = 49  '2' = '0' + 2 = 50  . . .  '9' = '0' + 9 = 57  Отсюда соотношения:  Код цифры = '0' + Значение цифры  Значение цифры = Код цифры - '0' Условие   = '0' && s " width="640"
  • Кодировка цифровых символов:

'0' = 48 '1' = '0' + 1 = 49 '2' = '0' + 2 = 50 . . . '9' = '0' + 9 = 57

  • Отсюда соотношения: Код цифры = '0' + Значение цифры Значение цифры = Код цифры - '0'

Условие "значение символьной переменой s является цифрой" на языке C запишется так:

s = '0' && s

Коды заглавных латинских букв возрастают по алфавиту :     'A' Коды строчных латинских букв возрастают:     'a' Условие  ='A' && s='a' && s " width="640"
  • Коды заглавных латинских букв возрастают по алфавиту : 'A'
  • Коды строчных латинских букв возрастают: 'a'

Условие "значение символьной переменой s является латинской буквой" можно записать так:

(s='A' && s='a' && s

char s; ( или int s; ) Ввод символа из стандартного входного файла (клавиатуры) в переменную s:        scanf (

char s; ( или int s; )

  • Ввод символа из стандартного входного файла (клавиатуры) в переменную s: scanf ("%с", &s);

можно заменить присваиванием s = getchar ();

Функция getchar() вводит очередной символ из стандартного входного файла и возвращает в виде значения код этого символа.

 Ввод символа часто пишется внутри условия в операторах if , while , do - while и for . Например, цикл ввода символов до конца файла      Ввод s;      while(s!= конец файла)      { Обработка s;      Ввод s;      }  может иметь вид while ((s=getchar()) != EOF)  Обработка s;

Ввод символа часто пишется внутри условия в операторах if , while , do - while и for .

  • Например, цикл ввода символов до конца файла Ввод s; while(s!= конец файла) { Обработка s; Ввод s; }

может иметь вид

while ((s=getchar()) != EOF) Обработка s;

 Символическая константа EOF - код конца файла (после нажатия клавиш Ctrl-Z или Ctrl-z, затем Enter). Вывод символа s в  стандартный выходной файл (на экран)       printf (
  • Символическая константа EOF - код конца файла (после нажатия клавиш Ctrl-Z или Ctrl-z, затем Enter).
  • Вывод символа s в стандартный выходной файл (на экран) printf ("%c", s);

эквивалентен оператору putchar (s);

  • Стандартный входной и выходной файлы, вместо клавиатуры и экрана, можно переадресовать на любой файл магнитного диска.

Задача 4.2.  Вывести коды введенных с клавиатуры символов. Последовательность завершается нажатием клавиши Esc. Тест. Вход: Kazan 2007     Выход: K= 8 2, a=97, z=122, a=97, n= 110, =32, 2=50, 0=48, 0=48, 7=55,  = 27
  • Задача 4.2. Вывести коды введенных с клавиатуры символов. Последовательность завершается нажатием клавиши Esc.
  • Тест. Вход: Kazan 2007 Выход: K= 8 2, a=97, z=122, a=97, n= 110, =32, 2=50, 0=48, 0=48, 7=55,  = 27

/*  Программа 4.2. Коды символов    */  #include   #include   main()  { int sim;  printf(
  • /* Программа 4.2. Коды символов */ #include #include

main() { int sim; printf("\n Введи текст, завершив клавишей Esc\n");

do { sim=getch(); putchar(sim);

printf("=%d, ",sim); } while( sim!=27);

puts(" Нажми любую клавишу"); getch(); return 0; }

Подсчет строк, слов и символов  Задача 4.3. Составить программу подсчета во входном тексте количества строк, слов и символов.    Словом считается любая последовательность символов, не содержащая пробелов, символов табуляции и новой строки. Строка заканчивается символом новой строки.  Тест.  Вход:  Если друг оказался вдруг  И не друг, и не враг, а так.   Выход:  Строк: 2, слов: 12, символов: 53.   Количество символов считаем сразу после ввода, количество строк – по количеству символов ‘\n’, а количество слов – при вводе символа не разделителя, перед которым был разделитель. Используем для этого флаг разделителя.

Подсчет строк, слов и символов

  • Задача 4.3. Составить программу подсчета во входном тексте количества строк, слов и символов.

Словом считается любая последовательность символов, не содержащая пробелов, символов табуляции и новой строки. Строка заканчивается символом новой строки.

  • Тест. Вход: Если друг оказался вдруг И не друг, и не враг, а так.

Выход: Строк: 2, слов: 12, символов: 53.

Количество символов считаем сразу после ввода, количество строк – по количеству символов ‘\n’, а количество слов – при вводе символа не разделителя, перед которым был разделитель. Используем для этого флаг разделителя.

switch (переключить) - оператор переключателя для организации многовариантного ветвления.    switch (выражение)  { [ case цел-конст-выраж: [оператор...]]...  [ default : оператор...]  [ case цел-конст-выраж: [оператор...]]...  } case (случай) - вариант ветвления , можно пометить целой или символьной константой (или константным выражением).  Вычисляется значение выражения. Переключатель осуществляет переход к одному из вариантов case, константное выражение которого совпадает с вычисленным значением, или к метке default (умолчание), если не совпадает ни с одной из констант вариантов ветвления.  Каждый вариант обычно заканчивается оператором break.
  • switch (переключить) - оператор переключателя для организации многовариантного ветвления.

switch (выражение) { [ case цел-конст-выраж: [оператор...]]... [ default : оператор...] [ case цел-конст-выраж: [оператор...]]... }

  • case (случай) - вариант ветвления , можно пометить целой или символьной константой (или константным выражением).

Вычисляется значение выражения. Переключатель осуществляет переход к одному из вариантов case, константное выражение которого совпадает с вычисленным значением, или к метке default (умолчание), если не совпадает ни с одной из констант вариантов ветвления.

Каждый вариант обычно заканчивается оператором break.

/* Программа 4.3.  Подсчет строк, слов и символов  */ /* текст  ::= символ…      */  /* символ  ::= разделитель | символ-слова   */  /* разделитель ::= пробел | новая-строка | табуляция   */  /* | конец-файла     */  /* символ-слова - любой символ, кроме разделителей  */ #include  #define DA 1  #define NET 0 void main ()  { int sim;  /* Текущий символ (int для EOF)  */  int kstr, ksl, ksim;  /* Кол-во строк, слов и символов  */  int razdel;   /* Флаг символа - разделитель   */  razdel = DA;   /* 1-й символ текста - начальный  */

/* Программа 4.3. Подсчет строк, слов и символов */

/* текст ::= символ… */ /* символ ::= разделитель | символ-слова */ /* разделитель ::= пробел | новая-строка | табуляция */ /* | конец-файла */ /* символ-слова - любой символ, кроме разделителей */

#include

#define DA 1 #define NET 0

void main () { int sim; /* Текущий символ (int для EOF) */ int kstr, ksl, ksim; /* Кол-во строк, слов и символов */ int razdel; /* Флаг символа - разделитель */

razdel = DA; /* 1-й символ текста - начальный */

kstr = ksl = ksim = 0;  while ((sim = getchar()) != EOF)  {  ksim++;  switch (sim)  {  case '\n':  kstr++;        razdel = DA; break;   /* Эту строчку можно убрать!  */  case ' ':  case '\t':  razdel = DA; break;  default:    /* Символ слова не разделитель */  if (razdel)   /* Предыдущий символ - разделитель */  { ksl++; razdel = NET; }  }  }  printf (

kstr = ksl = ksim = 0;

while ((sim = getchar()) != EOF) { ksim++;

switch (sim) {

case '\n': kstr++; razdel = DA; break; /* Эту строчку можно убрать! */

case ' ': case '\t': razdel = DA; break;

default: /* Символ слова не разделитель */ if (razdel) /* Предыдущий символ - разделитель */ { ksl++; razdel = NET; }

} }

printf ("Строк: %d, слов: %d, символов %d. \n", kstr, ksl, ksim); }