ТОП 10:

Кафедра «Вычислительные методы и программирование»



Кафедра «Вычислительные методы и программирование»

 

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

по программированию

для студентов 1-2-го курсов

всех специальностей БГУИР и всех форм обучения

 

В 2-х частях

Часть 2

2-е издание дополненное и исправленное

 

ОСНОВЫ ПРОГРАММИРОВАНИЯ

НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ С

Под общей редакцией В.Л.Бусько

 

 

Минск 2003


УДК 681.3.06 (075)

ББК 32.973 я 73

Л 12

 

Рецензент

Зав.кафедрой ЭИ БГУИР, канд.техн.наук В.И.Комличенко

Авторы:

В.Л.Бусько, А.Г.Корбит, И.Н.Коренская, Т.М.Кривоносова, В.И.Убийконь

 

Л 12 Лабораторный практикум по программированию для студентов 1-2-го курсов всех специальностей БГУИР и всех форм обучения. В 2 ч. Ч.2. «Основы программирования на алгоритмическом языке С». 2-е издание дополненное и исправленное / В.Л.Бусько, А.Г.Корбит, И.Н.Коренская и др. - Мн.: БГУИР, 2003. - c.: ил.

ISBN (ч.2)

 

 

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

Во вторую часть практикума вошло 8 лабораторных работ. Предназначен практикум для студентов 1-2-го курсов всех специальностей и всех форм обучения.

 

 

Часть 1. Методические указания по курсу “Вычислительная техника и программирование” для студентов всех специальностей Ч.1. / Сост. В.Л.Бусько, А.Б.Долгий, А.Р.Живицкий.

Мн.: МРТИ, 1992.

 

 

УДК 681.3.06 (075)

ББК 32.973 я 73

 

Ó Коллектив

авторов, 2001

Ó Коллектив

авторов, 2003,

доп. и испр.

Ó БГУИР, 2003

ISBN (ч.2)

ISBN 985-444-269-1

 

СОДЕРЖАНИЕ

 

 

ЛАБОРАТОРНАЯ РАБОТА № 1 Линейные и разветвляющиеся вычислительные процессы . . . . .    
ЛАБОРАТОРНАЯ РАБОТА № 2 Программирование циклических вычислительных процессов . . .    
ЛАБОРАТОРНАЯ РАБОТА № 3 Программирование циклических процессов с использованием одномерных массивов и строк . . . . . . . . . . . .      
ЛАБОРАТОРНАЯ РАБОТА № 4 Программирование циклических процессов с использованием многомерных массивов. Динамическое распределение памяти . . . . . . . . . . . . . . . . . . . . .    
ЛАБОРАТОРНАЯ РАБОТА № 5 Программирование алгоритмов с использованием функций пользователя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      
ЛАБОРАТОРНАЯ РАБОТА № 6 Программирование алгоритмов с использованием структур . . . .    
ЛАБОРАТОРНАЯ РАБОТА № 7 Программирование алгоритмовс использованием файлов. . . . .    
ЛАБОРАТОРНАЯ РАБОТА № 8 Использование графического режима. . . . . . . . . . . . . . . . . . . . . .    
ЛИТЕРАТУРА . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
ПРИЛОЖЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  

 

 

ЛАБОРАТОРНАЯ РАБОТА № 1

Линейные и разветвляющиеся вычислительные процессы

 

Цель работы:

Изучить правила составления текстов программ на языке С: базовые типы данных, ввод-вывод данных, основные математические функции; операторы безусловного перехода и разветвлений (оператор выбора по условию if, оператор-переключатель switch). Научиться программировать линейные и разветвляющиеся алгоритмы.

Краткие теоретические сведения

Язык С отражает возможности современных компьютеров. Програм­мы на С отличаются компактностью и быстротой исполнения. Структура языка С побуждает программиста использовать в своей работе нисходящее программирование, структурное программирование, пошаговую разработку модулей.

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

 

Алфавит языка С

В языке С используются наборы символов:

1) прописные (A,…,Z) и строчные (a,…,z) буквы латинского алфавита;

2) арабские цифры от 0 до 9;

3) специальные символы:

