Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
<< < (9/15) > >>
topos84:

--- Цитата: Fly ---Однако если написать через запятую, то будут одного типа.
--- Конец цитаты ---
А что ты, собственно, понимаешь под одинаковым типом? Сравнивать такие переменные можно будет, производить арифметические и прочие операции - тоже. Тогда в чем, по-твоему, будет различие типов, если эти две переменные задать не через запятую? Или тут каким-то образом вовлечен ООП (объекто-ориентированный подход), мол, (тип_переменных_№1, тип_переменных_№2, ...)? Что-то мне так не кажется. :?
Fly:
topos84, не помню точно, там что-то вроде присваивания не работает. Давно проводил эксперимент, может не с массивами, а с другими произвольными типами.
gepar:
Ну что же  , перехожу к покорению файлов  :) Хотя с подпрограммами надо будет когда свободное время будет поработать - попробовав сделать ещё пару заданий где нужно кроме осн. программы писать подпрограммы .
С файлами немного не разобрался ,  поэтому программа почему то не совсем верно работает .
Задание : Организовать файл целых чисел из N компонент .Определить сумму компонент файла имеющих нечётные индексы .
Мой код :

--- Код: ---program proga301;
uses crt;
type
ff=file of integer;
var
log_f:ff;
rez,n:integer;
procedure zapolnenie(var f:ff;var n:integer);
var
i,komp:integer;
Begin
 writeln('Vvedyte koli4estvo komponentov v faile');
 readln(n);
 rewrite(f);
 writeln('Vvedyte komponenti faila');
 for i:=1 to n do
 Begin
  read(komp);
  write(f,komp);
 end;
 close(f);
end;
procedure vyvod(var f:ff);
var
 komp:integer;
Begin
 reset(f);
 while not eof(f) do
 Begin
  read(f,komp);
  write(komp,' ');
 end;
 close(f);
 writeln;
end;
procedure suma(var f:ff;var rez:integer;var n:integer);
var
 komp,i:integer;
Begin
 reset(f);
 rez:=0;
 for i:=1 to n do if i mod 2<> 0 then
 Begin
  read(f,komp);
  rez:=rez+komp;
 end;
 close(f);
end;
Begin
 Assign(log_f,'data.dat');
 clrscr;
 zapolnenie(log_f,n);
 writeln('Sodergimoe faila');
 vyvod(log_f);
 suma(log_f,rez,n);
 writeln('Summa NE4etnih elementov',rez);
end.
--- Конец кода ---

Программа при подсчетах не считает первый символ почемуто , проблема как я понял таиться в подпрограмме suma здесь :

--- Код: ---for i:=1 to n do if i mod 2<> 0 then
 Begin
  read(f,komp);
  rez:=rez+komp;
 end;
--- Конец кода ---
Подскажите что не так я сделал пожалуйста , или если можно было сделать по другому цикл то напишите как .
Fly:

--- Цитата ---for i:=1 to n do if i mod 2<> 0 then
 Begin
  read(f,komp);
  rez:=rez+komp;
 end;
--- Конец цитаты ---
У тебя здесь чётные компоненты не пропускаются, в результате получается сумма первых n/2 компонент. Следует читать каждую компоненту, но в переменную rez записывать только нечётные.
gepar:

--- Цитата: Fly ---У тебя здесь чётные компоненты не пропускаются, в результате получается сумма первых n/2 компонент. Следует читать каждую компоненту, но в переменную rez записывать только нечётные.
--- Конец цитаты ---
Спасибо , тогда подсказка помогла и я исправил ошибку :)
Теперь вот стеки и дерево данных мучаю , сложные гады , это последняя тема которую мы изучаем , дальше - делфи , делфи пока только запускал да тесты делал - кнопки приделывал , вроде делфи поинтересней паскаля  :)
Chameleon:
Народ помогите решить задачку "Нужно составить программу которая удаляет самое длинное слово в предложении" что то дорубиться немогу.
gepar:

--- Цитата: Chameleon ---Народ помогите решить задачку "Нужно составить программу которая удаляет самое длинное слово в предложении" что то дорубиться немогу.
--- Конец цитаты ---
Это просто в строке или в текстовом файле ?
Chameleon:
gepar, в строке
Fly:
Можно так: сначала ищешь самое длинное слово в предложении, узнаёшь порядковый номер символа, с которого оно начинается, и его длину. Допустим, s - строка, n - откуда слово начинается, l - длина слова с пробелом после него. На основе этих значений получаешь строку без этого слова:

--- Код: ---copy(s, 1, n) + copy(s, 1+n+l, length(s)-n-l)
--- Конец кода ---
gepar:

