2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Программа на файл, двумерный массив и функцию [Pascal]
Сообщение01.11.2013, 12:01 
Здравствуйте!
Возникла проблема с программкой.
Вот задание:
Классный руководитель XI-го класса представил годовые данные об успеваемости учащихся в таблице с n (n < 40) строками, n - количество учащихся, и m (m < 20) столбцами, m - количество школьных предметов. Элемент с индексами i, j содержит среднюю оценку ученика с номером i по предмету с номером j. Оценки являются действительными числами.
Условие: Напишите программу, которая определяет порядковые номера отличников. Напоминаем, что отличник - это ученик, у которого все оценки больше или равны 9. Программа будет содержать в себе подпрограмму, для определения является ли ученик с номером i отличником. Подпрограмма получит в качестве формального параметра индекс строки i и возвратит значение True, если ученик с номером i является отличником и значение False в противном случае.
Ввод: Текстовый файл NOTE.IN содержит на первой строке два целых числа разделённых пробелом - значения n и m. Каждая из следующих n строк будет содержать по m действительных чисел разделённых пробелом. Линия файла с номером i+1 содержит оценки ученика с номером i по m школьным предметам.
Решение будет оцениваться за:
объявления типов данных и переменных; использование текстовых файлов; чтение и запись данных; описание и использование
Пример:
NOTE.IN
4 3
6.00 9.50 9.00
9.50 9.66 10.00
9.75 9.25 9.66
6.50 8.75 7.75
NOTE.OUT
2 3
Вывод: Результаты будут записываться в файле NOTE.OUT, следующим образом: первая строка будет содержать номера отличников, разделённые пробелом, если таких учащихся нет, тогда первая строка строка будет содержать выражение NO RESULT.

Вот моё решение:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program p1;
type mas=array[1..10,1..10]of real;
var f,g: file of real;
    q,w:real;
    i,j,n,m:integer;
    a:mas;
function otl(i:integer):boolean;
var j:integer;
begin
for j:=1 to m do begin
if a[i,j]>=9 then otl:=True else otl:=False;
end;
end;
Begin
assign(f,'C:\PABCWork.NET\note.in.txt');
reset(f);
assign(g,'C:\PABCWork.NET\note.out.txt');
rewrite(g);
read(f,q); read(f,w);
n:=trunc(q); m:=trunc(w);
for i:=1 to n do
for j:=1 to m do begin
read(f,a[i,j]);
end;
for i:=1 to n do begin
if otl(i) then write(g,i);
end;
close(f); close(g);

write(q,' ',w);
writeln;
write(n,' ',m);
writeln;
for i:=1 to n do begin
for j:=1 to m do
write(a[i,j]:4);
writeln;
end;

readln;
End.

Вроде, компилируется без проблем, и в условиях я более менее уровен, но ошибка происходит почему-то в самом начале, при считывании q и w:
1.30454036513397E-76 1.55887769054702E-33

В чём заключается проблема? Где ошибка в коде?

Какое надо добавить условие для вывода "NO RESULT" в файл NOTE.OUT?

Заранее благодарен за ответ!

 
 
 
 Re: Программа на файл, двумерный массив и функцию
Сообщение01.11.2013, 12:47 
Во-первых, Паскаль как таковой понимает имена файлов только в досовском формате (8.3).

Во-вторых, file of real -- отнюдь не текстовой, поэтому бред при чтении совершенно естественен.

Во-третьих, функция "отличник" запрограммирована неверно: там флажок переключается на каждом элементе строки заново, следует же до цикла установить для него некоторое значение, а внутри -- при случае переустанавливать лишь на противоположное стартовому (и, кстати, для приличия немедленно при этом прерывать цикл).

Да, и ещё кстати: приличные люди программ без отступов писать не умеют.

 
 
 
 Re: Программа на файл, двумерный массив и функцию
Сообщение01.11.2013, 12:58 
ewert в сообщении #783193 писал(а):
Во-первых, Паскаль как таковой понимает имена файлов только в досовском формате (8.3).

TurboPascal 7.1 прекрасно работает и с .txt и даже без всякого формата (если там будет .in / .out - прочтёт) - проверенно десятком программ из учебника.

Проблему с чтением данных решил, теперь разбираюсь с функцией отличник.

 
 
 
 Re: Программа на файл, двумерный массив и функцию
Сообщение01.11.2013, 13:08 
acme в сообщении #783198 писал(а):
Во-первых, бред. TurboPascal 7.1 прекрасно работает и с .txt и даже без всякого формата (если там будет .in / .out - прочтёт)

Речь не о конкретных расширениях, а о том, что если точка есть, то должна быть не более чем одна.

acme в сообщении #783198 писал(а):
Во-вторых, файлы бывают разного типа,

Вот именно. Я сильно сомневаюсь, что Вы заготовили входной файл в формате именно real -- наверняка он был текстовым (независимо от приписанного ему расширения). Считываете же его как real. Ну и чего же Вы хотите?...

acme в сообщении #783198 писал(а):
В-третьих, считайте меня неприличным.

Ради бога; но если не приучитесь делать отступы -- Вам же боком выйдет, не говоря уж об окружающих.

 
 
 
 Re: Программа на файл, двумерный массив и функцию
Сообщение01.11.2013, 13:09 
Прошу прощения за грубость

-- Пт ноя 01, 2013 13:26:18 --

ewert в сообщении #783193 писал(а):
функция "отличник" запрограммирована неверно: там флажок переключается на каждом элементе строки заново, следует же до цикла установить для него некоторое значение, а внутри -- при случае переустанавливать лишь на противоположное стартовому (и, кстати, для приличия немедленно при этом прерывать цикл)

Спасибо за помощь! Всё получилось!

 
 
 
 Re: Программа на файл, двумерный массив и функцию
Сообщение01.11.2013, 23:15 

(Оффтоп)

acme в сообщении #783202 писал(а):
Прошу прощения за грубость

Ничего страшного. Это отчасти я сам спровоцировал некоторой резкостью, но и с Вашей стороны -- ничего страшного.

А что получилось -- то замечательно.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group