+ (плюс), -(минус), *(звездочка ), /(дробная черта), =(равно), >(больше), < (меньше), ;(точка с запятой ), &(амперсант), [ ](квадратные скобки), { } (фигурные скобки), ( ) (круглые скобки), _ (знак подчеркивания), (пробел), .(точка), ,(запятая), :(двоеточие), # (номер), %(процент), ~(поразрядное отрицание), ?(знак вопроса), ! (восклицательный знак), \ (обратный слеш).

 

Классификация данных

В языке C применяются данные двух категорий: простые (скалярные) и сложные (составные) типы данных. К основным (базовым) типам данных относятся целый, вещественный и символьный типы. В свою очередь, данные целого типа могут быть короткими (short), длинными (long) и беззнаковыми (unsigned). Приведем размеры и возможные диапазоны базовых типов данных (табл. 1).

Сложные типы данных подразделяются на массивы, структуры (struct), объединения или смеси (union), перечисления (enum). Более подробно они рассмотрены в других лабораторных работах данного практикума.

 

Таблица 1

Наименование типа Тип данных Объем памяти, байт Диапазон значений
Символьный char -128 ... 127 (0 ... 255)
Целый int -32768 ... 32767
Короткий short 2(1) -32768... 32767 (-128...127)
Длинный long -2147483648... 2147483647
Беззнаковый целый unsigned int 0 ... 65535
Беззнаковый длинный unsigned long 0 ... 424967295
Вещественный float 3,14*10-38 ... 3,14*1038
Вещественный с двойной точностью double 1,7 *10-308 ... 1,7 *10308

 

Декларирование объектов

Все объекты (переменные, массивы и т.д.), с которыми работает программа в С, необходимо декларировать. При декларировании объекты можно инициализировать (задавать начальные значения).

Например: int j=10, m=3, n;

float c=-1.3, l=-10.23, n;

При декларировании объектов используются их идентификаторы, которые могут включать цифры (0...9), латинские прописные (A...Z) и строчные (a...z) буквы, символ подчеркивания (_). Первый символ идентификатора не может быть цифрой. В языке С буквы нижнего регистра (a...z) отличаются от букв верхнего регистра (A...Z), т.е. PI, Pi и pi – различные идентификаторы. Принято использовать в идентификаторах переменных строчные буквы, а в именованных константах – прописные.

Например: const float PI=3.1415926;

float pi=3.14;

Длина идентификатора определяется реализацией транслятора C и редактора связей (компоновщика). Современная тенденция - снятие ограничений длины идентификатора.

Разделители идентификаторов объектов:

- пробелы;

- символы табуляции, перевода строки и страницы;

- комментарии (играют роль пробелов).

Комментарий - любая последовательность символов, начинающаяся парой символов /* и заканчивающаяся парой символов */ или начинающаяся // и до конца текущей строки.

 

Структура программы

Программа, написанная на языке С, состоит из директив препроцессора, объявлений глобальных переменных, одной или нескольких функций, среди которых одна главная (main) функция управляет работой всей программы.

Общая структура программы на языке С имеет вид:

<директивы препроцессора>

<определение типов пользователя – typedef>

<прототипы функций>

<определение глобальных объектов>

<функции>

Функции, в свою очередь, имеют структуру:

<класс_памяти> <тип> <имя функции> (<объявление параметров>)

{ - начало функции

<определение локальных объектов>

<операции и операторы>

} - конец функции

 

Работа с функциями пользователя рассматривается в лабораторной работе № 5.

Кратко рассмотрим основные части общей структуры программы.

Перед компиляцией программы на языке С автоматически выполняется предва­ри­те­ль­ная (препроцессорная) обработка текста программы. С помощью директив препро­цес­сора задаются необходимые действия по преобразованию текста программы перед компиляцией.

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

- все препроцессорные директивы начинаются с символа #;

- все директивы начинаются с первой позиции;

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

Наиболее распространены директивы #include и #define.

Директива #include используется для подключения к программе заголовочных файлов (обычных текстов) с декларацией стандартных библиотечных функций. При заключении имени файла в угловые скобки < > поиск данного файла производится в стандартной директории с этими файлами. Если же имя файла заключено в двойные кавычки ” ”, то поиск данного файла осуществляется в текущем директории.

