2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Паскаль. Строки и записи
Сообщение21.03.2009, 14:02 


02/03/09
50
должно,но не выводит - при совпадении фамилий - данные однофамильцев на экран!(
вот прога
Код:
Program Lab20_16;
uses crt;
type
Student = record
  fam:string[20];
  name:string[20];
  shifr:string[10];
end;
sd=array[1..50] of student;
  stude=array[1..100] of string;
var
stud: sd;
  f:text;
  i,j,k,r:integer; s:string;
  a:stude;
begin
clrscr;
assign(f,'Lab21.txt');
rewrite(f);
i:=0;
repeat
        i:=i+1;
writeln;
write('fam[',i,']-'); readln(stud[i].fam); write(f,stud[i].fam:20);
write('name[',i,']-'); readln(stud[i].name);write(f,stud[i].name:20);
write('shifr[',i,']-'); readln(stud[i].shifr);writeln(f,stud[i].shifr:10);
writeln;
writeln('нажмите SPACE для выхода из ввода');
writeln('или нажмите любую клавишу для продолжения ввода');
writeln;
until readkey=#32;
reset(f);
  while not Eof(f) do begin
read(f,stud[i].fam);
read(f,stud[i].name);
readln(f,stud[i].shifr);
  readln(f);
end;
textcolor(green);
writeln;
writeln('Однофамильцы найденные в группах');
writeln;
textcolor(red);
for i:=1 to j-1 do
for k:=i+1 to j do
if stud[i].fam=stud[j].fam then begin
                         writeln('Фамилия студента- ' ,   stud[i].fam);
                         writeln('Имя студента- ' ,stud[i].name);
                         writeln('Шифр группы- ' ,stud[i].shifr);
                         writeln;
                         writeln('Фамилия студента- ' ,stud[k].fam );
                         writeln('Имя студента- ' ,stud[k].name);
                         writeln('Шифр группы- ' ,stud[k].shifr);
                         writeln;
                         end;
    readkey;

close(f);
End.

почему оно на промежутке
Код:
for i:=1 to j-1 do
for k:=i+1 to j do
if stud[i].fam=stud[j].fam then begin
                         writeln('Фамилия студента- ' ,   stud[i].fam);
                         writeln('Имя студента- ' ,stud[i].name);
                         writeln('Шифр группы- ' ,stud[i].shifr);
                         writeln;
                         writeln('Фамилия студента- ' ,stud[k].fam );
                         writeln('Имя студента- ' ,stud[k].name);
                         writeln('Шифр группы- ' ,stud[k].shifr);
                         writeln;
                         end;
    readkey;

переходит с for i:=1 to j-1 do на readkey; - пропуская вывод - где ошибка,помогите плиз

 Профиль  
                  
 
 
Сообщение21.03.2009, 14:55 
Заслуженный участник


11/05/08
32166
sv2311 в сообщении #197174 писал(а):
write('shifr[',i,']-'); readln(stud[i].shifr);writeln(f,stud[i].shifr:10);
writeln;
writeln('нажмите SPACE для выхода из ввода');
writeln('или нажмите любую клавишу для продолжения ввода');
writeln;
until readkey=#32;

Это какой-то откровенный бардак. Выберите что-то одно: или считывание с консоли по $Readln$, или по $ReadKey$.

 Профиль  
                  
 
 
Сообщение21.03.2009, 18:17 


02/03/09
50
?

 Профиль  
                  
 
 
Сообщение21.03.2009, 18:31 
Заслуженный участник


11/05/08
32166
Во-первых, используйте тег "code". Причём со всеми грамотными отступами. Иначе кому интересно во всём этом разбираться?...

Во-вторых. У Вас там во входном цикле запрашиваются строчки командой "Readln". И это само по себе нормально. Но в конце цикла зачем-то пришпандорена какая-то "ReadKey", которая запрашивает очередную нажатую клавишу, а вовсе не строку. Ну и какой реакции от своей замечательной программы Вы в таком случае ожидаете?...

 Профиль  
                  
 
 
Сообщение21.03.2009, 20:52 
Заслуженный участник


12/07/07
4448
1.
sv2311 писал(а):
почему оно на промежутке
Код:
for i:=1 to j-1 do
for k:=i+1 to j do
if stud[i].fam=stud[j].fam then begin
                         writeln('Фамилия студента- ' ,   stud[i].fam);
                         writeln('Имя студента- ' ,stud[i].name);
                         writeln('Шифр группы- ' ,stud[i].shifr);
                         writeln;
                         writeln('Фамилия студента- ' ,stud[k].fam );
                         writeln('Имя студента- ' ,stud[k].name);
                         writeln('Шифр группы- ' ,stud[k].shifr);
                         writeln;
                         end;
    readkey;
переходит с for i:=1 to j-1 do на readkey; - пропуская вывод - где ошибка,помогите плиз
Переменная j не инициализируется до цикла в Вашей программе. У меня в сеансе отладки она принимала значение 0. Конечно, в этом случае тело цикла выполняться не будет.

2. От себя добавлю. В своей программе Вы
1) пытаетесь посимвольно читать вводимые с клавиатуры строки (фамилии), а лучше вводить и читать сразу строку (целиком фамилию, затем целиком имя, и, затем целиком шифр);
2) пытаетесь строки сравнивать посимвольно, а достаточно просто проверять две строки на равенство.
Указанная модификация приведет к значительному сокращению исходного текста программы.

