Помогите новичку с задачами

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Помогите новичку с задачами

Сообщение saymonRK » 02.05.2012 16:29:33

Здравствуйте !!! Помогите с решение задачь никак не получаеться

9. Ввести подряд пять чисел. Найти то из них, значение которого ближе всего к среднему арифметическому наибольшего и наименьшего из них.
29. Написать программу, которая после ввода пользователем текущей даты сообщает, какое время года и через сколько дней наступит
saymonRK
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.05.2012 16:02:07

Re: FREE PASCAL

Сообщение vada » 02.05.2012 16:43:20

Покажи чего накропал. Где не получается.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: FREE PASCAL

Сообщение NTFS » 02.05.2012 16:57:48

Первая задача примитив на уровне 10 класса средней школы.

А вот вторая, если не использовать библиотеку, довольно нетривиальна.

Код покажите, который у вас не работает?
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: FREE PASCAL

Сообщение saymonRK » 02.05.2012 17:32:04

Код: Выделить всё
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ая очень легкая(для вас)
напишите буду очень благодарен так как пока полный ноль в паскале
saymonRK
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.05.2012 16:02:07

Re: FREE PASCAL

Сообщение Kemet » 02.05.2012 22:16:58

saymonRK писал(а): ps это то что получилось по 2ой задаче но там как то по дням надо

Добавлено спустя 1 минуту 38 секунд:
и если 1ая очень легкая(для вас)
напишите буду очень благодарен так как пока полный ноль в паскале

Так получается, что у Вас проблема не столько с Паскалем (вернее не только), сколько с постановкой задачи и алгоритмизацией.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: FREE PASCAL

Сообщение vada » 03.05.2012 09:51:58

Вопрос был
какое время года и через сколько дней наступит
а не через сколько месяцев.
Вводить дату лучше начинать с года, потом месяц и день. И все введенное проверять на правильность. В цикле repeat until..; Пока правильное значение не будет введено. Это для начала. Перепиши. Пойдем дальше разбирать.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: FREE PASCAL

Сообщение Kemet » 03.05.2012 13:17:17

Думаю, что названия месяцев и времён года лучше занести в массив, например
Код: Выделить всё
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-го числа, год нам почти всегда известен, за исключением, когда следующий сезон будет в следующем году.
Нужно собрать из дня, месяца и года две даты и получить разницу в днях...
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: FREE PASCAL

Сообщение ViTality » 03.05.2012 15:32:52

А я предлагаю ИГНОРИРОВАТЬ темы с _НЕ_ ИНФОРМАТИВНЫМИ ЗАГОЛОВКАМИ! Да еще и КАПСОМ.

Тему исправил. Все пожелания для модераторов просьба оставлять либо через жалобу на сообщение, либо в личку. padre_mortius
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Re: FREE PASCAL

Сообщение Paster Fob » 03.05.2012 17:47:35

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.

что-то типа этого.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Помогите новичку с задачами

Сообщение bormant » 04.05.2012 14:31:20

Код: Выделить всё
min:=0; max:=100;
for i:=1 to 5 do begin
Во 1-ых, в таком случае min должен быть заведомо больше или равен, а max -- заведомо меньше или равен min/max из 5 чисел.
Во 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
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Помогите новичку с задачами

Сообщение Paster Fob » 05.05.2012 13:53:20

1)Я,в отличии от тс хотя бы попытался решить.
2)Тем более только учусь.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Помогите новичку с задачами

Сообщение bormant » 06.05.2012 14:13:47

Paster Fob,
если показалось, что замечания адресованы вам лично, прошу прощения, ничего личного, речь была только о коде.

Например, случай с min:=0. Если все введённые числа окажутся больше 0, то min так и останется равным 0, а не станет равным минимальному элементу из введённых. С другой стороны, если в качестве начального значения min задать максимальное для этого типа число, то на шаге i=1 ему будет присвоено первое из введённых значений, которое на последующих шагах будет сравниваться с остальными введёнными значениями. Именно поэтому в качестве начального значения наиболее безопасно использовать один из введённых элементов. Вариант с максимальным для типа значением по-прежнему удобно использовать, когда обработку переносят непосредственно в цикл ввода значений, отпадает необходимость в специальной обработке первой итерации.

Для чего потребовалось сравнение mas[i] со средним (n) я, если честно, не понял.

А учиться приходится всю жизнь, так уж выходит.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Помогите новичку с задачами

Сообщение Paster Fob » 06.05.2012 21:39:33

bormant писал(а):случай с min:=0. Если все введённые числа окажутся больше 0, то min так и останется равным 0, а не станет равным минимальному элементу из введённых

как я понял задание так и решил.Найти среднее и близкое к нему минимальное и максимальное.Допустим ввели 1 2 3 4 5,среднее получилось 3 значит мин. близкое 2,а макс. 4.Вот что делает мой код.Или не так надо было?
bormant писал(а):Для чего потребовалось сравнение mas[i] со средним (n) я, если честно, не понял.
.Для нахождения числа которое ближе всего к среднему значению.Если элемент массива больше самого минимального числа т.е. 0 и меньше среднего,то минимальному присваивается этот элемент массива,то же и с максимальным.Что непонятного-то?
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Помогите новичку с задачами

Сообщение bormant » 08.05.2012 12:26:54

В вашей постановке задачи логика становится понятна: 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.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru