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

БИЛЕТ 10.

1.     Препроцессор языка С++.

   "ПРЕПРОЦЕССОР - это специальный блок транслятора (или специальная программа), подготавливающий обработку данных, поступающих на вход процессора".

    Отметим, что препроцессор выполняет обработку программы только на уровне текста. Это значит, что на входе в препроцессор транслятора в тексте программы еще имеются препроцессорные директивы. На выходе из него препроцессорные директивы уже отсутствуют. Выходной текст программы изменяется, поскольку препроцессорные директивы уже выполнены. Например, для включения в программу некоторого текста из файла stdio.h надо использовать команду #include. Она имеет следующие три формы:

    include <имя_файла> /*имя указывается в угловых скобках/
    include "имя_файла" /*имя указывается в кавычках/
    
include имя_макроса /*макрос, расширяемый до обозначения файла/
     Существует одно важное правило, которое нужно знать и учитывать. Согласно этому правилу, если имя файла в директиве #
include <stdio.h> заключено в угловые скобки, то процессор Borland C/C++ ищет файл в стандартных системных каталогах.

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

Входит в состав компилятора и выполняет:

-макроподстановки, условную компиляцию, включение заголовочных файлов.

    Работает с текстом и не анализирует синтаксис.

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

Ex.

#include

#define.


2.     Одномерные массивы.

Массив – это расположенные вплотную друг за другом в памяти элементы одного и того же типа. Каждый массив имеет имя. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.

Массив объявляется так: int var[N]; здесь N - его размер, число ячеек.

Основные свойства массива:

1)       все элементы массива имеют один и тот же тип;

2)       все элементы массива расположены в памяти друг за другом; индекс первого элемента равен 0;

3)       имя массива является указателем-константой, равной адресу начала массива (первого байта первого элемента массива).

Признаком массива при описании является наличие парных скобок []. Константа или константное выражение в квадратных скобках задает число элементов массива. Например: char buffer[81]; int key[4];

При описании массива может быть выполнена инициализация его элементов. Существует два метода инициализации массивов:

1)       инициализация по умолчанию: она применяется только к статическим и внешним массивам: по умолчанию все элементы внешних и статических массивов инициализируются компилятором нулями;

2)       явная инициализация элементов; после описания массива помещается список начальных значений элементов массива, заключенный в фигурные скобки.

Существуют две формы явной инициализации элементов массива:

1) явное указание числа элементов массива и список начальных значений, возможно, с меньшим числом элементов. Например:

char array[10] = {'A','B','C','D');

Здесь описывается массив из 10 элементов. Первые 4 элемента массива инициализируются символами 'A','B','C','D'. Значение остальных 6 элементов либо равно 0, если массив внешний или статический, либо не определено. Если список начальных значений содержит больше элементов, чем число в квадратных скобках, компилятор генерирует сообщение об ошибке.

2) только со списком начальных значений. Компилятор определяет число элементов массива по списку инициализации. Например:

char array[] = {'A','B','C','D');

В результате создается массив ровно из 4 элементов и эти элементы получают начальные значения из списка инициализации.

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

Доступ к отдельным элементам массива может выполняться либо с помощью индекса, либо операцией *. В первом случае для ссылки на нужный элемент указывается его порядковый номер в массиве, заключенный в квадратные скобки. Самый первый элемент массива имеет порядковый номер 0. Например:

int a[]={1,2,3,4,5};

int index=0, first, last, bad;

first = a[index];    /* first=1 */

last = a[4];            /* last=5  */

bad = a[index+6]; /* bad случайно */

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

int array[10]={1,2,3,4,5,6,7};

int members;

members = sizeof(array)/sizeof(int);

В операторах для обращения к n-ому ящичку (где 0 <= n < N используется имя ящика var[n] где n - целое значение (или значение целой переменной,

или целочисленного выражения), "индекс в массиве".

Эта операция [] называется "индексация массива".

Индексация - есть ВЫБОР одного из N ящиков при помощи указания целого номера.

                var    - массив (N ячеек)

                n      - выражение (формула), выдающая целое значение в интервале 0..N-1

                var[n] - взят один из элементов массива. Один из всех.

                n      - номер ящика - называется еще и "индексом" этой переменной в массиве.

Пример:

 

                int var[5];                                     /* 1 */

                var[0] = 2;                                     /* 2 */

                var[1] = 3 + var[0];                            /* 3 */

                var[2] = var[0] * var[1];                       /* 4 */

                var[3] = (var[0] + 4) * var[1];                 /* 5 */

                printf("var третье есть %d\n", var[3]);

Как видим, каждый оператор изменяет лишь ОДНУ ячейку массива за раз.

Массив - набор переменных, которые не ИМЕНОВАНЫ разными именами,

вроде var0, var1, var2, ...

а ПРОНУМЕРОВАНЫ под одним именем:

var[0], var[1], var[2], ...

Индекс - часть ИМЕНИ ПЕРЕМЕННОЙ.

На самом деле индексация - это

                1) выбор элемента в массиве

                2) справа от присваиваний и в выражениях - еще и разыменование, то есть взятие вместо имени переменной - значения, в ней хранящегося.

Если в переменную не было занесено значение, а мы используем эту переменную, то в ней лежит МУСОР (любое, непредсказуемое значение).

                printf("var4 есть %d\n", var[4]);

напечатает все что угодно.

Поэтому переменные надо всегда инициализировать (давать им начальное значение).

Глобальные переменные автоматически инициализируются нулем, если мы не задали иначе. Локальные переменные не инициализируются автоматически, и содержат МУСОР.

Массивы НЕЛЬЗЯ присваивать целиком, язык Си этого не умеет.

                int a[5];

                int b[5];

                a = b;  /* ошибка */

Также нельзя присвоить значение сразу всем элементам (ячейкам) массива:

                a = 0;  /* ошибка */

не делает того, что нами ожидалось, а является ошибкой.

Для обнуления всех ячеек следует использовать цикл:

                int i;

                for (i=0; i < 5; i++)    /* для каждого i присвоить a[i] = 0; */

                a[i] = 0;


3.  Для заданного 0<=n<=200 , рассматриваемого как возраст человека, вывести фразу вида «Мне 21 год», «Мне 32 года», «Мне 12 лет».

 

 

#include<stdio.h>

#include<conio.h>

 

int ch=153;

int temp = ch;

 

void main()

{

clrscr();

 printf("Mne %d ",ch);

for (int i=0;ch>9;i+=10)

    {

     ch -= 10;

     if (ch <= 9)

       {

            if (ch == 1)

                printf("god");

            if ((ch == 2) | (ch == 3) | (ch == 4))

                if (i!=10)

                printf("goda");

            if ((ch == 5)|(ch == 6)|(ch == 7)|(ch == 8)|(ch == 9))

                printf("let");

       }

    }

getch();

}


4.   В заданной строке найти количество подстрок, состоящих из цифр.

 

 

 

#include<conio.h>

#include<stdio.h>

 

char s[]="safsl;32ds4f345e35dgd4gf5";

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

int i,j,k=0;

 //48-57

void main()

{

clrscr();

i=0;

j=0;

while (i < n)

      {

       j++;

       for (;(s[j] >= 48) & (s[j] <= 57);j++)

                if ((s[j+1] >= 48) & (s[j+1] <= 57));

                else

                        k++;

       i++;

 

      }

printf("%d",k);

getch();

}