KMA
Долгожитель
|
В связи с тем, что в теме Решение задач на Паскале, появился многочисленный спам, и модераторы не могут (отсутствуют, или не имеют возможности или их усилия не оправданы) удалить данную не приятность. Открываем новый топик. =) Сюда пишем задачи, вопросы, в общем все, что касается Паскаля. По поводу задач: здесь помогают их решить, т. е. вы излагаете задачу, предлагаете свой код, или мысли, которые у Вас возникают по этому поводу, и задаете конкретный вопрос (например, "не могу понять/составить алгоритм", "помогите найти ошибку в коде", "с чего начать", "объясните как работают массивы, записи" и т. д.). Задачи, скинутые на форум, без ваших мыслей -- игнорируются.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 25 июля 2007 10:02 | IP
|
|
Mult
Новичок
|
Люди добрые помогите пожалуйста...что то я торможу.Задача совсем простая нужно прочитать файл,затем отсортировать слова в алфавитном порядке и перезаписать файл заново. Оть... но что то не клеится совсем.Вот мой текст: PROGRAM LPR11; uses crt; CONST Count = 100; Type TArr = array [1..Count] of string; VAR STR,ST:STRING; I,KOL:INTEGER; MAS:TArr; {ввод имени файла, чтение файла} PROCEDURE {проверяю пустой файл или нет, если пустой..ругаюсь} PROCEDURE PROV_FILE(LEN:STRING); BEGIN IF LENGTH(LEN)=0 THEN WRITELN('ФАЙЛ ПУСТОЙ, СОРТИРОВКА НЕВОЗМОЖНА'); END; {функция возвращает по одному слову, из текста файла} FUNCTION TEXT:STRING; {сортирую массив слов по возростанию...по алфавиту} PROCEDURE SORT; VAR PER:STRING; K:INTEGER; BEGIN FOR K:=1 TO KOL-1 DO BEGIN IF MAS[K] > MAS[K+1] THEN BEGIN PER:=MAS[K+1]; MAS[K+1]:=MAS[K]; MAS[K]:=PER; END; END; END; {вывожу результаты работы на экран} PROCEDURE PRINT; VAR J:INTEGER; BEGIN FOR J:=1 TO KOL DO BEGIN WRITELN(MAS[J]); END; END; {главная программа} BEGIN ClrScr; FILELOAD(STR); PROV_FILE(STR); KOL:=0; REPEAT KOL:=KOL+1; REPEAT ST:=TEXT; UNTIL ST<>' MAS[KOL]:=ST; UNTIL LENGTH(STR)=0;{усли слов в файле больше...чем размер массива ругаюсь} IF KOL>COUNT THEN WRITELN('РАЗМЕР ФАЙЛА СЛИШКОМ БОЛЬШОЙ, СОРТИРОВКА НЕВОЗМОЖНА') ELSE BEGIN SORT; PRINT; END; readln; END.
|
Всего сообщений: 2 | Присоединился: август 2007 | Отправлено: 15 авг. 2007 13:23 | IP
|
|
Mult
Новичок
|
да...в задании сказано что использовать динамические переменные нельзя...поэтому стоит проверка на размер файла...
|
Всего сообщений: 2 | Присоединился: август 2007 | Отправлено: 15 авг. 2007 13:24 | IP
|
|
miss_graffiti
Долгожитель
|
Задачи, скинутые на форум, без ваших мыслей -- игнорируются.
Может, удалять? Чтобы не замусоривался форум...
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 16 сен. 2007 1:16 | IP
|
|
Siriusss
Новичок
|
Скажите пожалуйста, что значит в Паскале inc(i) - как это работает?
|
Всего сообщений: 28 | Присоединился: апрель 2007 | Отправлено: 15 окт. 2007 16:57 | IP
|
|
KMA
Долгожитель
|
Простенько, прибавляет к i единичку. В идеале операция инкремнта, если интересно как работает... иди к кодам ассемблера, там есть одноименная команда, например:
Code Sample:
inc i
Почему ее используют? Лично я ее стараюсь использовать повсеместно из-за того, что она работает быстрее, чем простая запись i:=i+1, ибо последняя работает при помощи команды add, плюсом обращение к памяти 2 раза происходит, а сама команда inc есть встроенная в архитектуру непосредественно 80/86 и занимает всего 1 операцию.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 16 окт. 2007 18:53 | IP
|
|
Zheka
Новичок
|
Помогите пожалуйста с программой. Уже 2 дня бьюсь. Вроде бы понял как решить, составил программу, но она считает неправильно. Вот текст задачи: Даны целые числа a[1],...,a[n] (в этой последовательности могут быть повторяющиеся члены). Получить все числа, которые входят в последовательность по одному разу. Вот то, что я составил: const n=20; var a:array[1..n]; i, k:integer; begin for i:=1 to n do read(a [ i ] ); for i:=1 to n do begin k:=a [ i ] ; for i:=1 to n do if k<>a[ i ] then writeln('k=',k); end; end. С помощью дополнительной переменной "к" и вложенного цикла я сравниваю все элементы массива, но в результате получаются одни нули. Я думаю что проблема во вложенном цикле, т.к. я один и тот же массив "прокручиваю" 2 раза, но другого пути решения никак не могу найти. Может кто-нибудь найдёт выход из ситуации!? (Сообщение отредактировал KMA 24 дек. 2007 18:02)
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 18 окт. 2007 6:00 | IP
|
|
KMA
Долгожитель
|
Вот это другой разговор... Вот таким людям я всегда рад помочь. В чем собственно ошибка, сейчас поясню. Во-первых давай сразу договоримся, что ты будешь печатать [ i ] таким образом, иначе это скрипт (разметка, не знаю как точно) BBCode. Выделение курсивом. Во вторых, уважаемый, смотри внимательно сам, ты два раза используешь i как счетчик цикла, при этом вложенный... Это всячески противоречит всем нормам. В третьих, ты же сравниваешь с 1 элемента во втором массиве, поэтому он видит этот элемент второй раз. Если все мной выше сказанное применить к коду, то у тебя получиться:
Code Sample:
var i, j, k: integer; eqauleFlag: boolean; a: array [1..n] of integer; BEGIN for i:=1 to n-1 do begin k:=a[ i ]; equaleFlag:=false for j:=i+1 to n do if k=a[j] then equaleFlag:=true; if not equaleFlag then write (k, ' '); end; END.
Теперь объясню код. Смысл состоит в том, что мы сравниваем каждый элемент с последующим. Смотри, берем 1 элемент массива его заливаем в k. Далее, запускаем второй цикл и начинаем сравнивать с остальными элементами, начиная со следующего (если первый шаг, то 1+1=2, если третий 3+1=4 и т. д.). Если хотя бы один из элементов эквивалентен нашему, значит есть одинаковые, об этом нам скажет переменная логического типа equalFlag, я их люблю просто называть флажками, т. к. они говорят, о произошедшем в программе, т. е. если флаг не установлен, или сброшен (equalFlag:=false), то данного признака пока нет, т. е. нет эквивалентных элементов, если же он выбран, то эквивалентные элементы есть. После того, как цикл проверки пройден, настает момент истинны, и если флаг не установлен ( not equalFlag) то значит эквивалентных нет, поэтому выводим, если же установлен, то ничего делать не надо. Затем продолжаем первый цикл. Теперь сравниваем 2 элемент, начиная с 3, предварительно сбросив флаг эквивалентности.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 18 окт. 2007 19:54 | IP
|
|
Zheka
Новичок
|
to KMA спасибо большое! Всё понятно, программа работает. Но почему переменная называется equaleFlag, ведь тип boolean можно присвоить переменной с любым названием, мне больше по душе простые названия (А, B, С)... Да и вот нашёл всё-таки ещё ошибку. Программа всё равно выводит повторяющиеся члены ряда, т.к. в цикле с j сравниваются не все числа с числами цикла с i . Допустим, что у нас такая последовательность чисел 1, 2, 3, 4, 5, 4, 3, 2, 1 Программа выведет числа 1, 2, 3, 4, 5 Если взять первое число 3, то программа сравнит его со всеми числами и ничего не выведет, но когда і станет равным второй тройке, то программа сравнит её лишь і+1 числами, т.е. с 2 и 4 и выведет число как не повторяющееся. (Сообщение отредактировал Zheka 19 окт. 2007 15:38)
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 19 окт. 2007 15:21 | IP
|
|
KMA
Долгожитель
|
Однако... Почему используются длинные имена? Потому что так приятнее программировать, названия переменных должны быть понятны. Это у тебя задачи в пять строк, а в идеале переменные запомнить просто, а вот когда ты работаешь скажем над целым проектом, который состоит из 20 тысяч строк, тогда уже точно забываешь, что у тебя за переменная такая a. по поводу задачи, ты прав, действительно не подумал... Но суть не меняется, просто изменить условия... Видишь ли, многое пишу не проверив, т. к. времени нет, а это очень плохо, в общем вот это должно работать:
Code Sample:
for i:=1 to n-1 do begin k:=a[ i ]; flagEquale:=false; for j:=1 to n do if (a[j]=k) and (j<>i) then flagEquale:=true; if not flagEquale then write (a[ i ]) end;
(Сообщение отредактировал KMA 19 окт. 2007 21:37)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 19 окт. 2007 21:31 | IP
|
|
|