Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
217942_748E9_otvety_k_ekzamenu_po_programmirova...doc
Скачиваний:
7
Добавлен:
26.09.2019
Размер:
627.2 Кб
Скачать

1)Ввод одномерного массива с клавиатуры

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

{

printf("Input a[%d] ", i);

scanf("%d", &a[i]);

}

Заполнение случайными целыми числами

randomize();

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

{

a[i]=random(B-A+1)+A;

printf(“%3d”, a[i]);

}

Заполнение случайными вещественными числами

randomize();

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

{

a[i]=(double)rand()/RAND_MAX * (B-A)+A;

printf(“%3f”, a[i]);

}

2)Вывод одномерного массива в столбик

for (i=0; i<n; i++) printf(“%d\n”, a[i]);

Вывод одномерного массива в строчку

for (i=0; i<n; i++) printf(“%7d”, a[i]); printf(“\n”);

3)Поиск минимального значения по значению(быстрее)

int MinValue=a[0];

for (int i=1; i<n; i++)

if (a[i]<MinValue) MinValue=a[i];

printf("Min=%d\n", MinValue);

Поиск минимального значения по индексу(медленнее)

char MinIndex=0;

for (int i=1; i<n; i++)

if (a[i]<a[MinIndex]) MinIndex=i;

printf("Min=%d\n", a[MinIndex]);

4)Обнуление при объявлении

int a[n]={0};

Обнуление c пом. ф-ии memset из библиотеки mem.h

ф-я memset заполняет заданную область указанными байтами. Ф-я имеет 3 аргумента:

1-адрес начала области

2-значение байта- заполнителя

3- размер области

memset(a,0,sizeof(a));

getchar();getchar();

return 0;

5)Сортировка одномерного массива в порядке возрастания

int tmp;

for (int i=0; i<n-1; i++)

for (int j=i+1; j<n; j++)

if (a[i]>a[j])

tmp=a[i]; a[i]=a[j]; a[j]=tmp;

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

printf("%4d", a[i]);

getchar();

return 0;

}

Двумерный массив

int b[2][2];

//Ввод

for(int i=0;i<2;i++)

for(int j=0;j<2;j++)

{printf("Input b[%d][%d] ", i, j);

scanf("%d", &b[i][j]);}

//Output as matrix

for(int i=0;i<2;i++)

{for(int j=0;j<2;j++)

printf("%4d", b[i][j]);

printf("\n");}

//Обнуление

memset(b, 0, sizeof(b));

getchar();getchar();

return 0;}

#include <stdio.h>

/* Олимпиада по информатике проводится в m туров.

Вывести победителей каждого тура и победителей в общем зачете. Максимальное число баллов в туре - 50 */

int main(int argc, char* argv[])

{const n=3; //число участников

const m=2; //число туров

unsigned char rez[n][m+1]; //последний столбец на сумму

unsigned char max[m+1]; //лучшие результаты

char name[n][20]; //фамилии

int i, j;

//Ввод данных

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

{printf("Input a surname of %d-st participant ", i+1);

scanf("%s", name[i]);

for (j=0; j<m; j++)

{printf("Input its result in %d-st round ", j+1);

scanf("%d", &rez[i][j]);}}

//Подсчет суммарного результата

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

{rez[i][m]=0;

for (j=0; j<m; j++)

rez[i][m]+=rez[i][j];}

//Поиск максимальных результатов

for (j=0; j<m+1; j++)

{max[j]=rez[0][j];

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

if (rez[i][j]>max[j]) max[j]=rez[i][j];}

//Вывод победителей в турах

int t;

for (j=0; j<m; j++)

{printf("Winners in %d-st round with result %d\n", j+1, max[j]);

t=0;

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

if (rez[i][j]==max[j])

{t++; printf("%d. %-s\n", t, name[i]);}

}

//Вывод победителя в общем зачете

printf("Winners in the general offset with result %d\n", max[m]);

t=0;

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

if (rez[i][m]==max[m])

{

t++;

printf("%d. %-s\n", t, name[i]);

}

getchar();getchar();

return 0;

}

10.Структуры и объединения. Вариантные структуры. Поля битов.

Cтруктуры — это составной объект, в который входят элементы любых типов, за исключением функций.

Тип структуры определяется записью вида:

struct { список определений }

В структуре должен быть указан хотя бы один компонент. Определение структур имеет следующий вид:

тип_данных идентификаторы;

тип_данных указывает тип структуры для объектов, определяемых в описателях. В простейшей форме описатели представляют собой идентификаторы или массивы.

