До ть Спортсмен на тренуванні ставить собі за мету пробігти певну кількість кілометрів, підраховуючи після кожного круга, чи не пора припинити тренування. Виберіть тип циклу, який найбільше підходить для вирішення задачі.
а) цикл з короткою умовою
б) цикл з параметром
в) цикл з складною умовою
Объяснение:
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
*Лабораторная работа: 7.
*Тема: Строки и файлы. Организация работы со строками и файлами.
*Пункт: 5.2. Файловый тип данных.
*Файл: Lab07_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 06.01.2020.
*
*Вариант: 13.
*Защита: 15.11.2019.
*Задание: БН. Написать программу, которая считывает Английский текст из файла и выводит его на экран, заменив каждую первую букву слов,
* начинающихся с гласной буквы, на прописную.
*/
#include <iostream> // Треб. для SETLOCATE, PRINTF, GETLINE, STRLEN, CIN, COUT. //
#include <fstream> // Требуется для FSTREAM. //
#include "Header.h"
void main () {
setlocale (LC_ALL, "Russian");
char SourceArray [Dimension + 1] = " "; // SOURCEARRAY [100] = 101 (для "\0"). //
char LettersArray [Dimension - 72] = " "; // [0]..[25] = 1..26 (для ввода с клавиатуры), [26] = 27
char PathTextFile [Dimension + 1] = " "; // (для "\0"). //
printf ("1. Латинский алфавит (26 букв): a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z.\n\n2. Введите"
" путь и имя файла (до %d символов, включительно): ", Dimension);
cin.getline (PathTextFile, Dimension);
fstream TextFile (PathTextFile, ios::trunc | ios::in | ios::out); // TRUNC - создание, IN - режим записи, OUT - режим чтения. //
if (!TextFile) {
MessageFunction (); // Выводится на экран, если файл открыть не удалось. //
}
printf ("\n3. Введите строчные Латинские буквы, которые следует заменить на прописные (до %d символов, включительно):\n\n",
Dimension - 73);
cin.getline (LettersArray, Dimension - 72);
if (strlen (LettersArray) < 1) {
TextFile.close (); // Закрытие файла. //
MessageFunction ();
}
printf ("\n4. Введите строку (до %d символов, включительно):\n\n", Dimension);
cin.getline (SourceArray, Dimension);
if (strlen (SourceArray) < 1) {
TextFile.close (); // Закрытие файла. //
MessageFunction ();
}
TextFile << SourceArray; // Запись SOURCEARRAY в файл. //
TextFile.close (); // Закрытие файла. //
ChangeFunction (LettersArray, PathTextFile);
printf ("\n5. Исходная строка после замены:\n\n");
WriteArrayFunction (PathTextFile);
remove (PathTextFile); // Удаление файла. //
cout << endl << endl;
ExitProgramFunction ();
}
Получается, зависит от последних цифр возраста:
1) "лет" -если последняя цифра 0,5,6,7,8,9 или две цифры 05÷20
а остальные (не попавшие в первое условие) именуются так:
2) "год" -если последняя цифра 1
3) "года" -если последняя цифра 2,3,4
Вот несколько вариантов программы (проверял в PascalABC.NET 3.4.2.1837, и часть программ будет работать только там):
1) Вариант с самыми простыми и известными операторами (для начинающих и для совместимости с другими версиями Pascal). Поэтому: используются только if-then-else, составной оператор (блок) begin-end, операции сравнения, обычные ввод и вывод, и переменные типов integer и string; не используются логические операции. Правда, есть операции нахождения остатка от деления на 10 и на 100 (n mod 10 и n mod 100). Если вы их не проходили, то остаток можно вычислять, используя функции, возвращающие целую часть числа: n-Int(n/10)*10 и n-Int(n/100)*100 или n-Trunc(n/10)*10 и n-Trunc(n/100)*100. Всё это нужно для получения последней цифры числа (или двух последних цифр).
var
n: integer;
s: string;
begin
write('Введите возраст: ');
read(n);
if n < 0 then write('Недопустимый возраст.') else
if n > 120 then write('Недопустимый возраст.') else
begin
s := ' лет.';
if n mod 10 >= 2 then
if n mod 10 <= 4 then s := ' года.';
if n mod 10 = 1 then s := ' год.';
if n mod 100 >= 5 then
if n mod 100 <= 20 then s := ' лет.';
write('Вам ', n, s);
end;
end.
2) Вариант с использованием оператора выбора (case) и диапазонов значений. Я начинал с этого варианта, и тут я записал все диапазоны значений возраста до 120 лет (я не вспомнил общих правил написания лет-год-года в зависимости от количества лет, поэтому перебрал все возраста, проверяя написание на слух :)
Здесь и далее использована переменная типа byte (целые значения от 0 до 255, размер 1 байт). Если использовать тип integer, то по идее надо проверять на отрицательные значения, которые возможны при вводе для этого типа. Хотя, можно конечно считать, что вводить будут всегда правильно, и делать проще - не проверять это вообще (тогда пойдёт и integer). Если так упрощать, то можно не проверять и на возраст больше 120 лет.
Кроме byte, с той же целью можно использовать word (2 байта, 0..65535) или longword (4 байта, 0..4294967295), если вы их проходили. Правда, они слегка избыточны для этой задачи.
var n: byte;
begin
write('Введите возраст: ');
read(n);
case n of 0,5..20,25..30,35..40,45..50,55..60,65..70,75..80,85..90,95..100,105..120: write('Вам ',n,' лет.');
1,21,31,41,51,61,71,81,91,101: write('Вам ',n,' год.');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,82..84,92..94,102..104: write('Вам ',n,' года.');
else write('Недопустимый возраст.');
end;
end.
2а) В той же программе часть условий можно не писать (тут в проверке используется максимальное значение для типа byte, поэтому если менять тип, то нужно менять и это значение):
var n: byte;
begin
write('Введите возраст: ');
read(n);
case n of
121..255: write('Недопустимый возраст.');
1,21,31,41,51,61,71,81,91,101: write('Вам ',n,' год.');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,82..84,92..94,102..104: write('Вам ',n,' года.');
else write('Вам ',n,' лет.');
end;
end.
3) Тут остаток от деления на 10 проверяется на принадлежность к множеству указанных остатков. Ещё, есть логическая операция (or):
var n: byte;
begin
write('Введите возраст: ');
read(n);
if n>120 then write('Недопустимый возраст.') else
if (n mod 10 in [0,5..9]) or (n mod 100 in [5..20]) then write('Вам ',n,' лет.') else
if n mod 10 = 1 then write('Вам ',n,' год.') else write('Вам ',n,' года.')
end.
4) И напоследок, вариант с условной операцией (условие ? выражение1 : выражение2), конвертацией из строки в byte (и прочими непотребствами :) Лишние пробелы ужаты, поэтому всё не очень читаемо.
begin
var n:=byte.Parse(ReadString('Введите возраст:'));
write('Вам ',n>120?'многовато лет':n+' '+((n mod 10in[5..9,0])or(n mod 100in[5..20])?'лет':n mod 10=1?'год':'года'),'.')
end.
Отдельно, строка с выводом (более читаемо, без ужатия пробелов):
write('Вам ', n>120 ? 'многовато лет' : n + ' ' + ((n mod 10 in [5..9,0]) or (n mod 100 in [5..20]) ? 'лет' : n mod 10 = 1 ? 'год' : 'года'), '.')
Хотя, если перенести пробел и точку в сами сообщения, то строка даже чуть короче станет:
write('Вам ', n>120 ? 'многовато лет.' : n + ((n mod 10 in [5..9,0]) or (n mod 100 in [5..20]) ? ' лет.' : n mod 10 = 1 ? ' год.' : ' года.'))