Тема: записи

програма не хоче знаходити найбільше значення, все працює крім найбільшого значення.
ось інформація з info.txt: Gerd Myuller     Nimechchyna     3.8   14  Bavariya
                                     Pele                Brazyliya           3.5   12  Santos
                                     Zhyust Fonten   Frantsiya          3.1   13  Reyms
                                     Ronaldo           Brazyliya           4.3   15  Korintians
                                     Myroslav Kloze  Nimechchyna     4.2   14  Latsio

на зображенні жовтим кольором зображено той результат який повинна виносити програма .

program footbol;
uses Crt;
type
  bomb = record
    fam: string[16];
    str: string[15];
    rez: real;
    gol: integer;
    clab: string[10];
  end;
  
var myfile:text; 
    myzap:bomb;
    max: real;
    i:integer;
  
begin
  clrscr; 
  writeln('Фамилия         Страна      Результат  Голы  Клуб');
  assign(myfile,'info.txt');
  reset(myfile);
  for i:=1 to 5 do
    with myzap do
      begin
       readln(myfile,fam,str,rez,gol,clab);
       writeln(fam:16,str:15,rez:7,gol:4,clab:10);
      end;
   for i:=1 to 5 do with myzap do    
   if max<rez then max:=rez;
   writeln;
 if max=myzap.rez then writeln('Наиболие результативный в национальном первенстве "бомбардир":',myzap.fam,'  глов:',myzap.gol,'; клуб:',myzap.clab);  
 readln;
 end.
Post's attachments

Сним.JPG 33.74 kb, 277 downloads since 2014-04-29 

2 Востаннє редагувалося Odin88 (29.04.2014 22:27:14)

Re: записи

Проблема в тому що Ви зберігаєте змінну :

myzap:bomb;

і кожен раз при зчитуванні з файлу інформацію присвоюєте змінній значення :

 readln(myfile,fam,str,rez,gol,clab);

Таким чином Ви ніби на кожній ітерації переприсвоюєте значення змінної myzap.
Насправді,Ви тут в циклі на кожній ітерації робите ту ж саму перевірку :

 for i:=1 to 5 do with myzap do    
   if max<rez then max:=rez;
   writeln;
Прихований текст

Доречі, якому значенню дорівнює Ваша змінна max перед початком циклу?

 max := 0.0;
Подякували: lichmanmaksim1

3

Re: записи

при внесенні в цикл

 if max<rez then max:=rez;

програма знаходить найбільше значення, якщо просто вивести значення, а от з

writeln('Наиболие результативный в национальном первенстве "бомбардир":',myzap.fam,'  глов:',myzap.gol,'; клуб:',myzap.clab); writeln(max);

проблемка.. Допоможіть будь ласка. як вивести результат, як показано вище?

4 Востаннє редагувалося Odin88 (29.04.2014 23:33:32)

Re: записи

В тому й суть, що програма не знаходить найбільше значення.
Ваша змінна :

myzap:bomb;

після виконання циклу :

 for i:=1 to 5 do
    with myzap do
      begin
       readln(myfile,fam,str,rez,gol,clab);
       writeln(fam:16,str:15,rez:7,gol:4,clab:10);
      end;

тримає в собі значення,яке відповідає останньому рядку файла.Якщо простими словами то Ви на першій ітерації циклу, при i := 1 заганяєте в змінну myzap інформацію яка міститься в  першому рядку Вашого файлу,тобто

Gerd Myuller     Nimechchyna     3.8   14  Bavariya

потім, при i := 2 присвоюєте

Pele                Brazyliya           3.5   12  Santos

Ну і на останньому кроці,як Ви вже,мабуть, догадалися

Myroslav Kloze  Nimechchyna     4.2   14  Latsio

Таким чином,після закінчення зчитування Ваша змінна містить не список усіх гравців(команд ітд) а лише останній рядок файлу.Після цього ви просто проганяєте циклом :

 for i:=1 to 5 do with myzap do    
   if max<rez then max:=rez;
   writeln;

Вашу змінну і пробуєте серед однієї команди(гравця) знайти максимальну.

Подякували: lichmanmaksim1

5

Re: записи

а чи знаєте як потрібно занести інформацію в таку програму, бо я як уже не крутив виникає помилка при читанні числа з файлу.

program footbol; 
const n=5; 
type 
    bomb=record
    fam:string[6];
    str:string[4];
    rez:real;
    gol:integer;
    clab:string[6];
    end;
var m:array[1..n] of bomb;
    i:integer; 
    max:real;
    fi:text;
begin
  assign(fi,'info1.txt');
  reset(fi);
  for i:=1 to n do  
    read(fi,m[i].fam);
    read(fi,m[i].str);
    read(fi,m[i].rez);
    read(fi,m[i].gol);
    read(fi,m[i].clab);
  close(fi);
 for i:=1 to n do 
  if max<m[i].rez then max:=m[i].rez;
  writeln('Найболие результативный в национальном первенстве "бомбардир":');
  for i:=1 to n do
 if max=m[i].rez then writeln(m[i].fam,',голы: ',m[i].gol,', ',m[i].clab);   
 readln; 
end.

6 Востаннє редагувалося Odin88 (30.04.2014 00:01:59)

Re: записи

От масив це вже інша справа.Насправді такої камасутри не потрібно :

 assign(fi,'info1.txt');
  reset(fi);
  for i:=1 to n do  
    read(fi,m[i].fam);
    read(fi,m[i].str);
    read(fi,m[i].rez);
    read(fi,m[i].gol);
    read(fi,m[i].clab);
  close(fi);

Так повинно було б працювати :

 assign(fi,'info.txt');
  reset(fi);
  for i:=1 to 5 do
    with m[i] do
      begin
       readln(fi,fam,str,rez,gol,clab);
       writeln(fam:16,str:15,rez:0:1,gol:4,clab:10);
      end;

Йдемо далі.Я вже Вам наголошував,присвойте перед циклом пошуку змінній max якесь значення :

max := 0.0;

Вам просто повезло,що за замовчуванням середовище присвоїло max значення max := 0.0;
Просто це вже undefined behaviour.

Доречі,зчитування та пошук max можна обєднати.Просто шукати max зразу при зчитуванні.

Подякували: lichmanmaksim1

7

Re: записи

Ооо ГОСПОДИ... вона запрацювала!!!)  вельми дякую вам, бо голова дійсно вже не варить.