3. Измените заголовок темы на более информативный! Например:
Паскаль. Строки и записи

 Профиль  
                  
 
 Паскаль. Строки и записи 2 - помогите с прогой
Сообщение23.03.2009, 18:00 


02/03/09
50
Какой еще вложенный цикл в конце нужно создать что бы выводила однофамильцев на экран??
что нужно с чем сравнить??пока что выводит на экран фамилии которых больше чем одна.Помогите пожалуйста!!!!

Код:
Program Lab20_16;
uses crt;
type
Student = record
  fam:string[20];
  name:string[20];
  shifr:string[10];
end;
sd=array[1..50] of student;
  stude=array[1..100] of string[20];
var
stud: sd;
  f:text;
  i,j,k,g,r:integer; s:string;
  a:stude;
  flag:boolean;
begin
clrscr;
assign(f,'Lab21.txt');
rewrite(f);
repeat
writeln;
write('fam-'); readln(s); write(f,s:20);
write('name-'); readln(s); write(f,s:20);
write('shifr-'); readln(s); writeln(f,s:10);
writeln;
writeln('нажмите SPACE для выхода из ввода');
writeln('или нажмите любую клавишу для продолжения ввода');
writeln;
until readkey=#32;

    i:=1;
reset(f);
  while not Eof(f) do
  begin
    read(f,stud[i].fam);
     read(f,stud[i].name);
      readln(f,stud[i].shifr);
    i:=i+1;
  end;
g:=0;
    for k:=1 to i-1 do
       for j:=k+1 to i-1 do
         if stud[k].fam=stud[j].fam  then
          begin
             flag:=false;
             for r:=1 to g do
              if a[r]=stud[k].fam then
                begin
                 flag:=true;
                 break;
                end;
             if not flag then
               begin
                 g:=g+1;
                 a[g]:=stud[k].fam;
                 writeln('Фамилия студента- ' ,a[g]);
                 writeln('Имя студента- ' ,a[g]);
                  writeln('Шифр группы- ' ,a[g]);
                 break;
               end;

       !!!!!! - здесь еще нужно 2 цикла - вроде!!!


         end;
    readkey;




close(f);

End.

 Профиль  
                  
 
 
Сообщение23.03.2009, 19:13 
Модератор
Аватара пользователя


11/01/06
5660
 !  sv2311, предупреждение за дублирование тем!

 Профиль  
                  
 
 
Сообщение23.03.2009, 20:38 
Заслуженный участник


12/07/07
4448
В прошлый раз я не разобрался в Вашей не очень читабельной программе и написал в п.2 глупости.
Вы не формулируете точно задание. Крайне желательно точно формулировать условие задачи и требования по её выполнению. Что нужно выполнить? Нужно вывести данные по всем имеющимся в файле однофамильцам? Тогда это можно сделать так.
Пусть число записей в файле не может превосходить MaxN (в программе надо предусмотреть проверку при вводе, иначе преподаватель может снизить оценку).
Заведем массив логических переменных flags. Будем считать, что номер элемента в массиве соответствует номеру записи в массиве записей stud. Первоначально присвоим элементам массива значения False. В двойном цикле будем присваивать элементам массива значение True, если совпадают фамилии. По завершению двойного цикла, напечатаем в однократном цикле поля тех записей массива stud, номерам которых в массиве flags соответствуют значения True.
Код:
uses crt;
const MaxN=100; {число записей в файле не может превосходить MaxN}
type
Student = record
  fam:  string[20];
  name: string[20];
  shifr:string[10];
end;
tsd   = array[1..MaxN] of student;
var
stud:      tsd;
f:         text;
i,j,k,g,r: integer;
s:         string;
flags: array[1..MaxN] of Boolean; {Заведем массив логических переменных flags}

begin
clrscr;
assign(f,'Lab21.txt');
rewrite(f);
repeat
  writeln;
  write('fam-'); readln(s); write(f,s:20);
  write('name-'); readln(s); write(f,s:20);
  write('shifr-'); readln(s); writeln(f,s:10);
  writeln;
  writeln('нажмите SPACE для выхода из ввода');
  writeln('или нажмите любую клавишу для продолжения ввода');
  writeln;
until readkey=#32;
i:=0;
reset(f);
while not Eof(f) do
  begin
   i:=i+1; {Тут должна быть добавл. проверка и выход с предупреждением !}
   read(f,stud[i].fam);
   read(f,stud[i].name);
   readln(f,stud[i].shifr);
  end;

for k:=1 to i do flags[k]:= False; {Первон. присв. элем. массива False}
  for k:=1 to i do    {В двойном цикле будем присваивать элем. массива}
   for j:=1 to i do   {          значение True, если совпадают фамилии}
    if k <> j then if stud[k].fam=stud[j].fam then flags[k]:= True;

                         {По завершению двойного цикла, напечатаем }
for k:=1 to i do        { в однократном цикле поля тех записей массива stud,}
   if flags[k] = true    { номерам которых в массиве flags соотв. True }
    then with stud[k] do
          begin         
           writeln('Фамилия студента- ', fam);
           writeln('Имя студента- '    , name);
           writeln('Шифр группы- '     , shifr);
          end;
readkey;
close(f);
End.
Но Вы программируете что-то другое. Посмотрите, как работает моя программа. Напишите, что и с какими условиями Вам надо сделать.

 Профиль  
                  
 
 
Сообщение24.03.2009, 00:49 


02/03/09
50
Огромное спасибо!Все так как нужно,осталось мелочи.......большое спасибо!!!!очень признателен

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group