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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2014, 13:42   #1
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию Вывод данных из базы по параметрам

База в типизированном файле. В базе есть марки авто, фио продавцов, год выпуска авто и др.
Нужно вывести на экран марки авто с самым ранним и поздним годом выпуска. И тех и других может быть несколько.

Результат выдает только одну марку позднего года выпуска.
Для раннего года выпуска марку не пишет, только год выводит.

Код:
program avto;
uses crt;
const n=10;
type zap=record 
	prodavec:string[8];
	marka:string[15];
	god, oborot:integer;
	date:string[8]
	end;
type zap1=record
    prodavec, date: string[8];
    end;
var d: file of zap;
    z: zap;
    mas:array[1..n] of zap;
    i, min, max: integer;
    a, b, Mmax, Mmin:string[15];
    
begin
    clrscr;
    assign (d, 'E:\d.txt');
    reset(d);
   read (d,z);
    min:=z.god;
    max:=z.god;
    while not eof (d) do begin
        read (d, z);
        if min>z.god then begin
            min:=z.god;
            a:=z.marka;
            end;
        if max<z.god then begin
            max:=z.god;
            b:=z.marka;
            end;
        end;
     writeln ('Young car: ', b, ' - ', max);
     writeln ('Old car: ', a, ' - ', min);
    writeln;
    close(d)
end.
Thabian вне форума Ответить с цитированием
Старый 03.04.2014, 13:52   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
И тех и других может быть несколько.
у Вас в коде это никак не учитывается.

я бы (по простому), сделал так: первый проход по файлу, ищем самый древний и самый новый года выпуска. Только года, ничего больше.
Потом второй проход по файлу - читаем - если года совпадают - вывод автомобиля на экран.
Всё.

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

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

Вариантов решения море.
Выбирайте любой, какой Вам по душе.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2014, 14:45   #3
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию

Спасибо.
А чтобы вывести данные сначала по старым годам, потом по новым, а не вперемежку, нужно сначала отсортировать базу по годам? Или проще будет сразу использовать массивы?
Thabian вне форума Ответить с цитированием
Старый 03.04.2014, 15:32   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А чтобы вывести данные сначала по старым годам, потом по новым, а не вперемежку, нужно сначала отсортировать базу по годам?
можно и так. Но это не обязательно (зачем сортировать те записи, которые нас не интересуют?!).
Поэтому нужно либо массивами воспользоваться, либо, банально:
Код:
  reset(d);
  в цикле перебираем записи, 
    <нашли минимальный (самый старый) и максимальный (новый) год>

  reset(d);
  в цикле перебираем записи, 
    если год записи == минимальный (самый старый) -> выводим сведения

  reset(d);
  в цикле перебираем записи, 
    если год записи == максимальный (новый) год -> выводим сведения
профит.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2014, 17:21   #5
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию

Да, теперь вижу, чего не хватало =) Забыл, что надо чтение каждый раз начинать сначала.
Чем проще, тем лучше.
Thabian вне форума Ответить с цитированием
Старый 03.04.2014, 17:49   #6
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию

Есть еще одна загвоздка с этой базой. Не получается удалить строку.

Код:
begin
    clrscr;
    assign (d, 'E:\d.txt');
    reset(d);
    writeln ('What delete?'); read (a);
    while not eof (d) do begin
        read (d,z);
        if a = z.marka then begin
            seek(d,i+1);
            read(d,z);
            seek(d,i);
            write(d,z);
            end;
        seek(d,filesize(d)-1);
        write (d,z);
        end;
    close(d);
    reset (d);
        writeln;
        writeln('----------------------------------------------------------');
        writeln('| Prodavec |     Marka     |  God  |  Oborot  |   Date   |');
        writeln('----------------------------------------------------------');
        for i:=1 to n do
          with z do begin
          read (d,z);
            gotoXY(1,whereY);write('| ',prodavec);
            gotoXY(12,whereY);write('| ',marka);
            gotoXY(28,whereY);write('| ',god);
            gotoXY(36,whereY);write('| ',oborot);
            gotoXY(47,whereY);write('| ',date);
            gotoXY(58,whereY);writeln('| ');
           end;
        writeln('----------------------------------------------------------');
    close(d);
end.
Thabian вне форума Ответить с цитированием
Старый 07.04.2014, 13:33   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы уже проблему с удалением?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.04.2014, 14:25   #8
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы уже проблему с удалением?
проблема еще жива, увы...
Thabian вне форума Ответить с цитированием
Старый 07.04.2014, 14:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Thabian Посмотреть сообщение
проблема еще жива, увы...
почитайте мой пост - ТУТ
Если пост не поможет и проблема с удалением не решится, пишите, решим!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.04.2014, 16:02   #10
Thabian
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 12
По умолчанию

Пробую второй способ с массивом.

Код:
    writeln ('What delete?'); read (a);
    i:=0;
    while not eof (d) do begin
        i:=i+1;
        if z.marka<>a then begin
            read(d, mas[i]);
            end;
        write (d,z);
        end;
Почему-то при таком чтении в массив, сохраняются строки через одну.
Thabian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод данных из базы limon142 PHP 13 28.04.2014 15:09
Вывод из Базы данных GoodNight PHP 2 04.04.2014 09:02
Вывод данных из базы в матрицу Anya2012 PHP 5 29.11.2012 14:52
Вывод изображений из базы данных Princesse PHP 5 12.01.2010 10:09