Например:

#include <stdio.h> - подключение файла с объявлением стандартных

функций файлового ввода-вывода;

#include <conio.h> - функции работы с консолью;

#include <graphics.h> - графические функции;

#include <math.h> - математические функции.

Директива #define(определить) создает макроконстанту и ее действие распро­страняется на весь файл.

Например: #define PI 3.1415927

В ходе препроцессорной обработки программы идентификатор PI заменяется значе­нием 3,1415927.

Пример программы:

#include <stdio.h>

#include < conio.h> // Директивы препроцессора

#define PI 3.1415927

void main() // Заголовок главной функции

{ // Начало функции

int num; // Декларирование переменной num

num=13; // Операция присваивания

clrscr(); // Очистка экрана

printf(" \n Число pi=%9.7f \n %d - это опасное число \n”, PI, num);

} // Конец функции

 

В первых двух строках программы указаны директивы препроцессора #include, по которым происходит подключение заголовочных файлов, содержащих декларации функций ввода-вывода (stdio.h) для функции printf() и работы с консолью (conio.h) для функции clrscr(). Следующая директива создает макроконстанту PI и подставляет вместо ее имени значение 3,1415927 по всему тексту программы. В главной функции main декларируется переменная целого типа num. Далее этой переменной присваивается значение 13. Функция printf выводит на экран строки:

Число pi =3.1415927

Это опасное число

Как видно, функция представляет собой набор операций и операторов, каждый из которых оканчивается символом ; (точка с запятой).

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

 

Функции вывода информации

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

putchar() - вывод одиночного символа без перехода на новую строку;

puts() - вывод строки символов с переходом на начало новой строки;

printf() - форматированный вывод данных.

Ее формат:

рrintf(<управляющая строка>, <список аргументов>);

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

Спецификация преобразования имеет вид

% <флаг> <размер поля . точность> спецификация

где флаг может принимать следующие значения:

- выравнивание влево выводимого числа (по умолчанию выполняется выравнивание вправо);

+ выводится знак положительного числа;

размер поля – задает минимальную ширину поля, т.е. длину числа; при недостаточной ширине поля выполняется автоматическое расширение;

точность – задает точность числа, т. е. количество цифр в его дробной части;

спецификация - указывает вид выводимой информации. Ниже приведены основные форматы функции печати:

 

Таблица 2

Формат Тип выводимой информации
%d Десятичное целое число
%c Один символ
%s Строка символов
%e Число с плавающей точкой (экспоненциальная запись)
%f Число с плавающей точкой (десятичная запись)
%u Десятичное число без знака
%o Восьмеричное число без знака
%x Шестнадцатеричное число без знака

 

Для длинных чисел (long, double) – используется дополнительный формат l.

Например: %ld - длинное целое, %lf – вещественное число с удвоенной точностью.

При необходимости вывода управляющих символов ( % \ и т.п.) их нужно указать 2 раза.

Например: printf("Только %d%% предприятий не работало. \n",5);

Получим: Только 5% предприятий не работало.

Управляющая строка может содержать управляющие символы:

\n – переход на новую строку;

\t – горизонтальная и \v – вертикальная табуляция;

\b – возврат назад на один символ;

\r – возврат в начало строки;

\f – прогон бумаги до начала новой страницы;

\a – звуковой сигнал;

\ddd – 8-ричный ASCII-код;

\xhhh – 16-ричный код;

\? – знак вопроса.

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

Пример:

#include <stdio.h>

#define PI 3.1415926

main()

{

int number=5, cost=11000, s=-777;

float bat=255, x=12.345;

printf ("%d студентов съели %f бутербродов. \n", number, bat);

printf ("Значение числа pi равно %f. \n", pi);

printf ("Стоимость этой вещи %d %s.\n", cost,"Руб.");

printf ("x = %-8.4f s = %5d %8.2f ", x, s, x);

}

В результате выполнения последней функции printf () на экране будет выведено:

х = 12.3450 s = -777 12.34

 

Функции ввода информации

Функция getch () используется для ввода одиночных символов.

Функция gets () обеспечивает ввод строки символов до нажатия клавиши ENTER.

Функция scanf предназначена для форматированного ввода информации любого вида. Общий вид функции:

scanf(<управляющая строка>, < список адресов>);

Для нее, как и для функции printf (), указывается управляющая строка. Однако функция scanf() в отличие от функции printf () использует в списке адресов указатели на перемен­ные, т.е. их адреса. Для обозначения указателя перед именем переменной записывается символ &, обозначающий адрес переменной. Для ввода значений строковых переменных символ & не используется. При использовании формата %s строка вводится до первого пробела. Вводить данные можно как в одной строке через пробел, так и в разных строках.

Данную особенность иллюстрирует следующий участок программы:

int course;

float grant;

char name[20];

printf ( "Укажите ваш курс, стипендию, имя \n");

scanf ( "%d%f", &course, &grant);

scanf ( "%s", name); // отсутствует & для массива символов

 

Операция присваивания

Операция присваивания имеет две формы записи:

1. Полная форма:

имя_переменной =выражение;

Сначала вычисляется выражение, а затем результат присваивается имени_переменной.

Например: y=(x+2)/(3*x)-5;

С помощью одного оператора можно присвоить одно значение несколь­ким перемен­ным, например: x=y=z=0; /* x, y, z=0 */

или z=(x=y)*5; - сначала переменной x присваивается значение переменной y, далее вычисляется выражение x*5 , и результат присваивается переменной z.

2. Сокращенная форма:

имя_переменной операция=выражениe;

где операция – одна из арифметических операций (+ , -, *, /, %);

Например:x*=5; // x=x*5;

s+=7; // s=s+7;

y/=x+3; // y=y/(x+3);

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

В языке С существуют операции уменьшения (--) и увеличения (++) значения переменной на 1. Операции могут быть префиксные (++i и --i) и постфиксные (i++ и i--). При использовании данной операции в выражении в случае префиксной операции сначала выполняется сама операция (изменяется значение i), и только потом вычисляется выражение. В случае постфиксной операции – операция применяется после вычисления выражения.

Например: b=7;

n=1;

1. c=b*++n; // n=n+1; c=b*n; т.е. c=14

2. c=b*n++; // c=b*n; n=n+1; т.е. c=7

 

Операторы перехода

Оператор безусловного перехода

goto < метка>;

Управление передается оператору с данной меткой:

<метка>: оператор;

В языке С метка не декларируется.

Оператор условного перехода if применяется для выбора одной из ветвей вычислений.

Общая форма записи:

if ( условие ) оператор_1;

else оператор_2;

Например: if(x>y) max=x;

else max=y;

Если оператор_1 или оператор_2 содержит два и более операторов, то они заключаются в фигурные скобки { }, т.е. применяется составной оператор. Оператор if проверяет истинность или ложность условия. Если условие истинно (не равно 0), то выполняется оператор_1, иначе, при ложности условия (=0), выполняется оператор_2.

Вторая часть оператора (else оператор_2;) может отсутствовать, такую форму называют “сокращенной”. Тогда в случае ложности условия управление передается на следующий за if оператор.

Если оператор_1 и оператор_2 в свою очередь являются операторами if, то такой оператор называют вложенным. При этом ключевое слово else принадлежит ближайшему предшествующему if.

Общий вид вложенного оператора if:

if (условие_1) оператор_1;

else if(условие_2) оператор_2;

else оператор_3;

Например: найти наибольшее значение из трех чисел x,y,z.

if (x>y)

if (x>z) max=x;

else max=z;

else if(y>z) max=y;

else max=z;

В качестве условий в языке С используют следующие операции отношений:

< (меньше), <= (меньше или равно), > (больше), >= (больше или равно), != (не равно), = = (равно). Пары символов разделять нельзя.

Общий вид условия:

<выражение_1> <знак_операции> <выражение_2>

Операндами могут быть любые простые типы. Значения операндов после вычисления перед сравнением преобразуются к одному типу. В качестве условий используются и более сложные выражения, содержащие логические операции. Приведем их перечень в порядке убывания приоритета: ! (отрицание или логическое НЕТ), &&(конъюнкция или логическое И), || (дизъюнкция или логическое ИЛИ). Пары символов &&и ||разделять нельзя.

Например: (0<x)&&(x<=100)

((!x)&&(y>0)||((z==1)&&(k>0))

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

Триадный оператор(оператор условного перехода ?). Его форма:

имя_переменной =условие ? выражение_1 : выражение_2;

Если условие истинно, то имени_переменной присваивается результат выражения_1, иначе – выражения_2.

Например: найти наибольшее из двух чисел: max=a>b ? a : b;

Оператор выбора switch

Общая форма оператора выбора:

switch(выражение)

{

caseconst_1: операторы; break;

caseconst_N: операторы;break;

default:операторы;

}

где const_1…const_N - целые или символьные константы; default - выполняется, если результат выражения не совпал ни с одной константой; может отсутствовать; break - оператор завершения работы switch. После выполнения одной из ветвей case все остальные ветви будут опущены. Если оператор break не записан, то выполняются операторы следующей ветви case. Оператор switch проверяет, совпадает ли значение выражения с одним из значений, приведенных ниже констант. При совпадении выполняются операторы, стоящие после совпавшей константы.

Например:

switсh(i)

{

case 1: f=pow(x,2);

break;

case 2: f=fabs(x);

break;

case 3: f=sqrt(x);

break;

default: printf(“Ошибка!”);

exit(1);

}

f=f+5;

 

Пример линейного алгоритма

Вычислить ,

при x=2,444, y=0,00869, z=-130, должно быть получено: -0.49871.

Текст программы может иметь следующий вид:

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define x 2.444

#define y 0.00869

#define z -130.0

 

void main(void)

{

double rezult,dop,a,b,c;

clrscr( ); // Очистка экрана

puts(" Линейная программа ");

dop=fabs(y-x);

a=pow(x,y+1)+exp(y-1);

b=1+x*fabs(y-tan(z));

c=0.5*pow(dop,2)-pow(dop,3)/3;

rezult=a/b*(1+dop)+c;

printf("\a\n Ответ: rezult=%lf, Press any key...", rezult);

getch( ); // Задержка до нажатия любой клавиши

}

 

Пример использования оператора if

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

Текст программы может иметь следующий вид:

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define A 1

#define C 3

 

double max(double m,double n) // Функция max с параметрами m и n для

{ // нахождения максимального значения

if (m>n) return m;

else return n;

}

 

double min(double m, double n) // Функция min с параметрами m и n для

{ // нахождения минимального значения

if (m<n) return m;

else return n;

}

 

void main()

{

double x,y,f; // Декларирование переменных x,y,f

clrscr();

puts("Введите значения x и y");

scanf("%lf %lf",&x,&y); // Ввод значений x и y

if ((x>0)&&(y<0))

{

f=(A*x+tan(C*y))/(5-2*x);

puts("F=(а*x+tg(c*y))/(5-2*x)");

}

else if ((x<0)&&(y>0))

{

f=max(pow(x,2.0/3.0),cos(y*y)); // Вызов функции max puts("F=max(pow(x,2/3),cos(y*y))");

}

else if ((x>0)&&(y>0))

{

f=min(0.5*x-2*pow(sin(y),2),exp(y)); // Вызов функции min puts("F=min(0.5*x-2*pow(sin(y),2),exp(y))");

}

else

{

puts("Функция F не определена \n Press any key...");

getch();

exit(1); // Принудительное завершение программы

}

printf("ОТВЕТ: F=%lf,\n Press any key...\n",f);

getch();

}

 

Работа интегрированной среды программирования Borland C++, в которой происходит выполнение программы, а также порядок набора текста, компиляции, редактирования, отладки и выполнения программы приведены в Приложении.

Варианты индивидуальных заданий

 

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

1. , где

2. где

3. где

4. где

5. где

6. где

7. где

8. где

9. где

10. где

11. где

12. , где

13. , где

14. , где

15. , где

16.

17.

18.

19.

20.

 

Контрольные вопросы

 

1.Какие типы переменных применяются в языке С?

2.Перечислите основные отличия функций printf() и scanf().

3.Какие формы записи операторов if применяются в языке С?

4.Чем отличается оператор if от оператора switch?

 

 


ЛАБОРАТОРНАЯ РАБОТА № 2

 

Оператор цикла for

Основная форма оператора цикла for имеет вид

for (выражение_1; выражение_2; выражение_3 )

оператор;

где выражение_1 – начальное значения параметра цикла;

выражение_2 – проверка условия на продолжение цикла;

выражение_3 – изменение параметра цикла (коррекция);

оператор – простой или составной оператор языка С.

Схема работы оператора следующая: только один раз вначале вычисляется выражение_1, затем проверяется выражение_2, и если оно - «истина», то выполня­ет­ся циклический участок программы, затем производится коррекция параметра, и так до тех пор, пока выражение_2 не примет значение «ложь».

Например: for (k=1; k<5; k++)

printf(“\n %d”, k);

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

В качестве параметра цикла можно использовать переменную любого базового типа.

Например:

for(ch=’a’; ch<=’z’; ch++) // Вывод на экран букв

printf(“ %c”,ch); // латинского алфавита

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

Например:

for(k=10; k>6;k++)

printf(“бесконечный цикл \n”);

Выйти из цикла досрочно можно следующими способами:

- по дополнительному условию;

- используя следующие операторы:

break;- выход из цикла, в котором находится break, управление передается на первый после цикла выполняемый оператор;

exit(int Kod);- выход из программы;

return; - выход из функции;

- с помощью оператора безусловного перехода goto <метка>;

Досрочное завершение текущего циклического шага возможно при помощи дополнительного условия или оператора continue, который прерывает выполнение текущего шага цикла, т.е. пропускает операторы оставшейся части цикла и передает управление в головной оператор цикла для коррекции параметра и проверки условия.

Передавать управление извне внутрь цикла запрещается.

Любое из выражений цикла for в круглых скобках может отсутствовать, но символ «;» опускать нельзя.

Например:

int i=0;

for(; i<3; i++)

puts(“Hello!”);

 

While (условие)

оператор;

где оператор – это простой, составной или пустой оператор.

Цикл выполняется до тех пор, пока условие принимает значение «истина», т.е. выражение в скобках возвращает ненулевой результат. Это цикл с предусловием – сначала проверяется условие, затем выполняется оператор. Поэтому цикл while не выполнится ни разу, если изначально результат вычисления условия будет равен 0.

Основная форма оператора do – while:

do

оператор;

while (условие);

где оператор – это простой, составной или пустой оператор.

Оператор dowhile – оператор цикла с постусловием, т.е. сначала выполняется оператор, а затем проверяется условие на истинность. Так как в цикле do–while условие проверяется в конце цикла, то цикл будет выполнен хотя бы один раз.

В циклах типа while и do–while допустимы те же способы досрочного выхода из цикла и досрочное завершение текущего шага цикла, как и в операторе for, но в последнем случае в отличие от цикла for управление передается на проверку условия. Для предотвращения бесконечного цикла внутри циклов while и do–while нужно предусмотреть изменение переменных, входящих в условие.

Например:

int i;

for (i=1;i<=300;i++) // Печать целых чисел, кратных 5

{

if (i%5!=0) continue;

printf(“%5d”,i);

}

Примеры бесконечных циклов:

1) for( ; ; )

оператор;

2) while(число_не_0) // Всегда истинно!

