Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_-_zaochniki.doc
Скачиваний:
4
Добавлен:
20.11.2019
Размер:
427.01 Кб
Скачать

Вариант 19

Теоретический вопрос №1

Описать основные принципы нисходящего и восходящего программирования. Дать определение модуля (программного модуля). Дать определение функционального (процедурного) программирования.

Теоретический вопрос №2

Описать различные режимы открытия файла. Привести пример.

Практическое задание

  1. Разработать программу для вычисления выражения.

  2. Подсчитать количество слов во введенной строке.

Вариант 20

Теоретический вопрос №1

Дать определение и описать синтаксис, алгоритм функционирования и алгоритм работы операторов циклов. Привести классификацию циклов и классификацию циклов с условием.

Теоретический вопрос №2

Дать определение строки в С. Привести пример объявления строки и объявления массива строк. Описать функции ввода-вывода строк.

Практическое задание

  1. Разработать программу для вычисления выражения.

  2. В линейном массиве определить количество чётных элементов.

Вариант 21

Теоретический вопрос №1

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

Теоретический вопрос №2

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

Практическое задание

  1. Разработать программу для вычисления выражения.

  2. Посчитать сумму четных чисел от 2 до 1000.

Вариант 22

Теоретический вопрос №1

Дать определение и описать синтаксис, алгоритм функционирования и алгоритм работы оператора цикла с предусловием. Привести пример.

Теоретический вопрос №2

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

Практическое задание

  1. Разработать программу для вычисления выражения.

b) Вводится номер месяца — целое число в диапазоне 1–12 (1 - январь, 2 - февраль и т. д.). Определить количество дней в этом месяце для невисокосного года. Выдать сообщение, если месяц введен не правильно.

Вариант 23

Теоретический вопрос №1

Дать определение и описать синтаксис, алгоритм функционирования и алгоритм работы оператора цикла с постусловием. Привести пример.

Теоретический вопрос №2

Дать определение указателя в С. Привести классификацию указателей. Привести примеры объявления и инициализации указателей. Описать операцию взятия адреса и операцию разыменования указателя.

Практическое задание

  1. Разработать программу для вычисления выражения.

  2. В матрице целочисленных элементов размерности mxn посчитать количество нулевых элементов.

Решение типового варианта

Вариант 24

Теоретический вопрос №1

Описать назначение и логику работы следующих операторов: goto, continue и break.

Ответ:

Оператор continue - оператор прерывания выполнения тела цикла и переход к следующей итерации.

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

unsigned summa = 0;

for(unsigned n=100;n<1000;n++){

if((n%5==0)||(n%3==0)) continue;

summa += n;

}

В первой строчке этого фрагмента является объявление и инициализация переменной summa, которая будет содержать сумму трехзначных чисел удовлетворяющих условию задачи. Далее следует оператор цикла с переменной-счетчиком n, изменяющейся от 100 до 999 с шагом единица. В теле цикла первым оператором является оператор if, условие которого становится истинным, если значение переменной n является кратным трем или пяти, а прямой ветвью оператора if является оператор continue. Таким образом, если значение переменой n будет кратно трем или пяти, то выполнение тела цикла for будет прервано, а управление будет передано в блок приращения цикла. Данный фрагмент программы можно представить в виде блок-схемы приведенной на рисунке 3.4.

Использования оператора continue можно избежать практически в любом случае. Например, предыдущий фрагмент программы можно преобразовать к виду:

unsigned summa = 0;

for(unsigned n=100;n<1000;n++)

if((n%5!=0)&&(n%3!=0)) summa += n;

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

Блок-схема фрагмента программы

Оператор continue осуществляет прерывание тела только того цикла, внутри которого он находится.

Оператор break - оператор прерывания выполнения оператора цикла (for, while, do...while) или оператора выбора (switch).

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

unsigned num = 0;

for(unsigned i=10, j=0;i<100;i++){

if(i%10 + i/10 == 7) j++;

if(j==3) {num = i; break;}

}

В первой строчке фрагмента программы объявляется и инициализируется нулем переменная num, которая будет в результате содержать искомое число. Далее описывается цикл for с переменной-счетчиком i, которая изменяется от 10 до 99 с единичным шагом. Также в блоке инициализации объявляется и инициализируется переменная j, которая будет использоваться для подсчета найденных чисел, удовлетворяющих условию поиска. В теле цикла сначала в операторе if проверяется, является ли сумма цифр текущего значения переменной i равной 7. Если да, то значение переменной j инкрементируется. Далее в следующем операторе условия проверяется: является ли найденное число третьим по счету. Если да, то его значение записывается в переменную num и цикл завершается с помощью оператора break. В противном случае цикл продолжает выполняться.

