Пятница, 24.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 1
  • 1
Модератор форума: Seqular, Pavel  

пожалуйста помогите решить задачу
kardanДата: Четверг, 10.04.2008, 14:50 | Сообщение # 1
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
дан файл f элементы которого являются действительными числами.
найти наименьшее из значений элементов с четными номерами.
 
AlexanderДата: Четверг, 10.04.2008, 16:46 | Сообщение # 2
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Code
n:=filesize(f) shr 1;
read(F,x,x);
Result:=x;
for i:=2 to n do
    begin
       read(F,x,x);
       if x<Result then
          Result:=x;
    end;

P.S. предполагается, что в файле как минимум 2 элемента.


Скажем дружно- нафиг нужно!
 
kardanДата: Суббота, 12.04.2008, 17:21 | Сообщение # 3
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
я так понял что прога должна выводить только наименьшее число с четным номером?
1)-
2)+
я правильно понял?

var f:file of real;
r,min:real;
i:integer;
begin
assign(f,'c:\t1.dat');
rewrite(f);
reset(f);
read(f,r,min); i:=2;
while not eof(f) do
begin
read(f,r); inc(i);
if (i mod 2=0) and (r<min) then min:=r;
end;
close(f);
writeln(min);
readln;
end.

 
AlexanderДата: Воскресенье, 13.04.2008, 00:35 | Сообщение # 4
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
я правильно понял?

Да.
Quote
rewrite(f);
reset(f);

Нет, это только в анекдоты biggrin . Функция rewrite перезаписывает файл, т.е. уничтожает всё его содержимое. А reset подготавливает файл для чтения, а если вы его стёрли, то и читать там нечего.
Дальше вы пытались придумать свой алгоритм. Это похвально, но давайте я вам лучше объясню мой, он получше wink :
Code
n:=filesize(f) shr 1;

Переменной "n" присваиваем значение, равное половине переменных, хранящихся в файле, с чётными номерами.
Code
read(F,x,x);

В переменную "x" сначала читаем первое число, а затем туда же второе.
Code
Result:=x;

Пока мы прочитали лишь одно число с чётным номером, его и присваиваем как текущий результат.
Code
for i:=2 to n do   {первый элемент уже прочитан, значит начинаем с двух}
     begin
        read(F,x,x);          {читаем следующее значение}
        if x<Result then     {проверяем не меньше ли оно текущего результата}
           Result:=x;          {если меньше, то это значение и становится результатом}
     end;

Алгоритм очень прост, главное понять как читаются чётные элементы(read(f,x,x)). Если что-то не ясно, то пишите.
P.S. Старайтесь писать более читаемый код, а именно- делайте отступы и ставьте теги [сode][/сode], как это сделано у меня.


Скажем дружно- нафиг нужно!
 
kardanДата: Воскресенье, 13.04.2008, 03:30 | Сообщение # 5
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
прога пишет что нужно использовать перечисляемый тип
[for i:=2 to n do]
 
AlexanderДата: Воскресенье, 13.04.2008, 03:52 | Сообщение # 6
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Строго говоря, перечисляемый тип- это тип, который программа после компиляции будет представлять как целочисленный. В данном случае переменные "i" и "n" должны иметь либо тип BYTE(если в файле меньше 512 записей) либо WORD(от 512 до 131071 записи включительно).

Скажем дружно- нафиг нужно!
 
kardanДата: Воскресенье, 13.04.2008, 04:02 | Сообщение # 7
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
он всё сремя выводит последнюю цифру
[uses crt;
var f:file of real;
n,i:byte;
x,result:real;
begin
assign(f,'c:\t1.dat');
writeln('');
reset(f);
repeat
n:=filesize(f) shr 1;
read(x,x);
until readkey=#27;
Result:=x;
for i:=2 to n do
begin
read(F,x,x);
if x<Result then
Result:=x;
end;
writeln(result);
readln;
end.]
 
AlexanderДата: Воскресенье, 13.04.2008, 04:16 | Сообщение # 8
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Такс...
1) 8-ая строка. Зачем этот WriteLn('')? Он там не нужен. И вообще грамотнее было бы написать без параметров WriteLn;
2) строки 10-13. Зачем там цикл?
3) строка 12. Читать надо из файла, а не с клавиатуры.


