Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Решение задач на Pascal. Форум 2
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ]
Модераторы: paradise, KMA
  

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

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ]

Форум работает на скрипте © Ikonboard.com