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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 14:30   #1
maxwel6064
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 28
По умолчанию Работа с файлами

Всем привет. Нужна ваша помощь с решением задачи на паскале. Вот условие:

Есть показания недельной температуры в 3 городах страны. Нужно сделать программу, которая посчитает среднюю недельную температуру. В файле данных на первой строчке указано количество городов, затем 7 цифр - температура. Результат нужно записать в спец.файл, по 2 числа: 1 число - номер города, 2 число - средняя температура, с точностью до 3 цифр после запятой.

Начальные данные:
Код HTML:
3
-5 -7 -5 0 1 -6 –9
-2 -2 0 1 -4 -7 -7
-8 -5 -4 -1 0 -2 -5
Вот пробовал начать писать программу, но что-то выдает совсем не те числа.

Код HTML:
program Bevarde2;
 var Df,Rf:text;
 n,i,k:integer;
  sum, sr:real;
  temp:array[1..50] of integer;
begin
sum:=0;
  Assign(Df,'duom.txt');
  Reset(Df);
  Read(Df,n);
  for i:=1 to n do begin
  Read(Df,temp[i]);
  sum:=sum+temp[i]/temp[i];


  end;
  Close(Df);
  
  Assign(Rf,'rez.txt');
  Rewrite(Rf);
  writeln(Rf,sum:3:3);
  Close(Rf);
end.
Сам конечно понимаю, что задача слишком легкая, но все же, почему-то сегодня немного туплю... буду очень благодарен за помощь. Заранее спасибо. Кстати, в программе нельзя использовать функции и процедуры.
maxwel6064 вне форума Ответить с цитированием
Старый 01.11.2011, 15:10   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Я бы сделал примерно так (массив здесь использовать необязательно)
Код:
program Bevarde2;
var Df,Rf:text;
    n,i,k:integer;
    s:real;
    temp:integer;
begin
  Assign(Df,'duom.txt');
  Reset(Df);
  Assign(Rf,'rez.txt');
  Rewrite(Rf);
  Read(Df,n);
  for i:=1 to n do begin
    s := 0;
    for k := 1 to 7 do Begin
      Read(Df,temp);
      s := s + temp;
    end;
    s := s / 7;
    writeln(Rf,i,' ',s:3:3);
  end;
  Close(Df);
  Close(Rf);
end.
и ещё в ваших исходных данных. для первого города последняя температура -9 там сам значёк - это на самом деле не минус это символ с другим кодом. Сотрите этот значёк и заново сами напишите.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 06.11.2011, 12:29   #3
maxwel6064
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 28
По умолчанию

Решил не создавать новую тему, а здесь задать вопрос по поводу очередной задачи. Вот условие:

Учительница начальных классов решила подготовить задания, которые помогли бы помочь проверить, как дети могут складывать, вычитать, делить и умножать. Чтобы ей было быстрее, она попросила помочь программистов. Учительница указала границы двух чисел [x1;x2] и сказала, что каждый ученик получит четыре задания(сложение, вычитание, умножение, деление без остатка).
Создать программу, которая из начальных данных прочтет 2 числа x1,x2, а в файл результата будут записаны всевозможные действия с цифрами.

Код:
Начальные данные:
3 10
В файле результата должно быть следующее:

Код:
6+3=9
6-3=3
6*3=18
6/3=2
********
8+4=12
8-4=4
8*4=32
8/4=2
********
9+3=12
9-3=6
9*6=27
9/3=3
********
10+5=15
10-5=5
10*5=50
10/5=2
********
Вот я начал делать задачу, однако он мне делает операцию только с 2 числами - 3 и 10. В общем, не могли бы вы объяснить задачу немного и помочь ее сделать. В условии задачи я что-то не понимаю или неправильный сам файл результатов в самом условии.

Мой код:
Код:
program Noname0;
 var Df,Rf:text;
 i,x1,x2:integer;
 rez1,rez2,rez3,rez4:integer;
begin
  Assign(Df,'duom.txt');
  Reset(Df);
  Readln(Df,x1,x2);
  for i:=x2 downto x1 do begin
  rez1:=x2+x1;
  rez2:=x2-x1;
  rez3:=x2*x1;
  rez4:=x2 div x1;
  end;
  Close(Df);
  
  Assign(Rf,'rez.txt');
  Rewrite(Rf);
  Writeln(Rf,rez1);
  Writeln(Rf,rez2);
  Writeln(Rf,rez3);
  Writeln(Rf,rez4);
  Close(Rf);
end.
Заранее премного благодарен за вашу помощь.
maxwel6064 вне форума Ответить с цитированием
Старый 06.11.2011, 14:45   #4
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Код:
program Noname0;
 var Df,Rf:text;
 i,j,x1,x2:integer;