Скажем дружно- нафиг нужно!
 
kardanДата: Воскресенье, 13.04.2008, 04:25 | Сообщение # 9
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
n:=filesize(f) shr 1;
read(F,x,x); {пишет disk read error}

Добавлено (12.04.2008, 21:25)
---------------------------------------------
так вроде начинаю понимать

 
AlexanderДата: Воскресенье, 13.04.2008, 04:27 | Сообщение # 10
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Причины могут быть разные, но сводятся они всего к двум- файла не существует или файл уже полностью прочитан.
Проверьте следующее:
1) В процедуре Assign указан верный файл.
2) В этом файле минимум две записи.
Если не можете найти ошибку самостоятельно, то придётся вам выложить весь код.
P.S. Не забывайте о тегах "code"(обведите напечатанный вами программный код и нажмите кнопочку "code").


Скажем дружно- нафиг нужно!
 
kardanДата: Воскресенье, 13.04.2008, 04:35 | Сообщение # 11
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
записал в файл 4 числа,менял числа всё равно выдаёт один и тот же ответ
[/code]uses crt;
var f:file of real;
n,i:byte;
x,result:real;
begin
clrscr;
assign(f,'c:\t1.dat');
reset(f);
n:=filesize(f) shr 1;
read(f,x,x);
Result:=x;
for i:=2 to n do
begin
read(F,x,x);
if x<Result then
Result:=x;
end;
writeln(x);
readln;
end.[code]

Добавлено (12.04.2008, 21:35)
---------------------------------------------

Code

uses crt;  
var f:file of real;  
n,i:byte;  
x,result:real;  
begin  
clrscr;  
assign(f,'c:\t1.dat');  
reset(f);  
n:=filesize(f) shr 1;  
read(f,x,x);  
Result:=x;  
for i:=2 to n do  
begin  
read(F,x,x);  
if x<Result then  
Result:=x;  
end;  
writeln(x);  
readln;  
end.
 
AlexanderДата: Воскресенье, 13.04.2008, 04:40 | Сообщение # 12
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
smile Всё верно. Девятнадцатую строчку проверьте(writeln(x);). Результат-то у вас не в "x" хранится, а в "Result".
З.Ы. Вы теги местами перепутали wacko .


Скажем дружно- нафиг нужно!
 
kardanДата: Воскресенье, 13.04.2008, 04:49 | Сообщение # 13
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
всё равно выводит один и тот же результат, уже числа перезаписывал не помогает

Добавлено (12.04.2008, 21:49)
---------------------------------------------
1.4072975394Е-25

 
AlexanderДата: Воскресенье, 13.04.2008, 04:56 | Сообщение # 14
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Ну не знаю, где там ещё можно ошибиться sad .
Вот ваш же вариант, только с заполнением файла рандомными числами:
Code
uses crt;
var
     f:file of real;
     n,i:byte;
     x,result:real;
begin
     clrscr;
     assign(f,'c:\t1.dat');
     rewrite(f);
     Randomize;
     n:=Random(10)+2;
     for i:=1 to n do
        begin
           x:=Random+Random(11)-5;
           Write(F,x);
           Write(x:7:2);
        end;
     WriteLn;
     reset(f);
     n:=filesize(f) shr 1;
     read(f,x,x);
     Result:=x;
     for i:=2 to n do
        begin
           read(F,x,x);
           if x<Result then
        Result:=x;
     end;
     Close(F);
     writeln(Result:0:2);
     ReadKey;
end.


Скажем дружно- нафиг нужно!

Сообщение отредактировал Alexander - Воскресенье, 13.04.2008, 04:59
 
kardanДата: Воскресенье, 13.04.2008, 05:11 | Сообщение # 15
Знакомый
Группа: Пользователи
Сообщений: 10
Репутация: 0
Замечания: 0%
Статус: Offline
странно! эта правда работает, огромное вам спасибо ! буду дальше разбираться
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;