БИЛЕТ 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();
}