Пример:

struct { double x,y; } s1, s2, sm[9];

x,y – компонеты

s1.x=5;

s2.y=7;

Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти структур.

Тег структуры

В приведенном ниже примере идентификатор student описывается как тег структуры struct тег{список описаний}:

Тег структуры используется для последующего объявления структур данного вида в форме:

struct тег список-идентификаторов;

Пример:

struct studeut st1,st2;

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

st1.name="Иванов"; st2.id=st1.id;

Поля- элементы структуры

Доступ к полям:

1)Указывается имя переменной структуры и через точку имя поля.

2)Указывается адрес переменной структуры , затем -> и имя поля. Примеры:

struct {int a; double b ;}s1;*s2;

s1.a=4;s2=&s1;s2->b=3.1;

Объединения (смеси)

Объединение подобно структуре, однако в каждый момент времени может использоваться только один из элементов объединения.

В объединении все поля находятся в одной обл-ти памяти, равной размеру наибольшего поля.

union { описание элемента 1; ... описание элемента n; };

Доступ к элементам объединения осуществляется тем же способом, что и к структурам.

Тег объединения может быть формализован точно так же, как и тег структуры.

Объединение применяется для следующих целей: экономия памяти, преобразование типов, доступ к отдельным байтам.

Поля битов

Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур битовые поля объявлять нельзя. Нельзя также объявлять массивы битовых полей и применять к ним операцию взятия адреса.

struct { unsigned идентификатор 1 : длина-поля 1;

unsigned идентификатор 2 : длина-поля 2; … } ;

длина — поля задается целым выражением или константой. Эта константа определяет размер поля в битах. Поле нулевой длины обозначает выравнивание на границу следующего слова.

Пример:

struct { unsigned a1 : 1; unsigned a2 : 2; unsigned a3 : 5; unsigned a4 : 2; } prim;

Битовое поле рассматривается как целое число, максимальное значение которого определяется длиной поля.

Переменные с изменяемой структурой (изменяемые структуры)

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

Р ассмотрим пример, в котором информация о геометрических фигурах представляется на основе комбинированного использования структуры и объединения.

структура figure состоит из 4-ёх полей:

площадь, периметр, тип фигуры и поле geom_fig , представляющее собой объединение 3-ёх вариантов размеров фигуры

11.Правила определения переменных и типов. Инициализация данных.

Определение переменных

Объявление переменной зависит от идентификаторов и модификаторов типа. В СИ применяерся 3 вида модификаторов: модификатор указателя *, модификатор массива [], модификатор функции ().

При объявлении можно использовать одновременно более одного модификатора, это позволяет создавать сложные типы.

Ограничения:

  • элементами массивов не могут быть функции,

  • функции не могут возвращать массивы или функции.

При инициализации сложных описателей :

  • [] и () скобки (справа от идентификатора) имеют приоритет перед * (слева от идентификатора).

  • [] или () скобки имеют один и тот же приоритет и раскрываются слева направо.

  • Спецификатор типа рассматривается на последнем шаге.

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

Правило интерпритации "изнутри наружу":

1. Начать с идентификатора и посмотреть вправо, есть ли [] или ().

2. Если они есть, то проинтерпретировать эту часть описателя и затем посмотреть налево в поиске *.

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

4. Интерпретировать спецификатор типа.

В данном примере объявляется переменная comp (1), как массив из 10 (2) указателей (3) на функции (4), возвращающие указатели (5) на целые значения (6).

Объявление типов (2 способа)

1) при объявлении структуры.

2) с помощью ключевого слова typedef. При объявлении с ключевым словом typedef, идентификатор, стоящий на месте описываемого объекта, является именем вводимого в рассмотрение типа данных, и далее этот тип может быть использован для объявления переменных. Имя с ключевым словом typedef для типов указателя, структуры, объединения может быть объявлено, прежде чем эти типы будут определенны, но в пределах видимости объявителя.

typedef char FIO[40] /* FIO - массив из сорока символов */

Инициализация данных

2 формата инициализации данных:

1) = инициатор; // используется при инициализации переменных основных типов и указателей

2) = { список_инициаторов }; //используется при инициализации составных объектов

char tol = 'N'; Переменная tol инициализируется символом 'N'.

инициализация массива:

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

int b[2][2] = { { 1,2 }, { 3,4 } }; Инициализируется двухмерный массив b целых величин; элементам массива присваиваются значения из списка.

int b[][] = { { 1,2 }, { 3,4 } }; При инициализации массива можно опустить одну или несколько размерностей .

int b[2][2] = { { 1,2 }, { 3 } }; неинициализированные элементы автоматически обнуляются.

Инициализации составных объектов:

struct complex { double real; double imag; }

comp [2][3] = { { {1,1}, {2,3}, {4,5} }, { {6,7}, {8,9}, {10,11} } }; //инициализируется массив структур comp из двух строк и трех столбцов, где каждая структура состоит из двух элементов real и imag.

complex comp2 [2][3] = { {1,1},{2,3},{4,5}, {6,7},{8,9},{10,11} };

  • первая левая фигурная скобка — начало составного инициатора для массива comp2;

  • вторая левая фигурная скобка — начало инициализации первой строки массива comp2[0].

  • Значения 1,1 присваиваются двум элементам первой структуры;

  • первая правая скобка (после 1) указывает компилятору, что список инициаторов для строки массива окончен, и элементы оставшихся структур в строке comp[0] автомати-чески инициализируются нулем;

  • аналогично список {2,3} инициализирует первую структуру в строке comp[1], а ос-тавшиеся структуры массива обращаются в нули;

  • на следующий список инициализаторов {4,5} компилятор будет сообщать о возмож-ной ошибке так как строка 3 в массиве comp2 отсутствует.

Инициализации объединения

задается значение первого элемента объединения в соответствии с его типом.

Пример:

union tab { unsigned char name[10]; int tab1; } pers = {'A','H','T','O','H'};

Инициализация массива символов

char stroka[ ] = "привет";

Инициализируется массив символов из 7 элементов, последним элементом (седьмым) будет символ '\0', которым завершаются все строковые литералы.

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

12.Определение и вызов функций. Фактические и формальные параметры.

В языке СИ вся программа строится только из функций . Функция — это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на СИ должна быть функция с именем main (главная функция), с этой функции начинается выполнение программы.

Функция может возвращать некоторое (одно !) значение.

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

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

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

[спецификатор-класса-памяти] [спецификатор-типа] имя-функции ([список-формальных-параметров]){тело-функции }

Необязательный спецификатор-класса-памяти задает класс памяти функции, который может быть static или extern.

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

Пример:

int rus (unsigned char r) { if (r>='А') return 1; else return 0; }

В данном примере определена функция с именем rus, имеющая один параметр с именем r и типом unsigned char. Функция возвращает целое значение, равное 1, если параметр функции является буквой русского алфавита, или 0 в противном случае.

Вызов ф-ии может предшествовать определению (при этом до вызова функции нужно поместить объявление (прототип) функции – определение без тела функции int min(int,int)); если объявление ф-ии не задано, то компиллятор строит автомат. прототип на основе первого вызова. Определения используемых функций могут следовать за определением функции main, перед ним, или находится в другом файле.

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

1. Функция возвращает значение типа, отличного от int.

2. Требуется проинициализировать некоторый указатель на функцию до того, как эта функция будет определена.

int rus (unsigned char r); или rus (unsigned char);

Вызов функции – указание в тексте имени функции со списком фактических параметров.

Вызов функции имеет следующий формат: адресное-выражение ([список-выражений])

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

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

Выполнение вызова функции происходит следующим образом:

1. Вычисляются выражения в списке выражений и подвергаются обычным арифметическим преобразованиям. Затем, если известен прототип функции, тип полученного фактического аргумента сравнивается с типом соответствующего форма-льного параметра. Если они не совпадают, то либо производится преобразование типов, либо формируется сообщение об ошибке.

2. Происходит присваивание значений фактических параметров соответствующим формальным параметрам.

3. Управление передается на первый оператор функции.

4. Выполнение оператора return в теле функции возвращает управление и возможно, значение в вызывающую функцию. При отсутствии оператора return управление возвращается после выполнения последнего оператора тела функции, а возвращаемое значение не определено. Пример int min(int a, int b);

min(int, int); /*вызов ф-ии min*/

Фактические и формальные параметры

Формальные параметры- пар-ры, перечисленные в заголовке описания ф-ии.

Фактические параметры(аргументы)- записанные в операторе вызова функции.

Список-формальных-параметров — это последовательность объявлений формальных параметров, разделенная запятыми.

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

Способы передачи параметров в функцию:

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

По значению: в стек заносятся копии значений аргументов и операторы ф-ии работают с этими копиями. Доступа к исходным значениям параметров и возможности их изменить у ф-ии нет.