оператор;

3) do

оператор;

while(число_не_0); // Всегда истинно!

Среди операторов цикла обязательно должно быть условие выхода.

Вложенные циклы

В случае вложенных циклов один цикл находится внутри другого, например:

for(i=nn;i<nk;i++)

for(j=mn;j<mk;j++)

оператор;

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

Пример:

int i,j;

for(i=1;i<10;i++) // Печать таблицы умножения

{

for(j=1;j<4;j++)

printf(“\n %d*%d=%2d”, i, j, i*j);

printf(“\n”);

}

 

Пример использования оператора for

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

Текст программы может иметь вид

#include <stdio.h>

#include <conio.h>

void main(void)

{

float s;

int k,N;

clrscr( );

puts(“ Введите N”);

scanf(“%d”,&N);

for (s=0, k=1; k<=N; k++) // В заголовке цикла можно выпол-

{ // нять и двойное присваивание

s+=1.0/k;

printf(" \n k=%d s=%f ", k, s);

}

printf("\n ОТВЕТ: s=%f, Press any key...",s);

getch( );

}

 

Варианты индивидуальных заданий

 

Составить программу для определения таблицы значений функции у в произвольном диапазоне [a,b] изменения аргумента хс произвольным шагом h. Значения a, b, hвводятся с клавиатуры. Таблица должна содержать следующие столбцы: порядковый номер, значение аргумента x, значение функции, сообщение о возрастании или убывании функции, разность двух соседних значений функции.

