Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2014, 13:08   #1
Adelia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию Олимпиадная задача

Всем,здравствуйте)
В школе прошла олимпиада по программированию и никак не получилась одна задачка .Вроде бы все верно делаю,но результата Pascal не выдает)
Решение у меня ,конечно,корявое,но свое.

Подскажите,пожалуйста в чем моя ошибка.

вот текст задачи:
LESSON. В первом полугодии 2007-08 учебного года занятия проходят с 1 по 8 и с 10 по 17 недели (девятая неделя - каникулы). В расписании одного из классов пять дней в неделю (с понедельника по пятницу) происходит по шесть уроков ежедневно, всего 480 уроков за полугодие. Все эти уроки пронумерованы. Составьте программу, определяющую, на какой неделе и какой день недели проходит урок с данным номером N.

Из входного файла считывается целое число - номер урока N(от 1 до 480). В выходной файл выводятся номер недели и название дня (на украинском, русском или английском языке)

Пример
239 Week 8 Friday


Вот мое решение: (p.s. сначала сделала с двумерным массивом и все проходит,но только получается что в день по одному уроку,а не по 6)

Код:
uses crt;
var a:array [1..1000,1..1000,1..1000] of integer;
    i,j,c:byte;
    f:text;
    k,N:integer;
begin
assign(f,'c:\Users\ПК\Desktop\Input.txt');
reset(f);
read(f,N);
 close(f); 
k:=1;

for i:=1 to 17 do {недели}
  for j:=1 to 5 do {дни}
   for c:=1 to 6 do {уроки}
     begin 
     if i<>9 then {на 9 недели каникулы}
     a[i,j,c]:=k;{k  число,отвечает за номер урока
                  если,например, номер урока 2 то у член массива равен 2,а i,j указывают неделю и день}
     k:=k+1;
     end; 
   
 writeln(k);

assign(f,'c:\Users\ПК\Desktop\Output.txt');
rewrite(f);

for i:=1 to 17 do
  for j:=1 to 5 do
   for c:=1 to 6 do
  if a[i,j,c]=N then 
    case j of
    1:writeln(f,'week ',i,' monday');
    2:writeln(f,'week ',i,' tuesday');
    3:writeln(f,'week ',i,' wednesday');
    4:writeln(f,'week ',i,' trustday');
    5:writeln(f,'week ',i,' friday');
   end;
  close(f);  
 end.
Заранее спасибо за помощь)))




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 06.11.2014 в 13:42.
Adelia вне форума Ответить с цитированием
Старый 06.11.2014, 13:37   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

День добрый, честно говоря в код и условие не вникал,но ваши шансы на помощь форумчан увеличатся,
если вы отформатируете код:
с помощью тега CODE;
с помощью отступов;

кроме того, меня сильно смущает строчка
Код:
var a:array [1..1000,1..1000,1..1000] of integer;
тысяча * тысячу * тысяча - итого массив на МИЛЛИАРД элементов,
под каждый элемент 2 байта, т.о. у вас одной памяти требуется почти 2 Гб...
никакая олимпиадная задача этого точно не требует
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.

Последний раз редактировалось Niro; 06.11.2014 в 13:40.
Niro вне форума Ответить с цитированием
Старый 06.11.2014, 14:04   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Adelia, а зачем всё так сложно то?!!!
циклы, массивы, к чему это всё?!

смотрите, за первые 8 недель проходит ровно 240 уроков.
по 30 уроков в неделю (5 дней * 6 уроков).
значит, если мы возьмём номер урока, целочисленно разделим на 30, и к полученному числу (частрое) прибавим единицу, то мы получим номер НЕДЕЛИ.

(если номер урока больше 240, то к полученному номеру недели нужно добавить единицу - тем самым мы пропускаем 9 (каникулярную) неделю).

День недели определить так же просто. целочисленно разделим номер урока на 30 и возьмём ОСТАТОК, то получим, какой это урок по порядку на данной неделе.
Теперь это число целочисленно разделим на 6 (число уроков в день) - это и будет номер дня недели (считая, что ноль - это понедельник, 1 - это вторник и т.д.

один нюанс. для расчётов нам удобно брать порядковый номер урока, считая от нуля (т.е. первый урок - нулевой, второй урок - первый и т.д..
для этого в расчётах просто вычтем единицу из N.

в коде это может выглядеть так:
Код:
const DayWeek : array[0..4] of string = 
  ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday');

var N, w, d : integer;
begin
  Read(N);

  w := ((N-1) div 30) + 1;
  if N > 240 then Inc(w); {пропускаем 9-ю неделю}

  d := ((N-1) mod 30)  div 6;

  WriteLn('Week ',w,' ',DayWeek[d]);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2014, 14:35   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
тысяча * тысячу * тысяча - итого массив на МИЛЛИАРД элементов,
1. Вполне достаточно
Код:
a: array[1..17{недели},1..5{дни},1..6{уроки}] of integer;
Цитата:
(p.s. сначала сделала с двумерным массивом и все проходит,но только получается что в день по одному уроку,а не по 6)
Код:
a: array[1..17, 1..5, 0..1] of integer;

for i:=1 to 17 do
for j:=1 to 5 do
begin
  ............
  a[i,j,0]:=k;///первый в этот день
  a[i,j,1]:=k+5;///последний в этот день
  k:=k+6;
  ............
end; 

...............
if (a[i,j,0]<=N) and (N<=a[i,j,1]) then //от  первого до последнего
Код:
if (a[i,j,0]<=N) and (N <  a[i,j,0]+6) then //это тоже от первого до последнего поскольку первый+6 =первый на следующий день \который нам не нужен\
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.11.2014 в 14:40.
evg_m вне форума Ответить с цитированием
Старый 06.11.2014, 14:45   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m
1. Вполне достаточно
Так. Стоп.

evg_m, Вы мне можете объяснить, ЗАЧЕМ здесь вообще нужны массивы?!!

чем решение из пост #3 (без массивов и циклов) не подходит?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2014, 16:26   #6
Adelia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию

Всем спасибо за подсказки))
На счет
Код:
var a:array [1..1000,1..1000,1..1000] of integer;
я и правда переборщила)
Adelia вне форума Ответить с цитированием
Старый 07.11.2014, 11:58   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
evg_m, Вы мне можете объяснить, ЗАЧЕМ здесь вообще нужны массивы?!!
только затем как можно исправить без полного переписывания
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.11.2014, 15:28   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m
как можно исправить без полного переписывания
теперь понятно. спасибо за разъяснение!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Олимпиадная задача. (C#) Nekro95 Помощь студентам 4 20.10.2013 14:39
Олимпиадная задача 2 СергейАстрахань Помощь студентам 3 31.01.2013 16:46
Олимпиадная задача. masashama Общие вопросы C/C++ 19 27.10.2011 14:52
олимпиадная задача danzel1 Общие вопросы C/C++ 2 21.10.2011 15:15
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07