| Другое > 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 и сбрасываем вложенный цикл. Потом ищем следующее и т. д. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |