- •Министерство образования Российской федерации новосибирский государственный технический университет
- •Часть 1
- •Работа подготовлена на кафедре
- •Последовательность этапов решения задач при нисходящем проектировании
- •Семь основных элементов программирования.
- •Другие функции вывода: puts() и putchar()
- •Типы данных
- •Использование gets() и getch() для ввода
- •Условные операторы
- •Операции сравнения
- •Логические операции
- •Операторы присваивания
- •Оператор запятая
- •Лабораторная работа № 1 условные операторы. Операторы цикла.
- •Цель работы
- •Общие положения Оператор if
- •Циклические конструкции в программах
- •3. Пример программной реализации
- •4. Варианты заданий
- •5. Контрольные вопросы.
- •Лабораторная работа № 2 массивы целых чисел. Символьные массивы.
- •1. Цель работы.
- •2. Общие положения.
- •3. Примеры программных реализаций
- •Пример 3. Введенное натуральное число записать в виде строки.
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа № 3 методы сортировки.
- •Цель работы
- •Общие положения
- •Сортировка простыми включениями.
- •Сортировка простым выбором.
- •Сортировка простым обменом.
- •Пример программной реализации
- •Варианты заданий.
- •Лабораторная работа № 4
- •Способы передачи параметров
- •Функция main()
- •Области действия функций. Определения и объявления
- •Примеры программных реализаций
- •Варианты заданий
- •Контрольные вопросы
- •Лабораторная работа № 5 функции. Массивы указателей.
- •Цель работы
- •Общие положения
- •Примеры программных реализаций
- •Варианты заданий
- •Контрольные вопросы
Лабораторная работа № 1 условные операторы. Операторы цикла.
Цель работы
Приобретение практических навыков использования условных операторов и операторов цикла.
Общие положения Оператор if
Обратимся теперь опять к оператору if, который фигурировал при рассмотрении первых примеров. Оператор if имеет следующий основной формат:
if (значение) оператор1;
else оператор2;
где "значение" является любым выражением, которое приводится или может быть приведено к целочисленному значению. Если "значение" отлично от нуля ("истина"), то выполняется "оператор1", в противном случае выполняется "оператор2".
Дадим пояснение относительно двух важных моментов по использованию оператора if-else. Во-первых, часть "else оператор2" является необязательной частью оператора if; другими словами, правомерно употребление следующей формы оператора if:
if (значение) оператор1;
В этой конструкции "оператор1" выполняется тогда и только тогда, когда "значение" отлично от нуля. Если "значение" равно нулю, "оператор1" пропускается и программа продолжает выполняться дальше. Во-вторых, что делать, если вы хотите выполнить более одного оператора в зависимости от того ложно или истинно выражение, указанное в операторе if? Ответ: используйте составной оператор. Составной оператор состоит из:
- левой или открывающей фигурной скобки ({)
- последовательности операторов, разделенных точкой с запятой (;)
- правой или закрывающей фигурной скобки (})
В приведенном ниже примере в предложении if используется один оператор if (b == 0.0) printf("Отношение не определено \n"); а в предложении else - составной оператор
else { ratio = a/b; printf( "Значение отношения равно %f \n", ratio); }
Вы можете так же заметить, что тело вашей программы (функции main()) является подобием составного оператора.
Циклические конструкции в программах
Наряду с операторами (или группами операторов), которые могут выполняться в зависимости от каких-либо условий, существуют еще и операторы, которые могут выполняться несколько раз в одной и той же последовательности. Такой вид конструкции в программе известен как цикл. Есть три основных типа циклов (хотя два из них можно рассматривать как разновидность одного). Это цикл while ("пока"), цикл for ("для") и цикл do...while ("делать ... пока"). Рассмотрим их по порядку.
Цикл while
Цикл while является наиболее общим и может использоваться вместо двух других типов циклических конструкций. В принципе можно сказать, что по-настоящему для программирования необходим только цикл while, а другие типы циклических конструкций служат лишь для удобства написания программ. Пример:
#inсlude <stdio.h>
main()
{
int len;
len=0;
puts("Наберите предложение, затем нажмите <Ввод>");
while ( getchar() != '\n') len++;
printf("\nВаше предложение имеет длину %d символов\n",len);
}
Эта программа позволяет ввести предложение с клавиатуры и подсчитать при этом, сколько раз вы нажали на клавиши клавиатуры до тех пор, пока не нажали на клавишу <Ввод> (соответствует специальному символу конца строки - '\n'). Затем программа сообщит вам, сколько символов (символ '\n' не подсчитывается) вы ввели.
Оператор while имеет следующий формат:
while (выражение)
оператор
где "выражение" принимает нулевое или отличное от нуля значение, а "оператор" может представлять собой как один оператор, так и составной оператор.
В процессе выполнения цикла while вычисляется значение "выражения". Если оно истинно, то "оператор", следующий за ключевым словом while, выполняется и "выражение" вычисляется снова. Если "выражение" ложно, то цикл while завершается и программа продолжает выполняться дальше.
Обратите внимание на другой пример цикла while.
#include <stdio.h>
main()
{
char *msg = "Здравствуй, мир";
int index = 1;
while (index <= 10 )
{
printf("Время # %2d: %s\n", index, msg);
index ++;
}
}
После выполнения этой программы на экране будут отображены строки со следующей информацией:
Время # 1 : Здравствуй, мир
Время # 2 : Здравствуй, мир
Время # 3 : Здравствуй, мир
........................
Время # 9 : Здравствуй, мир
Время # 10 : Здравствуй, мир
Очевидно, что оператор printf() был выполнен ровно десять раз. При этом значение параметра цикла index изменилось от 1 до 10. Немного подумав, вы сможете переписать этот цикл несколько компактнее:
index = 0 ;
while (index ++ < 10 )
printf("Время #%2d: %s\n", index, msg);
Цикл for
Цикл for является одним из основных видов циклов, которые имеются во всех универсальных языках программирования, включая Си. Однако, версия цикла for, используемая в Си, как вы увидите, обладает большей мощностью и гибкостью.
Основная идея, заложенная в его функционирование, заключается в том, что операторы, находящиеся внутри цикла, выполняются фиксированное число раз, в то время как переменная цикла (известная еще как индексная переменная) пробегает определенный ряд значений. Например, модифицируем программу, о которой говорилось выше, в следующую:
#include <stdio.h>
main()
{
char *msg = "Здравствуй, мир";
int index;
for (indx = 0; index < 10; index++ )
printf("Время #%2d: %s\n", index, msg);
}
Выполните эту программу, и вы убедитесь, что она делает те же действия, что и программа с циклом while, которую мы уже разобрали, и является точным эквивалентом первого ее варианта. Теперь приведем основной формат цикла for:
for (выр1; выр2; выр3) оператор
Так же, как и в цикле while, "оператор" в теле цикла for обычно является одним из операторов программы, но может использоваться и составной оператор, заключенный в фигурные скобки ({...}).
Заметим, что параметры цикла for, заключенные в скобки, должны разделяться точкой с запятой (позиционный параметр), которая делит в свою очередь пространство внутри скобок на три сектора. Каждый параметр, занимающий определенную позицию, означает следующее:
- выр1 - обычно задает начальное значение индексной переменной;
- выр2 - условие продолжения цикла;
- выр3 - обычно задает некоторую модификацию (приращение) индексной переменной за каждое выполнение цикла.
Основной вариант цикла for эквивалентен следующей конструкции, выраженной с помощью цикла while:
выр1;
while (выр2)
{ оператор; выр3;
}
Вы можете опускать одно, несколько или даже все выражения в операторе for, однако о необходимости наличия точек с запятой вы должны помнить всегда. Если вы опустите "выр2", то это будет равносильно тому, что значение выражения "выр2" всегда будет иметь значение 1 (истина) и цикл никогда не завершится (такие циклы известны еще как бесконечные).
Во многих случаях вам поможет использование оператора запятая (,), который позволяет вводить составные выражения в оператор цикла for. Вот, например, еще одна правильная модификация с использованием составного выражения в операторе for:
#include <stdio.h>
main()
{
char *msg = "Здравствуй, мир";
int up, down ;
for (up = 1, down = 9; up <= 10; up++, down--)
printf("%s: %2d растет, %2d уменьшается \n", msg, up, down);
}
Заметьте, что и первое и последнее выражение в этом цикле for состоит из двух выражений, инициализирующих и модифицирующих переменные up и down. Вы можете сделать эти выражения сколь угодно сложными. (Возможно вы слышали о хакерах Си ( hacker - программист, способный писать программы без предварительной разработки спецификаций и оперативно вносить исправления в работающие программы, не имеющие документации), которые запихивают большинство своих программ в три выражения оператора for, оставляя в теле цикла лишь несколько операторов).
Цикл do...while
Последним видом цикла является цикл do...while.
#include <stdio.h>
#include <conio.h>
main()
{
float a, b, ratio;
do {
printf("\n Введите два числа: ");
scanf("%f %f", &a, &b);
if (b == 0.0) printf("\n Деление на ноль!");
else
{
ratio = a/b;
printf("\n Результат деления двух чисел: %f", ratio);
}
printf("\n Нажми 'q' для выхода или любую клавишу для
продолжения");
} while ( getch() != 'q');
}
Эта программа вычисляет результат деления одного числа на другое. Затем просит вас нажать любую клавишу. Если вы нажмете клавишу 'q', то выражение в операторе цикла while в конце программы примет значение "ложь" и цикл (а значит и программа) завершится. Если вы введете какой-либо другой символ, отличный от 'q', то выражение будет иметь значение "истина" и цикл повторится.
Формат цикла do...while можно представить в виде:
do оператор while (выр);
Основное отличие между циклом while и циклом do...while в том, что операторы внутри do...while всегда выполняются хотя бы один раз (т.к. проверка условия выполнения цикла осуществляется после выполнения последовательности операторов, составляющих тело цикла). Это похоже на цикл repeat...until в Паскале с одним, однако, различием: цикл repeat выполняется до тех пор, пока его условие не станет истинным; а цикл do...while выполняется пока истина.
Принудительный выход из конструкций for, while, do while можно выполнить оператором break. После чего осуществляется переход к следующему оператору программы.
Оператор continue вызывает пропуск оставшейся части итерации во всех указанных циклах и осуществляет переход к началу следующей итерации не завершая цикла.