Пятница, 17.05.2024, 17:32
Приветствую Вас, Гость

БИЛЕТ 20.

1) Функции getch() и ungetch(c)

Как работают функции getch и ungetch? Во многих случаях программа не может "сообразить", прочла ли она все, что требуется, пока не прочтет лишнего. Так, накопление числа производится до тех пор, пока не встретится символ, отличный от цифры. Но это означает, что программа прочла на один символ больше, чем нужно, и последний символ нельзя включать в число.

Эту проблему можно было бы решить при наличии обратной чтению операции "положить-назад", с помощью которой можно было бы вернуть ненужный символ. Тогда каждый раз, когда программа считает на один символ больше, чем требуется, эта операция возвращала бы его вводу, и остальная часть программы могла бы вести себя так, будто этот символ вовсе и не читался. К счастью, описанный механизм обратной посылки символа легко моделируется с помощью пары согласованных друг с другом функций, из которых getch поставляет очередной символ из ввода, a ungetch отправляет символ назад во входной поток, так что при следующем обращении к getch мы вновь его получим.

Нетрудно догадаться, как они работают вместе. Функция ungetch запоминает посылаемый назад символ в некотором буфере, представляющем собой массив символов, доступный для обеих этих функций; getch читает из буфера, если там что-то есть, или обращается к getchar, если буфер пустой. Следует предусмотреть индекс, указывающий на положение текущего символа в буфере.

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

#define BUFSIZE 100

char buf[BUFSIZE];    /* буфер для ungetch */

int bufp = 0;         /* след. свободная позиция в буфере */

int getch(void)       /* взять (возможно возвращенный) символ */

{ return (bufp > 0) ? buf[--bufp] : getchar();

}

void ungetch(int c)   /* вернуть символ на ввод */

{  if (bufp >= BUFSIZE)

        printf("ungetch: слишком много символов\n");

    else

        buf[bufp++] = с;

}

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

 

2) Операторы typedef и sizeof

Оператор typedef. Для определения типа применяется оператор typedef. Синтаксически оператор typedef аналогичен обычному описанию переменной, к которому в самом начале добавлено слово typedef. При этом вместо переменной определяется имя нового типа.

Чаще всего определение типов с помощью typedef используют, когда описание типа достаточно громоздко. Оператор typedef позволяет задать его только один раз, что облегчает исправление программы при необходимости.

Например, следующая строка определяет тип callback как указатель на функцию с одним целым параметром, возвращающую значение логического типа:

typedef bool (*callback)(int);

Строка, описывающая три переменные p, g, r,

callback p, q, r;

эквивалентна строке

bool (*p)(int), (*q)(int), (*r)(int);

но первая строка, конечно, понятнее и нагляднее.

Оператор sizeof. Дает размер операндов байта. Если операнд массив, то дает кол-во байтов в массиве.

in day [] = {31,28,31};

int n=sizeof(day) / sizeof(int);

int s [] = "Hello”;

int l=sizeof(s);

char*s=”Hello”;


*************************************20 - 3

Ввести произвольный текст. Найти среднюю длину слов в нем.


#include<stdio.h>

#include<conio.h>

char text[]="Neverwinter Nights is the real RPG, that is built with D&D principes...";

float i,i_temp=0,kol=0,len_real;

int n=sizeof(text)/sizeof(char);

float result;

void main()

{

clrscr();

for (i=0; i < n; i++)

    {

     if (text[i] == ' ' || text[i] == ':' || text[i] == ';' || text[i] == ',' || text[i] == '.' || text[i] == '!' || text[i] == '?')

            {

             if (text[i] == ' ')

                {

                 kol++;

                 len_real += i-i_temp;

                 i_temp=i+1;

                }

             else

                 len_real -= 1;

            }

    }

i_temp++;

kol++;

len_real += i-i_temp;

result=len_real/kol;

printf("%f",result);

getch();

}


*************************************20 - 4

Написать программу, которая выводит на экран таблицу умножения на k (k вводится с клавиатуры).


#include<conio.h>

#include<stdio.h>

int k,i,rez;

void main()

{

 clrscr();

 scanf("%d",&k);

 for (i=1;i<=9;i++)

     {

      rez = i*k;

      printf ("%d * %d = %d\n",i,k,rez);

     }

 getch();