Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2013, 18:59   #1
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию Программа с записями

Помогите организовать массив, содержащий сведения о 16 веществ: указать название вещества, его удельный вес и проводимость (проводник, полупроводник, изолятор).
а) найти удельный вес и название всех полупроводников.
б) выбрать данные о проводники и упорядочить их по убыванию удельного веса;
в) вывести на экран названия веществ, которые являются изоляторами с выяснением удельного веса.

вот мои наработки, я не знаю как сделать пункт б... и есть ещё одно замечание) нужна информация о 16 веществах, а вводить её с клавиатуры, сами понимаете, сложно, можно как-то считывать с файла?

Код:
uses crt;
type info=record;
     name,providnist:string;
     vaga:real;
          end;
var a: array[1..100] of info;
    i,n,v: integer;
 
Begin
 Clrscr;
 
 write('Vvedu kilkist rechovun:');
 read(n);
 
     writeln('Vvedu nazvy, putomy vagu ta providnist(p-providnuk, n-napiv, i-izoliator):');
          for i:= 1 to n do
           begin
            write('#',i);
            with a[i] do
             readln(name,vaga,providnist);
           end;
           
    writeln('Vvedu variant zavdannia(1,2,3):');
     read(v);
     
if v=1 then
        BEGIN
 readln;
 write('Result:');
    for i:= 1 to n do
     with a[i] do
          if (providnist='n') then
           begin
            writeln;
            write('Nazva - ',name,' Vaga= ', vaga);
            writeln;
           end;
        END
  else if v=2 then {тут начинается ем.. проблемы}
        
  readln
 end.
Заранее спасибо за помощь
Jamguranga вне форума Ответить с цитированием
Старый 08.01.2013, 19:45   #2
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

Считывать с файла?

Код:
var
  f:textfile;
  s:string;
  i:integer;
.....
   Assignfile(f,'C:\input.txt');
   Reset(f);
   for i:=1 to КоличествоСтрок do
      Readln(f,s)
   Closefile(f);
.....
И из файла читаются строки.
hon вне форума Ответить с цитированием
Старый 08.01.2013, 19:50   #3
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

да я знаю что из файла читаются строки и знаю как это делается, НО при разделении строки на слова мы используем массив, а это не совсем то что нужно, нужно считывать по 3 элемента со строки
Jamguranga вне форума Ответить с цитированием
Старый 08.01.2013, 21:21   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
НО при разделении строки на слова мы используем массив,
ой, с чего бы это?!

Считывайте строку, потом разбирайте её на отдельные элементы.
Никакой массив (ну, если саму строку не считать массивом символов ) при разборе не нужен!

Возможно, в вашем случае более подходящим будет способ, когда каждый элемент будет НА ОТДЕЛЬНОЙ строке. Тогда можете испльзовать
ReadLn( ff, ЭлементСтруктуры )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2013, 21:46   #5
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

Хм... А суть не меняется, сделал я так, как вы и говорили
Код:
uses crt;
type info=record;
     name,providnist:string;
     vaga:real;
          end;
var a: array[1..100] of info;
    f:text;
    i,n,v: integer;

Begin
 Clrscr;
 assign(f, 'd:\STUDENT\jamgur\lab7lobo\f.txt');
 reset(f);

while not eof(f) do
 with a[i] do
  begin
   inc(n);
   read(name);
   readln(vaga);
   readln(providnist);
  end;

     {writeln('Vvedu nazvy, putomy vagu ta providnist(p-providnuk, n-napiv, i-izoliator):');
          for i:= 1 to n do
           begin
            write('#',i);
            with a[i] do
             readln(name,vaga,providnist);
           end;}
           
    writeln('Vvedu variant zavdannia(1,2,3):');
     read(v);
     
if v=1 then
        BEGIN
 readln;
 write('Result:');
    for i:= 1 to n do
     with a[i] do
          if (providnist='n') then
           begin
            writeln;
            write('Nazva - ',name,' Vaga= ', vaga);
            writeln;
           end;
        END;

  close(f);
  readln
 end.
Выбивает мою "любимую" ошибку "выход за границы диапазона" и мигает на read(name);
Jamguranga вне форума Ответить с цитированием
Старый 08.01.2013, 22:43   #6
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

Ошибка была в том что a[i] всегда было a[0], вот в этой части:
Код:
Begin
 Clrscr;
 assign(f, 'd:\STUDENT\jamgur\lab7lobo\f.txt');
 reset(f);
  i:=1;
while not eof(f) do
 begin
  with a[i] do
    begin
      inc(n);
      read(f,name);
      readln(f,vaga);
      readln(f,providnist);
    end;
   inc(i);
  end;
А теперь запара как пункты б и в сделать
Jamguranga вне форума Ответить с цитированием
Старый 09.01.2013, 14:33   #7
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

хм, может сортировкой "пузырём" сделать... но как оформить это с записями
Jamguranga вне форума Ответить с цитированием
Старый 09.01.2013, 14:45   #8
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
хм, может сортировкой "пузырём" сделать... но как оформить это с записями
а есть принципиальная разница?

как обычный массив, но не весь подряд, а
Цитата:
б) выбрать данные о проводники и упорядочить их по убыванию удельного веса;
только те его элементы, которые являются проводниками
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 09.01.2013, 14:54   #9
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

их же ещё нужно упорядочить по убыванию их удельного веса
Jamguranga вне форума Ответить с цитированием
Старый 09.01.2013, 15:31   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы не заморачивался. Отсортировал целиком таблицу по убыванию удельного веса.
а потом вывел только проводники.
примерно так:
Код:
var tmp : info;
  j : integer; 
....
begin
....
 {сортировка}
 for i:=1 to n-1 do
   for j:=i+1 to n do
     if a[i].vaga<a[j].vaga then begin
       tmp := a[i];
       a[i] := a[j];
       a[j] := tmp 
     end;
  {всё. сортировка завершена}

  {выведем все проводники}
  WriteLn('Все проводники по убыванию их удельного веса:');
  WriteLn('------------------------------------------------');
  WriteLn('|  name                           |   ves      |');
  WriteLn('------------------------------------------------');
  for i:=1 to n do
    if a[i].providnist = 'p' {проводник} then
      WriteLn(' | ',a[i].name:32, ' |    ',a[i].vaga:10:5,'    |');
  WriteLn('------------------------------------------------');
  
...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедуры с записями 777pro777 Помощь студентам 1 26.05.2012 07:48
Работа с записями. dima-intro Помощь студентам 5 30.12.2010 10:01
Работа с записями dima-intro Помощь студентам 1 26.12.2010 13:43
работа с записями Андрей.12 Помощь студентам 0 20.12.2009 19:17
Программа с записями Алексей Д. Помощь студентам 5 27.04.2008 20:25