Консультация № 183682
20.06.2011, 22:44
74.84 руб.
0 9 1
Здравствуйте! Уважаемые эксперты! Помогите мне решить задачи, как в этой теме ВОТ.
Задачи:
1) Тема «Сортировка массивов».
В любом «длинном» числе > 20 знаков расположить цифры числа по возрастанию.

2) Тема «Работа со строками».
Результаты вступительных экзаменов представлены в виде списка из N строк, в каждой строке которой записаны фамилии абитуриента и отметки по каждому из M предметов. Определить количество абитуриентов, сдавших вступительные экзамены на отлично.

Обсуждение

Неизвестный
22.06.2011, 16:22
общий
помогите кто нибудь, скоро уже сдать надо будет..
Неизвестный
25.06.2011, 11:32
общий
первую уже не надо, вторую помогите решить
Неизвестный
25.06.2011, 15:34
общий
Вот решение второй задачи. Я считаю, не отслеживаю, что у каждого проставлено одинаковое число оценок, что все оценки отделены друг от друга любым символом, лишь бы не цифра от 0 до 5.
Проверяю, написана ли фамилия, но тогда просто пропускаю
Да! Вы не написали, а зря, в каком Паскаде нужно сделать. Я сделал в Borland.
В прикрепленом архиве код и исходный файл

Код:
uses CRT;
CONST
TheFileName = '183682.txt';
nums: Set of Char = ['0' .. '5'];
chars: Set of Char = ['A'..'z', 'А' ..'п', 'р' .. 'я'];

VAR
f: Text;
S, name: String;
i, count, numCount: Integer;
A_student: Boolean; {отличник}
BEGIN
Assign(f, TheFileName);
{$I-} Reset(f); {$I+}
if IOResult <> 0 then begin
WriteLn('Не могу открыть файл ', TheFileName,
'. Работа программы завершается');
WriteLn('Нажмите любую клавишу');
ReadKey; Halt(1)
end;
Count := 0;
While NOT EOF(f) do begin
ReadLn(f, S);
if S <> '' then begin
name := '';
i:=1;
while (NOT (S[i] in chars)) and (i <= length(S)) do inc(i);
while (S[i] in chars) and (i <= length(S)) do begin
name := name + S[i];
inc(i);
end;
if name = '' then Continue; {Фамилии нет}
A_student := TRUE;
Write(name,' ');
while (i <= length(S)) do begin
while (NOT (S[i] in nums)) and (i <= length(S)) do inc(i);
A_student := A_student and (S[i] = '5');
inc(i);
if NOT A_student then Continue;
end;
if A_student then begin
WriteLn('Отличник');
inc(count)
end
else WriteLn('Так себе');
end;
end;
if Count = 0 then
Writeln('На отлично не сдал ни один абитуриент')
else
WriteLn('На отлично сдало абитуриентов: ', count);
WriteLn('Нажмите любую клавишу');
ReadKey
END.
Прикрепленные файлы:
839e5405321bba4d3f4385b021da978e.zip
Неизвестный
25.06.2011, 16:20
общий
Если Вас этот вариант устраивает - напишите, переведу в ответ
Неизвестный
26.06.2011, 11:30
общий
это ответ
Здравствуйте, Посетитель - 372181!
Вы не отвечаете, перевожу в ответ:
Вот решение второй задачи. Я считаю, не отслеживаю, что у каждого проставлено одинаковое число оценок, что все оценки отделены друг от друга любым символом, лишь бы не цифра от 0 до 5.
Проверяю, написана ли фамилия, но тогда просто пропускаю
Да! Вы не написали, а зря, в каком Паскаде нужно сделать. Я сделал в Borland.
В прикрепленом архиве код и исходный файл
Код:
    uses CRT;
CONST
TheFileName = '183682.txt';
nums: Set of Char = ['0' .. '5'];
chars: Set of Char = ['A'..'z', 'А' ..'п', 'р' .. 'я'];
VAR
f: Text;
S, name: String;
i, count, numCount: Integer;
A_student: Boolean; {отличник}
BEGIN
Assign(f, TheFileName);
{$I-} Reset(f); {$I+}
if IOResult <> 0 then begin
WriteLn('Не могу открыть файл ', TheFileName,
'. Работа программы завершается');
WriteLn('Нажмите любую клавишу');
ReadKey; Halt(1)
end;
Count := 0;
While NOT EOF(f) do begin
ReadLn(f, S);
if S <> '' then begin
name := '';
i:=1;
while (NOT (S[i] in chars)) and (i <= length(S)) do inc(i);
while (S[i] in chars) and (i <= length(S)) do begin
name := name + S[i];
inc(i);
end;
if name = '' then Continue; {Фамилии нет}
A_student := TRUE;
Write(name,' ');
while (i <= length(S)) do begin
while (NOT (S[i] in nums)) and (i <= length(S)) do inc(i);
A_student := A_student and (S[i] = '5');
inc(i);
if NOT A_student then Continue;
end;
if A_student then begin
WriteLn('Отличник');
inc(count)
end
else WriteLn('Так себе');
end;
end;
if Count = 0 then
Writeln('На отлично не сдал ни один абитуриент')
else
WriteLn('На отлично сдало абитуриентов: ', count);
WriteLn('Нажмите любую клавишу');
ReadKey
END.
Прикрепленные файлы:
Неизвестный
26.06.2011, 12:48
общий
мы работаем на TurboPascal
и объясните что обозначают строчки которые после begin я их не понимаю, что они делают (например:Assign, {$I-} Reset(f); {$I+})
Неизвестный
26.06.2011, 13:01
общий
Исходная информация считывается из файла с именем 183682.txt. Имя задается константой.
Assign(f, TheFileName); - связывает (assign - связь) файловую переменную f с именем файла.
{$I-} - отключается контроль операций ввода/вывода. Следующей командой будет сделана попытка открыть файл для чтения. Если не отключить контроль операций ввода/вывода, а файла нет или не удастся его открыть, то программа аварийно завершит работу. И мы только очень сложными действиями сможем узнать об этом, по коду ошибки аварийного завершения программы, который, кстати, еще нужно уметь определить. При отключенном контроле, программа не завершает работу, но код операции можно будет узнать с помощью функции IOResult. О кодах достаточно знать одно: если ноль, то ХОРОШО все прошло, файл открыт. А ненулевые значения обозначают различные ситуации.
После отключения контроля делаем попытку открыть файл для чтения:
Reset(f);
{$I+} обратно включает контроль операций. В те времена, когда создавался Turbo Pascal, БЫЛО ДАЖЕ ОПАСНО надолго отключать контроль. Сейчас операционные системы стали и мощнее и умнее, но рекомендация осталась (и привычка тоже).
Неизвестный
26.06.2011, 19:45
общий
я txt файл открываю, так все буквы на непонятные значения перешли, ну эта кодировка..
что там вообще было написано попробую исправить
Неизвестный
26.06.2011, 19:49
общий
Да нет, не нужно: этот файл в ДОС-овской кодировке, той, что Паскаль "понимает" и создавался он в редакторе Borland Pascal. Вы же, открыли в блокноте, а там кодировка виндовская ANSII. Именно из-за этого я и поместил его в архив!
Форма ответа