Помогите новичку с задачами
Модератор: Модераторы
Помогите новичку с задачами
Здравствуйте !!! Помогите с решение задачь никак не получаеться
9. Ввести подряд пять чисел. Найти то из них, значение которого ближе всего к среднему арифметическому наибольшего и наименьшего из них.
29. Написать программу, которая после ввода пользователем текущей даты сообщает, какое время года и через сколько дней наступит
9. Ввести подряд пять чисел. Найти то из них, значение которого ближе всего к среднему арифметическому наибольшего и наименьшего из них.
29. Написать программу, которая после ввода пользователем текущей даты сообщает, какое время года и через сколько дней наступит
Покажи чего накропал. Где не получается.
Код: Выделить всё
program zz2;
uses crt;
var
A,B,C,D,F:real;
begin
writeln('введем день');
readln(A);
writeln('введем месяц');
readln(B);
if B>12 then
begin
writeln('некоректно введен месяц');
readln;
end
else
begin
writeln('введем год');
readln(C);
if B=9 then
writeln('осень сентябрь через 3 мес зима');
readln;
end;
begin
if B=10 then
writeln('осень октябрь через 2 мес зима');
readln;
end;
begin
if B=11 then
writeln('осень ноябрь через 1 мес зима');
readln;
if B=6 then
writeln('лето июнь через 3 мес осень');
readln;
end;
begin
if B=7 then
writeln('лето июль через 2 мес осень');
readln;
end;
begin
if B=8 then
writeln('лето август через 1 мес осень');
readln;
end;
begin
if B=5 then
writeln('весна май через 1 мес лето');
readln;
end;
begin
if B=4 then
writeln('весна апрель через 2 мес лето');
readln;
end;
begin
if B=3 then
writeln('весна март через 3 мес лето');
readln;
if B=1 then
writeln('зима январь через 3 мес весна');
readln;
end;
begin
if B=2 then
writeln('зима февраль через 2мес весна');
readln;
end;
begin
if B=12 then
writeln('зима декабрь через 3 мес весна');
readln;
end;
end.ps это то что получилось по 2ой задаче но там как то по дням надо
Добавлено спустя 1 минуту 38 секунд:
и если 1ая очень легкая(для вас)
напишите буду очень благодарен так как пока полный ноль в паскале
-
Kemet
- постоялец
- Сообщения: 241
- Зарегистрирован: 10.02.2010 18:28:32
- Откуда: Временно оккупированная территория
- Контактная информация:
saymonRK писал(а): ps это то что получилось по 2ой задаче но там как то по дням надо
Добавлено спустя 1 минуту 38 секунд:
и если 1ая очень легкая(для вас)
напишите буду очень благодарен так как пока полный ноль в паскале
Так получается, что у Вас проблема не столько с Паскалем (вернее не только), сколько с постановкой задачи и алгоритмизацией.
Вопрос был
Вводить дату лучше начинать с года, потом месяц и день. И все введенное проверять на правильность. В цикле repeat until..; Пока правильное значение не будет введено. Это для начала. Перепиши. Пойдем дальше разбирать.
а не через сколько месяцев.какое время года и через сколько дней наступит
Вводить дату лучше начинать с года, потом месяц и день. И все введенное проверять на правильность. В цикле repeat until..; Пока правильное значение не будет введено. Это для начала. Перепиши. Пойдем дальше разбирать.
-
Kemet
- постоялец
- Сообщения: 241
- Зарегистрирован: 10.02.2010 18:28:32
- Откуда: Временно оккупированная территория
- Контактная информация:
Думаю, что названия месяцев и времён года лучше занести в массив, например
Так как нам нужно знать, к кокому времени года относится тот или иной месяц, также можно завести еще один массив:
(MonthToSeason[НомерМесяца], SeasonNames[MonthToSeason[НомерМесяца]])...
Для определения, номера месяца, с которого начинается следующий сезон также заведем массив, но нужно учитывать в дальнейшем, что для декабря следующий сезон начнется в следующем году
(StartNextSeason[MonthToSeason[НомерМесяца]])...
...
StartNextSeason: array [1..4] of integer = (3,6,9,12);
Ну и понятно, что месяц начинается с 1-го числа, год нам почти всегда известен, за исключением, когда следующий сезон будет в следующем году.
Нужно собрать из дня, месяца и года две даты и получить разницу в днях...
Код: Выделить всё
VAR
MonthNames: array [1..12] of string = ('январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
SeasonNames: array [1..4] of string = ('зима','весна','лето','осень');
Так как нам нужно знать, к кокому времени года относится тот или иной месяц, также можно завести еще один массив:
Код: Выделить всё
MonthToSeason: array [1..12] of integer = (1,1,2,2,2,3,3,3,4,4,4,1);
(MonthToSeason[НомерМесяца], SeasonNames[MonthToSeason[НомерМесяца]])...
Для определения, номера месяца, с которого начинается следующий сезон также заведем массив, но нужно учитывать в дальнейшем, что для декабря следующий сезон начнется в следующем году
Код: Выделить всё
StartNextSeason: array [1..4] of integer = (3,6,9,12);
(StartNextSeason[MonthToSeason[НомерМесяца]])...
...
StartNextSeason: array [1..4] of integer = (3,6,9,12);
Ну и понятно, что месяц начинается с 1-го числа, год нам почти всегда известен, за исключением, когда следующий сезон будет в следующем году.
Нужно собрать из дня, месяца и года две даты и получить разницу в днях...
А я предлагаю ИГНОРИРОВАТЬ темы с _НЕ_ ИНФОРМАТИВНЫМИ ЗАГОЛОВКАМИ! Да еще и КАПСОМ.
Тему исправил. Все пожелания для модераторов просьба оставлять либо через жалобу на сообщение, либо в личку. padre_mortius
Тему исправил. Все пожелания для модераторов просьба оставлять либо через жалобу на сообщение, либо в личку. padre_mortius
- Paster Fob
- постоялец
- Сообщения: 188
- Зарегистрирован: 22.02.2011 20:53:36
- Откуда: Новосибирск.
1-ое задание
что-то типа этого.
Код: Выделить всё
var mas:array[1..5] of real;
i:integer;
min,max,n:real;
begin
for i:=1 to 5 do
readln(mas[i]);
n:=0;
for i:=1 to 5 do
n:=n+mas[i];
n:=n/5;min:=0;max:=100;
for i:=1 to 5 do begin
if (mas[i]>min) and (mas[i]<n) then
min:=mas[i];
if (mas[i]<max) and (mas[i]>n) then
max:=mas[i];
end;
writeln('среднее арифметическое ',n:2:2);
writeln('минимальное ',min:2:2);
writeln('максимальное ',max:2:2);
readln
end.что-то типа этого.
Код: Выделить всё
min:=0; max:=100;
for i:=1 to 5 do begin
Во 2-ых, проще использовать одно из заданных чисел, например, первое:
Код: Выделить всё
min:=mas[1]; max:=mas[1];
for i:=2 to 5 do begin
В 3-х, в задаче предлагалось также найти самое близкое к (min+max)/2. То есть, в первом приближении что-то типа:
Код: Выделить всё
program task9;
const
COUNT = 5;
var
m: array [1..COUNT] of Real;
min, max, avg, delta: Real;
i: Integer;
begin
WriteLn('Введите 5 чисел через пробел:');
for i:=1 to COUNT do Read(m[i]);
min:=m[1]; max:=m[1];
for i:=2 to COUNT do
if m[i]<min then min:=m[i]
else if m[i]>max then max:=m[i];
avg:=(min+max)/2;
delta:=abs(m[1]-avg);
for i:=2 to COUNT do
if abs(m[i]-avg)<delta then delta:=abs(m[i]-avg);
WriteLn('Наименьшее: ', min:0:2, ', наибольшее: ', max:0:2, ', их среднее: ', avg:0:2);
Write('Ближайшие к среднему:');
for i:=1 to COUNT do
if abs(m[i]-avg)<=delta then Write(' ', m[i]:0:2);
WriteLn;
end.
Код: Выделить всё
$ ./task9
Введите 5 чисел через пробел:
1 3 4 5 6
Наименьшее: 1.00, наибольшее: 6.00, их среднее: 3.50
Ближайшие к среднему: 3.00 4.00
- Paster Fob
- постоялец
- Сообщения: 188
- Зарегистрирован: 22.02.2011 20:53:36
- Откуда: Новосибирск.
1)Я,в отличии от тс хотя бы попытался решить.
2)Тем более только учусь.
2)Тем более только учусь.
Paster Fob,
если показалось, что замечания адресованы вам лично, прошу прощения, ничего личного, речь была только о коде.
Например, случай с min:=0. Если все введённые числа окажутся больше 0, то min так и останется равным 0, а не станет равным минимальному элементу из введённых. С другой стороны, если в качестве начального значения min задать максимальное для этого типа число, то на шаге i=1 ему будет присвоено первое из введённых значений, которое на последующих шагах будет сравниваться с остальными введёнными значениями. Именно поэтому в качестве начального значения наиболее безопасно использовать один из введённых элементов. Вариант с максимальным для типа значением по-прежнему удобно использовать, когда обработку переносят непосредственно в цикл ввода значений, отпадает необходимость в специальной обработке первой итерации.
Для чего потребовалось сравнение mas[i] со средним (n) я, если честно, не понял.
А учиться приходится всю жизнь, так уж выходит.
если показалось, что замечания адресованы вам лично, прошу прощения, ничего личного, речь была только о коде.
Например, случай с min:=0. Если все введённые числа окажутся больше 0, то min так и останется равным 0, а не станет равным минимальному элементу из введённых. С другой стороны, если в качестве начального значения min задать максимальное для этого типа число, то на шаге i=1 ему будет присвоено первое из введённых значений, которое на последующих шагах будет сравниваться с остальными введёнными значениями. Именно поэтому в качестве начального значения наиболее безопасно использовать один из введённых элементов. Вариант с максимальным для типа значением по-прежнему удобно использовать, когда обработку переносят непосредственно в цикл ввода значений, отпадает необходимость в специальной обработке первой итерации.
Для чего потребовалось сравнение mas[i] со средним (n) я, если честно, не понял.
А учиться приходится всю жизнь, так уж выходит.
- Paster Fob
- постоялец
- Сообщения: 188
- Зарегистрирован: 22.02.2011 20:53:36
- Откуда: Новосибирск.
bormant писал(а):случай с min:=0. Если все введённые числа окажутся больше 0, то min так и останется равным 0, а не станет равным минимальному элементу из введённых
как я понял задание так и решил.Найти среднее и близкое к нему минимальное и максимальное.Допустим ввели 1 2 3 4 5,среднее получилось 3 значит мин. близкое 2,а макс. 4.Вот что делает мой код.Или не так надо было?
.Для нахождения числа которое ближе всего к среднему значению.Если элемент массива больше самого минимального числа т.е. 0 и меньше среднего,то минимальному присваивается этот элемент массива,то же и с максимальным.Что непонятного-то?bormant писал(а):Для чего потребовалось сравнение mas[i] со средним (n) я, если честно, не понял.
В вашей постановке задачи логика становится понятна: min -- это ближайшее к среднему слева, max -- ближайшее справа.
Теперь рассмотрите, что будет, если
1) ввели: -1 -2 -3 -4 -5 (min останется равным 0, хотя этого числа нет среди введённых)
2) ввели: 101 102 103 104 105 (max останется равным 100, хотя этого числа нет среди введённых)
Действительно, написанное мной выше про начальные значения max и min не совсем ложатся на ваше условие и реализацию, поскольку ваш min -- это максимальное значение не выше среднего, а max -- минимальное значение, не выше среднего. Но с учётом этой оговорки -- вполне применимо.
Отдельный вопрос о том, что ближе к трём, два/четыре или три. Если расстояние определено как |a-b| (модуль разности), то расстояние до 3 от 3 меньше чем от 2 или 4. То есть ваше условие должно было содержать оговорку вроде: найти среднее и близкое к нему минимальное и максимальное, не равное среднему.
По поводу самой задачи в исходной постановке. Требовалось найти значение, которое ближе всего к среднему арифметическому наибольшего и наименьшего из 5 чисел. То есть, если min -- минимальное из 5 чисел, а max -- максимальное из них, то требовалось найти ближайшее к их (max и min) среднему, то есть к (min+max)/2.
Теперь рассмотрите, что будет, если
1) ввели: -1 -2 -3 -4 -5 (min останется равным 0, хотя этого числа нет среди введённых)
2) ввели: 101 102 103 104 105 (max останется равным 100, хотя этого числа нет среди введённых)
Действительно, написанное мной выше про начальные значения max и min не совсем ложатся на ваше условие и реализацию, поскольку ваш min -- это максимальное значение не выше среднего, а max -- минимальное значение, не выше среднего. Но с учётом этой оговорки -- вполне применимо.
Отдельный вопрос о том, что ближе к трём, два/четыре или три. Если расстояние определено как |a-b| (модуль разности), то расстояние до 3 от 3 меньше чем от 2 или 4. То есть ваше условие должно было содержать оговорку вроде: найти среднее и близкое к нему минимальное и максимальное, не равное среднему.
По поводу самой задачи в исходной постановке. Требовалось найти значение, которое ближе всего к среднему арифметическому наибольшего и наименьшего из 5 чисел. То есть, если min -- минимальное из 5 чисел, а max -- максимальное из них, то требовалось найти ближайшее к их (max и min) среднему, то есть к (min+max)/2.
