Программирование на Паскаль, 1-й курс.
Помогите решить задачи
Ответы
1. function getRealFromString(str: string): real;
var
i: integer;
result: real;
isNegative: boolean;
begin
result := 0;
isNegative := false;
// Проверяем, начинается ли строка с минуса
if str[1] = '-' then
begin
isNegative := true;
i := 2; // Начинаем цикл со второго символа
end
else
begin
i := 1;
end;
// Парсим строку, пока не дойдем до конца или не встретим знак десятичной точки
while (i <= length(str)) and (str[i] <> '.') do
begin
result := result * 10 + (ord(str[i]) - ord('0'));
i := i + 1;
end;
// Если нашли знак десятичной точки, парсим дробную часть
if i <= length(str) then
begin
i := i + 1; // Пропускаем точку
var decimalPlaces := 1;
while i <= length(str) do
begin
result := result + (ord(str[i]) - ord('0')) / power(10, decimalPlaces);
decimalPlaces := decimalPlaces + 1;
i := i + 1;
end;
end;
// Если число было отрицательным, домножаем на -1
if isNegative then
begin
result := result * -1;
end;
getRealFromString := result;
end;
2. В качестве концевого значения можно использовать пустую строку в качестве значения фамилии:
const
MAX_STUDENTS = 100;
type
studentRecord = record
surname: string;
height: real;
end;
var
students: array[1..MAX_STUDENTS] of studentRecord;
numStudents: integer;
i: integer;
begin
numStudents := 0;
i := 1;
// Читаем записи о студентах до тех пор, пока не встретим пустую строку
while not eof do
begin
readln(students[i].surname);
if students[i].surname = '' then
begin
break;
end;
readln(students[i].height);
numStudents := numStudents + 1;
i := i + 1;
end;
end;
После этого можно вычислить средний рост студентов и распечатать информацию о студентах, чей рост больше среднего:
var
averageHeight: real;
i: integer;
begin
// Вычисляем средний рост
averageHeight := 0;
for i := 1 to numStudents do
begin
averageHeight := averageHeight + students[i].height;
end;
averageHeight := averageHeight / numStudents;
begin
// Распечатываем информацию о студентах, чей рост больше среднего
for i := 1 to numStudents do
begin
if students[i].height > averageHeight then
begin
writeln('Фамилия: ', students[i].surname);
writeln('Рост: ', students[i].height);
end;
end;
end;
3. Чтобы продублировать данные о студенте, чей рост ближе к среднему по группе, можно вычислить разность между ростом каждого студента и средним ростом, а затем найти студента с минимальной разностью:
var
minDiff: real;
closestStudent: integer;
begin
// Находим студента с минимальной разностью между ростом и средним ростом
minDiff := abs(students[1].height - averageHeight);
closestStudent := 1;
for i := 2 to numStudents do
begin
var diff := abs(students[i].height - averageHeight);
if diff < minDiff then
begin
minDiff := diff;
closestStudent := i;
end;
end;
// Продублируем запись о студенте с минимальной разностью
writeln('Фамилия: ', students[closestStudent].surname);
writeln('Рост: ', students[closestStudent].height);
end;
4. var
expression: string;
result: real;
begin
writeln('Введите выражение:');
readln(expression);
result := getRealFromString(expression);
writeln('Результат выражения: ', result);
end;