Использования оператора break можно избежать практически в любом случае. Например, предыдущий фрагмент программы можно преобразовать к виду:

unsigned num = 0;

for(unsigned i=10, j=0;(i<100)&&(j<3);i++){

if(i%10 + i/10 == 7) j++;

num = i;

}

Использование оператора break позволяет значительно упростить текст программы, а в некоторых случаях даже оптимизировать код. Как правило, оператор break используется в тех циклах, в которых присутствует несколько условий. Одно из этих условий становится основным и указывается в блоке условия оператора цикла, а остальные - в теле цикла с использованием оператора break.

Оператор break осуществляет прерывание только того цикла, внутри которого он находится.

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

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

unsigned num = 100;

Next:

if(num%10 + num/100 == num/10%10) goto Exit;

num++;

goto Next;

Exit:

В первой строчке фрагмента программы осуществляется объявление переменной num и инициализация ее значением первого трехзначного числа. Во второй строчке указывается метка Next. Далее в операторе if осуществляется проверка, удовлетворяет ли текущее значение переменной num условию задачи. Если удовлетворяет, то с помощью оператора goto осуществляется переход по метке Exit. В противном случае значение переменной num увеличивается на единицу и осуществляется переход по метке Next. На выходе в переменной num будет содержаться искомое значение.

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

Чрезмерное использование оператора goto делает программу запутанной (на жаргоне программистов такая программа называется «спагетти»). Поэтому не рекомендуется и даже запрещается при программировании использовать оператор goto. В большинстве современных языков программирования данный оператор присутствует, но считается устаревшим и его использование не рекомендуется.

Теоретический вопрос №2

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

Ответ:

Динамическая память - это область (блок) памяти выделенный для нужд программы в процессе работы программы (а не заранее).

Основными двумя действиями над динамической памятью являются: выделение и освобождение. В языке С функции для осуществления этих действий описаны в библиотеке stdlib.h.

Функция выделения блока памяти:

void * malloc(size_t size);

В параметре size (целое незнаковое число) функции передается размер блока памяти в байтах, который необходимо выделить. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось. Например, фрагмент программы выделения динамической памяти под структуру Point2D:

int *ptr = (int *)malloc(sizeof(int));

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

Функция выделения блока памяти под массив:

void * calloc(size_t num, size_t size);

В первом параметре num (целое незнаковое число) передается число элементов в массиве. Во втором параметре size (целое незнаковое число) передается размер одного элемента массива. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось. Например, фрагмент программы для выделения динамической памяти под целочисленный массив из 20 элементов:

int *array = (int *)calloc(20,sizeof(int));

Функция изменения размера выделенного ранее блока памяти:

void * realloc(void *memblock, size_t size);

В первом параметре memblock (не типизированный указатель) передается указатель на выделенный ранее блок памяти. Во втором параметре size (целое незнаковое число) передается новый размер блока памяти. Функция возвращает значение не типизированного указателя на «выделенный заново» блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось. Например, увеличение целочисленного массива до 30-ти элементов:

array = (int *)realloc(array,30*sizeof(int));

Практическое задание

  1. Разработать программу для вычисления математического выражения.

Решение:

#include <stdio.h>

#include <math.h>

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

{

float x,y,z,c; //объявление перемнных

printf("Vvedite 3 chisla x,y i z = "); //приглашение к вводу переменных

scanf("%f %f %f",&x, &y, &z); //считывание введенных данных

c=log(x)-(fabs(z)+y)/sqrt(x+z); //вычисление результата

printf("Otvet = %f\n", c); //вывод ответа

return 0;

}

b) Вычислить площадь кольца по известному радиусу кольца и радиусу полости. Если введенный радиус полости больше радиуса кольца, то выдавать сообщение об ошибке.

Решение:

#include <stdio.h>

#include <math.h>

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

{

float r_kr,r_p,s_kr,s_p; //объявление перемнных

printf("Vvedite r_kr = "); //приглашение к вводу радиуса кольца

scanf("%f",&r_kr); //ввод радиуса кольца

printf("Vvedite r_p = "); //приглашение к вводу радиуса полости

scanf("%f",&r_p); //ввод радиуса полости

s_kr=3.14*r_kr*r_kr; // площадь круга

s_p=3.14*r_p*r_p; // площадь полости

if (r_p>r_kr)printf("Oshibka"); // сообщение об ошибке, если радиус полости больше радиуса круга

else printf("Otvet = %lf\n", s_kr-s_p); //вычисление площади кольца и вывод //результата

return 0;

}

Контрольная работа №2.