Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Изучение Си после Паскаля.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.01 Mб
Скачать

Варианты для сложных заданий

Вариант 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) Организация простейшего меню

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

Выберите один из вариантов:

  1. Ввод чисел с клавиатуры

  2. Генерация случайных чисел

  3. Выход из программы

Введите номер выбранного пункта:___

Меню в программе удобно реализовывать через оператор ВЫБОР (В Паскале 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.