Определить максимальное и минимальное значения функции.

1. a=-p; b=p; h=0,4.

2. a=0,7; b=1,8; h=0,1.

3. a=-0,5; b=2,5; h=0,2.

4. a=-0,9; b=2,7; h=0,3.

5. a=-2; b=0,8; h=0,2.

6. a=-1,9; b=2,7; h=0,3.

7. a=-0,4p; b=0,4p; h=0,5.

8. a=-0,3p; b=1,3p; h= p/10.

9. a=-p/2; b= p/2; h=p/10.

10. a=-3; b=3; h=0,5.

11. a=-p; b=p; h= p/6.

12. a=-0,9; b=1, h=0,3.

13. a=-0,9; b=2,7; h=0,3.

14. a=-0,1; b=2; h=0,1.

15. a=p; b=2p; h= p/15.

 

Значение аргумента x изменяется от a до b с шагом h. Для каждого x найти значение суммы S(x). Значения a,b,h и n вводятся с клавиатуры. Работу программы проверить для a=0,1; b=1,0; h=0,1; n выбрать максимально возможным!

16. .

17. .

18. .

19. .

20. .

 

Контрольные вопросы

 

1.Какой процесс называется “циклическим”?

2.Чем отличаются операторы while и do - while?

3.Обьясните работу оператора for.

4.Поясните понятие “вложенный цикл”?

ЛАБОРАТОРНАЯ РАБОТА № 3

 

Пример работы с одномерным массивом

В массиве целых чисел найти индекс и значение максимального эле­мента и переставить его с первым элементом. Программа также дол­ж­на подсчитать количество положительных и отрицательных элементов данного массива.

Текст программы может быть следующим:

 

#include <stdio.h>

#include <conio.h>

void main(void)

{ // Объявление с инициализацией,

int a[4]={-1,-20,4,100}; // индексы принимают значения от 0 до 3

int i,index,max,kp=0,ko=0,zam,n=4;

clrscr();

puts("\n Исходный массив ");

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

printf("%d ",a[i]); // Вывод элементов исходного массива

max=a[0];

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

{

if (a[i]>max)

{

max=a[i]; index=i; }

}

zam=a[0];a[0]=a[index];a[index]=zam;

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

{

if (a[i]<0) ko++;

else kp++;

}

puts("\n Результаты работы программы ");

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

printf("%d ",a[i]); // Вывод элементов массива

printf("\n положительных элементов: %d \n",kp);

printf("\n отрицательных элементов: %d \n\n Press any key...",ko);

getch();

}

Операция sizeof

Для определения размера памяти, необходимого для размещения объектов в языке С, используется унарная операция sizeof(параметр), параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof вычисляет размер памяти в байтах, отводимый под объект. Если указан идентификатор сложного объекта (массив, структура, объединение), то результатом является размер всего сложного объекта. Например:

sizeof(int) результат 2 байта;

int b[5]; sizeof(b) результат 10 байт;

int c[3][4]; sizeof(c) результат 24 байта.

Связь указателей и массивов

Указатели и массивы в языке С тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива int v[10] v и v[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива - это адрес начала последовательно расположенных элементов массива. Рассмотрим обращение к элементам массива на примере. Пусть объявлены - массив из 100 объектов типа float и указатель на объект типа float:

float p[100];

float *q;

int i;

если выполнить операцию q=p; то обращения к элементу массива p: p[i] , *(q+i) и *(p+i) эквивалентны.

Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, но вторая обычно эффективнее по быстродействию программы.

Очевидна эквивалентность выражений

&q[0] <-> &(*q) <-> q

*q <-> q[0]

 







Последнее изменение этой страницы: 2016-04-08; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.226.244.70 (0.116 с.)