MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« : 13-04-2005 12:06 » |
|
Форумчане! Поможите пожалуйста с Паскалем. 100 лет на нём не писал и нет времени сейчас совсем писать. А тут такая штука, что дружку срочно понадобилась небольшая програмулинка. Ничего сложного нет, думаю у кого-нибудь вполне могла заваляться уже готовая Задание : Есть текстовый файлик вида : продукт;цена продукт;цена продукт;цена Надо в програмулинке открыть этот файл. Считать его и вывести на экран отсортированые списки типа : начиная с наименьшей цены и начиная с наибольшей цены. Причём для каждой сортировки надо написать процедуру(наверно потому что именно их они сейчас и проходят ). В общем народ поможите если кто имеет такое уже.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Sla
|
|
« Ответ #1 : 13-04-2005 13:14 » |
|
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #2 : 13-04-2005 13:20 » |
|
Sla, это не совсем то что нужно К сожалению нет времени это читать и реализовывать Но всё равно спасибо.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Sla
|
|
« Ответ #3 : 13-04-2005 13:44 » |
|
Приводимая ниже функция используется для вставки адресов почтовых корреспонденций в порядке возрастания фамилий /поле "name"/. В качестве результата функции выдается первый элемент списка. Входными аргументами этой функции являются указатели на начало и конец списка. добавление элементов в список с одной связью с сохранением упорядоченности function SLS_Store(info, start: AddrPointer;var last: AddrPointer): AddrPointer; var old, top: AddrPointer; done: boolean; begin top := start; old := nil; done := FALSE; if start=nil then begin (*первый элемент списка*) info^.next:=nil; last:=info; SLS_Store:=info; end else begin while (start<>nil) and (not done) do begin if start^.name < info^.name then begin old:=start; start:=start^.next; end else begin (*вставка в середину*) if old<>nil then begin old^.next:=info; info^.next:=start; SLS_Store:=top; (*сохранить начало*) done:=TRUE; end else begin info^.next:=start; (*новый первый элемент*) SLS_Store:=info; done:=TRUE; end; end; end; (*while*) if not done then begin last^.next:=info; (*вставка в конец*) info^.next:=nil; last:=info; SLS_Store:=top; end; end; end;
Идея такова, при считывании из файла, сразу же сортировка списка И когда список уже отсортирован, то бегать по списку, можно снизу вверх, сверху вниз
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #4 : 14-04-2005 06:44 » |
|
Как отсортировать массив стрингов (реально там только числа вида : 47,5 или 12,1) по возрастающей ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Alf
Гость
|
|
« Ответ #5 : 14-04-2005 07:02 » |
|
Как отсортировать массив стрингов (реально там только числа вида : 47,5 или 12,1) по возрастающей ? А сортировка нужна текстовая или по значению числа? Если по значению, не мешало бы сначала сделать преобразование, потому как при текстовой сортировке, например, 11 меньше, чем 4.
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #6 : 14-04-2005 07:35 » |
|
Уже сделал всё Спасибо всем
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #7 : 14-04-2005 09:10 » |
|
Вот если кому интересно Код конечно не супер Быстро надо было, я и не старался uses Crt; const arrStrN = 40; type str_arr = array [1..arrStrN] of string; var j,jj,jjj, minc : integer; dt, dt2 : str_arr;
function explode(sep,s:string;var a:str_arr):integer; { Разбить строку s на кусочки подстрокой sep и записать результат в строковый массив str_arr. Сама функция вернет число кусочков Например: explode('mp','This is an simple example',a) вернет число 3, и строки в массиве a: a[1]='This is an si'; a[2]='le exa'; a[3]='le'; explode(' ','This is an simple example',a) - вернет 5 и отдельные слова в массиве a 'This','is','an','simple','example' } var L:byte absolute s; i,n,k,d:byte; begin n:=0; for i:=1 to arrStrN do a[i]:=''; k:=Pos(sep,s); d:=length(sep)-1; while (L*k>0) do begin inc(n); a[n]:=copy(s,1,k-1); delete(s,1,k+d); k:=Pos(sep,s); end; inc(n); a[n]:=s; explode:=n; end;
Procedure OpenReadSortFile; var f:text; name:string; c,q,w, mincount, maxcount:string; sa:str_arr; ll:integer; begin writeln('Программа начала работу. Пробуем открыть файл'); writeln('**************************************************'); name := 'C:\PROGRA~1\TP\data.txt'; assign(f, name); {$I-} { - отключим стандартную проверку ошибок ввода/вывода} reset(f); {попробуем открыть файл} {$I+} if ioresult=0 then begin writeln('Всё в порядке. Файл нашёлся и открылся нормально'); writeln('**************************************************'); writeln('Считываем данные из файла и выводим на экран'); writeln('**************************************************'); ll := 1; while not seekeof(f) do begin read(f,c); explode(' ', c, sa); writeln(c); dt[ll] := sa[2]; dt2[ll] := sa[1]; ll := ll+ll; end; close(f);
end else writeln('Файл с именем ',name,' не найден. Попробуйте другое имя');
for j:= 1 to arrStrN-1 do for jj:=j+1 to arrStrN do if dt[j] > dt[jj] then begin q := dt[j]; w := dt2[j]; dt[j] := dt[jj]; dt2[j] := dt2[jj]; dt[jj] := q; dt2[jj] := w; end; writeln('**************************************************'); writeln('Выводим отсортированые по возрастанию цены данные'); writeln('**************************************************'); minc := 1; for jjj := 1 to arrStrN do begin if dt[jjj] <> '' then begin if minc = 1 then begin mincount := dt[jjj]; minc := minc + minc; end; writeln(dt2[jjj],' ', dt[jjj]); maxcount := dt[jjj]; end end; writeln('**************************************************'); writeln('Наименьшая цена : ', mincount); writeln('Наибольшая цена : ', maxcount);
end;
begin ClrScr; OpenReadSortFile; writeln('**************************************************'); writeln('Программа закончила работу. Нажмите "ENTER" для завершения...'); readln; end.
И сам текстовый файл вида : product1 18,78 product2 16 product3 78,45 product4 25,7 product5 18,79 product6 18,05
|
|
« Последнее редактирование: 03-12-2007 19:04 от Алексей1153++ »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #8 : 14-04-2005 09:15 » |
|
потому как при текстовой сортировке, например, 11 меньше, чем 4.
Мдас Вот это уже проблема Может кто подскажет как это сделать ? Желательно в виде функции.
|
|
« Последнее редактирование: 14-04-2005 09:47 от MOPO3 »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Alf
Гость
|
|
« Ответ #9 : 14-04-2005 10:07 » |
|
Там у нас в библиотеке есть книжка Вирта "Алгоритмы и структуры данных", в ней есть готовые рабочие программы и сортировки, и преобразования текста в число.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #10 : 14-04-2005 10:24 » |
|
Вместо " dt[ll] := sa[2]" юзай Val( sa[2],dt[ll],dummy_code)
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #11 : 14-04-2005 10:45 » |
|
Вместо " dt[ll] := sa[2]" юзай Val( sa[2],dt[ll],dummy_code)
Error in expression!
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #12 : 14-04-2005 11:40 » |
|
на Паскакале не писал лет 7 наверное, мож чё подзабыл... dt должен быть array [1..N] of real; в dummy_code вроде возвращается код ошибки... VAL Syntax: VAL(St, Num, Error_code) Purpose: to convert a string value which is in the form of a valid numeric quantity to the numeric value it represents. If the conversion can be made without error, the value is placed in Num (and the conversion is controlled by the declared numeric type of Num) and Error_code = 0. If an error occurs, the value of Num is unchanged; Error_code > 0 and points to the first position in St where a conversion error occurred. Examples: Var Num_str: String[20]; R_Num: Real; I_num, Error: Integer; Num_str := '23.45'; Val(Num_str, R_Num, Error); {R_Num = 23.45, Error = 0} Val(Num_str, I_Num, Error); {Error = 3; R_Num stays 23.45 } Num_str := '256,78'; Val(Num_str, R_Num, Error); {R_Num = 23.45, Error = 4} Num_str := '23456'; Val(Num_str, I_Num, Error); {I_Num = 23456, Error = 0} Val(Num_str, R_Num, Error); {R_Num = 23456.0, Error = 0} отсюда http://math.uww.edu/~harrisb/courses/cs171/strings.htmlскорее всего запятая в твоей стоимости не пройдет придется заменять
|
|
« Последнее редактирование: 20-12-2007 21:08 от Алексей1153++ »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #13 : 14-04-2005 12:21 » |
|
Сорри, моя ошибка была
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #14 : 15-04-2005 12:11 » |
|
Эх! Сдал сегодня дружок эту програмулинку Получил 10 баллов! (ну по вашему 5 наверное с плюсом) Спасибо вам ребята за помощь!
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
|