--- Код: ---var
  temp,max,s:string;
  i:integer;
begin
  writeln('Введите строку');
  readln(s);
  max:='';
  temp:='';
  for i:=1 to length(s) do
  begin
    if s[i]<>' ' then
      temp:=temp+s[i];
    if (s[i]=' ') or (i=length(s)) then
    begin
      if (temp<>'') and (length(temp)>length(max)) then
        max:=temp;
      temp:=''
    end
  end;
  if max<>'' then
  begin
    delete(s,pos(max,s),length(max));
    writeln('Самое длинное слово в заданной строке : ');
    writeln(max);
    write('Строка после удаления самого длинного слова :');
    writeln(s)
  end
  else
    writeln('В строке нет слов!')
end.
--- Конец кода ---
P.S это я поленился и нашёл в инете код по поиску самого длинного слова и просто чуть-чуть его подредактировал и добавил немного вывода текста , если хочешь могу завтра поучитывать всякие условия и то что в строке могут быть символы чтобы при их наличии прога считала это концом слова или у тебя будет просто строка из нескольких слов ?
Chameleon:
gepar, Спасибо, это будет просто строка из нескольких слов, я тоже искал в нэте но что то не нашёл.А вот с такой сможешь помочь, "С помощью множества составить программу,подсчёта количества цифр в десятичной системе счисления" Буду очень благодарен.
topos84:

--- Цитата: Chameleon ---"С помощью множества составить программу,подсчёта количества цифр в десятичной системе счисления"
--- Конец цитаты ---
В десятичной системе счисления в среднем приблизительно 10 цифр. ;)
Посчитал на пальцах: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}.  :)
Вот только не помню, есть ли у Паскаля библиотека fingers или нет.  :D
 :lol: :lol: :lol:

А если серьезно, то тебе нужна программа, которая считает количество цифр в веденном пользователем числе (натуральном, видимо), так? Ну, это делается нетрудно, да еще и с множествами - совсем просто.

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

Это в случае, если тебе требуется посчитать количество различных цифр в числе, введенном пользователем (надеюсь, именно это от тебя в задаче и требовалось). Если же требовалось посчитать количество всех цифр в числе (т.е. длину числа в цифрах), то тут тогда не ясно, нафига нужны множества, когда достаточно было бы использовать строки.
Chameleon:
topos84,Спасибо, всё понятно, действительно просто, попробую. А то что ты до 10 считать умеешь это хорошо :)

Добавлено позже:
кстати я ошибся маленько, в десятичной записи числа, а не в  системе счисления.
gepar:

--- Цитата: Chameleon ---А вот с такой сможешь помочь, "С помощью множества составить программу,подсчёта количества цифр в десятичной системе счисления" Буду очень благодарен.
--- Конец цитаты ---
Я множества так и не изучил , у нас в программу по изучению паскаля они не входили , хотя в книге по паскалю есть такой пункт , надо будет прочитать и разобраться заодно .
Chameleon:
А вот она у нас как раз была, училка говорит легкая тема............посмотрим.
topos84:
Не, ну правда же, множества - самый простой тип (из нетривиальных). Я помню, когда решал задачи на Паскале, где не было требования решить ее конкретным образом, всегда пытался решить сначала с множествами (кроме, конечно, тех случаев, когда от них никакого явного толка нет).
Roman:
Люди, помогите. Очень нужна программа на Паскале, которая бы удалила повторы слов в строке, а затем выводила результат. Например:
rabbit wolf wolf
Должно получиться “rabbit wolf”.
wolf rabbit wolf
Должно получиться “wolf rabbit” или “rabbit wolft”.
bat bat
Должно получиться “bat”.
pig pig cat
Должно получиться “pig cat”.

В качестве разделителя слов - пробелю.

Желательно код с комментариями.
 :)
HardWareMan:
Парси строку на слова, потом сравнивай их. Я предлагаю сделать так: есть массив строк. Есть входная строка. Изначально массив состоит из пустых строк. Парсим введенную строку. Слово между пробелов. Ищем, есть ли такое в массиве - нет записываем, есть - пропускаем. Когда введенная строка кончится, тупо вывести все ненулевые строки из массива. ;)
Roman:
HardWareMan,
Можно код?
Fly:
Массив строк много памяти требует.
Я предлагаю так: берём исходную строку и идём по ней с конца. Когда образуется слово, вложенным циклом ищем это слово дальше по строке. Если находим, то удаляем ранее найденное слово процедурой delete и сбрасываем вложенный цикл. Потом ищем следующее и т. д.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии