- •О.Ф.Власенко, и.В.Беляева изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •Оглавление
- •Вывод в языке си Простейшая программа «Привет, мир!»
- •Функция printf – форматированный вывод
- •Циклы в языке си «Привет, мир!» 100 раз
- •Цикл с предусловием в Паскале и Си
- •Цикл с постусловием в Паскале и Си
- •Цикл for в Паскале и Си
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Функции в языке си Локальные и глобальные переменные
- •Функции без параметров в Си
- •Функции с параметрами
- •Способы передачи параметров в подпрограммы
- •Работа с указателями: операции взятия адреса и разыменования адреса
- •Ввод в языке си Функция getch – ввод символа
- •Функция scanf - форматированный ввод
- •Развилки Пример задачи: размер файла в байтах
- •Усеченные развилки
- •Полные развилки
- •Варианты для простых заданий и для заданий средней сложности
- •Задания среднего уровня сложности
- •Рекуррентные соотношения для вычисления корней
- •Разложение в ряд некоторых функций
- •Пример выполнения лабораторной работы по заданиям среднего уровня сложности
- •Сложные задания
- •Пример выполнения лабораторной работы по сложным заданиям
- •Варианты для сложных заданий
- •Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
- •Массивы в си Объявление и инициализация одномерных массивов в Си
- •Вычисление адреса элемента массива
- •Адресная арифметика
- •Имя массива является указателем на нулевой элемент массива
- •Передача массива в функцию через параметр
- •Примеры обработки массивов в Си
- •Задание для лабораторной работы по теме «Обработка одномернЫх массивОв» Цель работы
- •Общее задание
- •Пример выполнения лабораторной работы
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Список литературы
- •Изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •432027, Г. Ульяновск, Сев. Венец, 32.
Варианты для сложных заданий
Вариант C1:
Функции:
1.
2.
3.
Вариант C2:
Функции:
1.
2.
3.
Вариант C3:
Функции:
1.
2.
3.
Вариант C4:
Функции:
1.
2.
3.
Вариант C5:
Функции:
1.
2.
3.
Вариант C6:
Функции:
1.
2.
3.
Вариант C7:
Функции:
1.
2.
3.
Вариант C8:
Функции:
1.
2.
3.
Вариант C9:
Функции:
1.
2.
3.
Вариант C10:
Функции:
1.
2.
3.
Вариант C11:
Функции:
1.
2.
3.
Вариант C12:
Функции:
1.
2.
3.
Вариант C13:
Функции:
1.
2.
3.
Вариант C14:
Функции:
1.
2.
3.
Вариант C15:
Функции:
1.
2.
3.
Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
Практически во всех задачах используется какой-нибудь выбор пользователя. Например, для демонстрации работы программ можно использовать сгенерированные случайные числа, а можно числа, введенные с клавиатуры. Выбор пользователя очень часто реализуют в виде меню. Простейшее меню выглядит так:
Выберите один из вариантов:
Ввод чисел с клавиатуры
Генерация случайных чисел
Выход из программы
Введите номер выбранного пункта:___
Меню в программе удобно реализовывать через оператор ВЫБОР (В Паскале case, в Си – switch ).
Выбор
Продемонстрируем использование меню на следующей задаче:
По трем сторонам треугольника нужно вычислить его площадь.
Для вычисления
будем использовать формулу
,
где a,
b,
c
– стороны треугольника, а p
– полупериметр
.
Решение на Паскале:
Uses crt;
var
a, b, c: real; {Стороны треугольника}
p: real; {Полупериметр треугольника}
s: real; {Площадь треугольника}
ch: char; {Выбранный пункт меню}
Begin
Clrscr();
While true do {Бесконечный цикл}
Begin
Writeln(‘Выберите один из вариантов:’);
Writeln(‘1. Ввод чисел с клавиатуры’);
Writeln(‘2. Генерация случайных чисел’);
Writeln(‘3. Выход из программы’);
Writeln(‘Введите номер выбранного пункта: ’);
ch := readkey;
{Если ввели правильный параметр – выходим из цикла}
if (ch = ‘1’) or (ch = ‘2’) or (ch = ‘3’) then
break;
{Если ввели неправильный параметр – снова меню…}
Clrscr;
writeln(‘Вы ввели неверный номер варианта.’);
writeln;
end;
case ch of
‘1’: {Ввод с клавиатуры}
begin
writeln(‘Введите стороны треугольника’);
write(‘a = ’);
read(a);
write(‘b = ’);
read(b);
write(‘c = ’);
read(c);
end;
‘2’: {Генерация случайных значений}
begin
randomize;
{Для сгенерированных чисел соблюдается условие:}
{любая из сторон меньше суммы двух других.}
a := 6 + random(5); {a = [6..10]}
b := 6 + random(5); {b = [6..10]}
c := 6 + random(5); {c = [6..10]}
end;
‘3’: {Выход из программы}
exit;
end;
{Вывод значений сторон}
writeln(‘a = ‘, a:0:1, ‘, b = ‘, b:0:1, ‘, c = ‘, c:0:1);
{Вычисление площади}
p := (a + b + c) / 2;
s := sqrt(p * (p - a) * (p - b) * (p - c));
{Вывод площади}
writeln(‘s = ‘, s:0:1);
end.
Решение на Си:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float a, b, c; //Стороны треугольника
float p; //Полупериметр треугольника
float s; //Площадь треугольника
char ch; //Выбранный пункт меню
clrscr();
while (1) //Бесконечный цикл
{
printf("Выберите один из вариантов:\n");
printf("1. Ввод чисел с клавиатуры\n");
printf("2. Генерация случайных чисел\n");
printf("3. Выход из программы\n");
printf("Введите номер выбранного пункта: \n");
ch = getch();
//Если ввели правильный параметр - выходим из цикла
if (ch == '1' || ch == '2' || ch == '3') break;
//Если ввели неправильный параметр - снова меню
clrscr();
printf("Вы ввели неверный номер варианта.\n\n");
}
switch (ch)
{
case '1': //Ввод с клавиатуры
printf("Введите стороны треугольника\n");
printf("a = ");
scanf("%f", &a);
printf("b = ");
scanf("%f", &b);
printf("c = ");
scanf("%f", &c);
break;
case '2': //Генерация случайных значений
randomize();
//Для сгенерированных чисел соблюдается условие:
//любая из сторон меньше суммы двух других.
a = 6 + random(5); //a = [6..10]
b = 6 + random(5); //b = [6..10]
c = 6 + random(5); //c = [6..10]
break;
case '3': //Выход из программы
return 0;
}
// Вывод значений сторон
printf("a = %f, b = %f, c = %f\n", a, b, c);
//Вычисление площади
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
//Вывод площади
printf("s = %0.1f", s);
return 0;
}
Сравним выбор в Паскале и в Си:
Паскаль |
Си |
case c of ‘1’: {Ввод с клавиатуры} begin … end; ‘2’: {Генерация случайных} {значений} begin … end; ‘3’: {Выход из программы} exit; end; |
switch (c) { case ‘1’: //Ввод с клавиатуры … break; case ‘2’: //Генерация случайных //значений … break; case ‘3’: //Выход из программы return; }
|
Отличие выбора в Паскале и Си видно из примера и из формального описания синтаксиса:
Паскаль:
case ПЕРЕКЛЮЧАТЕЛЬ of
СПИСОК_КОНСТАНТ_1: ОПЕРАТОР_1;
СПИСОК_КОНСТАНТ_2: ОПЕРАТОР_2;
…
СПИСОК_КОНСТАНТ_N: ОПЕРАТОР_N;
Else ОПЕРАТОР_E;
end
Си:
switch ( ПЕРЕКЛЮЧАТЕЛЬ )
{
case КОНСТАНТА_1: ОПЕРАТОРЫ_1; break;
case КОНСТАНТА_2: ОПЕРАТОРЫ_2; break;
…
case КОНСТАНТА_N: ОПЕРАТОРЫ_N; break;
default: ОПЕРАТОРЫ_E;
}
В Си выбор можно
использовать более сложным способом.
Продемонстрируем на примере: Вводится
число N
(1<=N<=5).
Нужно вычислить и вывести y
=
.
Реализация на Си:
#include <stdio.h>
int main()
{
int n, y;
printf(“Введите N = ”);
scanf(“%d”, &n);
y = 1;
switch (n)
{
case 5: y *= 3;
case 4: y *= 3;
case 3: y *= 3;
case 2: y *= 3;
case 1: y *= 3;
break;
default: y = 0;
}
printf(“y = %d”, y);
return 0;
}
Эту программу наглядно поясняет графическая схема алгоритма:
То есть если в конце варианта выбора не стоит break, то после выполнения кода для этого варианта будет выполняться код для следующего варианта. В нашем примере после кода для варианта case 3 будет выполняться код для варианта case 2.