begin
  Assign(Df,'duom.txt');
  Reset(Df);
  Readln(Df,x1,x2);
  Close(Df);
  if (x1<=0) then x1 := 1;
  Assign(Rf,'rez.txt');
  Rewrite(Rf);
  for i := x1+1 to x2 do
    for j := x1 to i-1 do
      if ((i mod j)=0) then Begin
        Writeln(Rf,i,'+',j,'=',i+j);
        Writeln(Rf,i,'-',j,'=',i-j);
        Writeln(Rf,i,'*',j,'=',i*j);
        Writeln(Rf,i,'/',j,'=',i div j);
        Writeln(Rf,'********');
      end;
  Close(Rf);
end.
сори нет времени обьяснять. В общем фишка в том чтобы проверить чтобы остаток от деления был равен 0.

есть ещё решение более оптимальное по скорости. Оно выдаёт теже результаты но в другом порядке.
Код:
program Noname0;
 var Df,Rf:text;
 i,j,x1,x2:integer;
begin
  Assign(Df,'duom.txt');
  Reset(Df);
  Readln(Df,x1,x2);
  Close(Df);
  if (x1<=0) then x1 := 1;
  Assign(Rf,'rez.txt');
  Rewrite(Rf);
  for j := x1 to x2 div 2 do begin
    i := 2 * j;
    while (i<=x2) do Begin
      Writeln(Rf,i,'+',j,'=',i+j);
      Writeln(Rf,i,'-',j,'=',i-j);
      Writeln(Rf,i,'*',j,'=',i*j);
      Writeln(Rf,i,'/',j,'=',i div j);
      Writeln(Rf,'********');
      i := i+j;
    end;
  end;
  Close(Rf);
end.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 06.11.2011 в 15:15.
val_nnm вне форума Ответить с цитированием
Старый 06.11.2011, 16:08   #5
maxwel6064
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 28
По умолчанию

val_nnm, если появится время, напишите пожалуйста как решали эту задачу. А то по вашему коду мне не совсем понятно... Если сможете, напишите в ЛС подробнее.
maxwel6064 вне форума Ответить с цитированием
Старый 06.11.2011, 16:47   #6
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Попробую обьяснить по быстрому.
Договоримся первое число в выражении называть i а второй j
1) Из условия что деление должно быть без остатка (т.е. отстаток от деления i на j должен быть равен 0)
2) Из примера видно что учительнице нехочет видить примеры вида 3/3 4/4 5/5 и.т.д. (т.е. можно сказать что i неравно j)

из обоих условий можно также сказать что i>j ( если i=j то это противоречит 2му условию, а если i<j то тогда невозможно без остатка разделить i на j)

кроме того з этого условия i неможет быть меньше или равное x1 (т.к. бесполезно делать x1/x1 из за 2го условия)
Поэтому for i := x1+1 to x2 do начинаем с x1+1 и в нём i последовательно принимает значения (для приведённого примера) 4, 5, 6, 7, 8, 9, 10

Затем следует внутренний цикл for j := x1 to i-1 do он переберает числа начиная с x1 и заканчивает i-1 (это изза условия что i<j)

т.е. в результате мы проверяем пары чисел
4,3
5,3 5,4
6,3 6,4 6,5
7,3 6,4 7,5 7,6
8,3 8,4 8,5 8,6 8,7
9,3 9,4 9,5 9,6 9,7 9,8
10,3 10,4 10,5 10,6 10,7 10,8 10,9

и теперь для каждой из этой пары чисел проверяем равен лиостаток от деления i на j нулю "if ((i mod j)=0) then Begin"
если равен, то тогда выводим строки уравнений, для этой пары чисел, в файл.


а и ещё по поводу if (x1<=0) then x1 := 1; это мы просто проверяем чтобы введённый x1 небыл равен 0 (т.к. неохотовозиться с ошибкой от деления на 0)

ещё в первом примере можно заменить for j := x1 to i-1 do на for j := x1 to i div 2 do т.к. очевидно что для выполнения условия j должны быть как минимум в 2 раза меньше i.

Ну и всё это сказанно для первого примера.

Во втором примере мы проходим по всем возможным j (от x1 до x2/2) и для каждого выбираем ряд i которые кратные j. начинаем с i=2*j затем i=3*j и.т.д. пока i не станет больше x2
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 06.11.2011 в 17:38.
val_nnm вне форума Ответить с цитированием
Старый 06.11.2011, 18:23   #7
maxwel6064
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 28
По умолчанию

Теперь стало немного понятно. Спасибо вам огромное!
maxwel6064 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами malenkaya Помощь студентам 5 23.04.2011 08:24
Работа с файлами на Си genia Общие вопросы C/C++ 4 19.02.2011 16:29
Работа с файлами Funtick Помощь студентам 2 17.02.2011 15:30
Работа с файлами Гелена Помощь студентам 1 18.03.2010 23:31
Работа с файлами DJ Socol Win Api 1 17.07.2007 09:18