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,' лет.');
2а) В той же программе часть условий можно не писать (тут в проверке используется максимальное значение для типа byte, поэтому если менять тип, то нужно менять и это значение):
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 ? ' год.' : ' года.'))
Объяснение:
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 ? ' год.' : ' года.'))