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
4522
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
5702
 !  sv2311, предупреждение за дублирование тем!

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


12/07/07
4522
В прошлый раз я не разобрался в Вашей не очень читабельной программе и написал в п.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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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