Помощь - Поиск - Пользователи - Календарь
Полная версия: Решение Задачи к учебнику Ушаков,Юркова
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Дмитрий Ильин
Доброго времени суток,начал изучение Pascal неделю назад,были кое-где вопросы,где непонятки,где-то решал сам,где помогали соседи,интернет.
Но тут все гораздо сложнее*
(!) смотрите вложение
Урок 3.2. по задаче мы должны написать программу которая из 3 строчек,выберет несколько,определенно запрограммированных букв,затем по алфавиту поменять их на N количество в лево/право,НО^
!)нам надо ввести 3 строчки
FINISHED
OR
PENDING?
а уже в каждой из строчек выбрать первую букву,в другой строчке вторую букву,и ее уже редактировать(менять на 1-2 пункта влево/право по алфавиту)
И в итоге таких манипуляций на выводе должно быть слово DONE
2) Пока что из книги,я могу менять только символы занесенные в переменную(Char),т.е. 1 символ,а тут целое слово,алгоритма деления слова на буквы,занесения каждой буквы в ячейку(это вроде дальше-массивы),и уже из массивов выдирать те символы что нам необходимы.
Вопрос
Так все таки как написать такую программу?
Или все эти 3 строчки я не должен вводить в программу?(Readln(x1)) ?
Не думаю что тут дойдет до массивов,т.к. я прошел только переменные,константы,умножение,деление,ост
атки,и даже до условия(If else ) еще не дошёл ,как быть?Буду благодарен за ответы,надеюсь я не такой "непробиваемый"
спасибо
_______________________________________________________
* - возможно я немного не понял поставленной задачи
potter-by
Я так понимаю, что если просят ввести СТРОКИ, то нужно вводить СТРОКИ, а не массивы символов!
Дмитрий Ильин
Это ответ?Я ВСЕ описал,а вы мне говорите про строки,да я же говорю что не знаю как записать эти строки а потом выбрать из них несколько букв отдельных! Читайте внимательно
Дмитрий Ильин
И так....
Раз ответа я так и не получил,решил сделать все сам,но получилось довольно "Грубо"...
задача была такая
1) Т.к. Отделять Буквы от слова программным методом я не умею еще,я сам записал эти буквы.и присвоих их к переменным типа char.
2) Узнал коды иэтих символов.с помощью команды a1:= Ord(a);
3) Мне необходимо были возвратить предществующий элемент(по 2 раза) относительно значений 1 и 3 буквы,а 2 и 4 оставить без изменения
4)певерести номера символов обратно в соответствующие символам в таблице слова,и
5) собственно вывести эти 4 буквы в порядке 1,2,3,4 что бы получилось слово и оно получилось
Done

Теперь код...Простите rolleyes.gif

program n_3.3;
uses crt;
var a,b,c,d,e:integer;
a_1,b_2,c_3,d_4,a_a,b_b,c_c,d_d:integer;
a1,a2,a3,a4:Char;
begin
a1:='F';
a2:='O';
a3:='P';
a4:='E';
a:=Ord(a1);
b:=ord(a2);
c:=Ord(a3);
d:=Ord(a4);
a_1:=Pred(a);a:=Pred(A_1);
b_2:=b;
c_3:=Pred©; c:= Pred(c_3);
d_4:=(d);
a1:=chr(a);a2:=chr(b_2); a3:=chr©; a4:= chr(d_4);




writeln('Слово', a1 ,a2 , a3, a4, 'Нажмите ENTER' );
readln();
writeln('Вроде получилось =) ');
readln()





end.


_____________________________________
* смотрите вложение (PascalABC)
potter-by
Работает, работает! Но где вы вводили строки? Несоблюдено условие задачи!
Дмитрий Ильин
Цитата(potter-by @ 10.12.2011 10:08) *

Работает, работает! Но где вы вводили строки? Несоблюдено условие задачи!


Я вот одного не понимаю,я сюда пришел помощи просить,как сделать эту задачу,если до этого тем с отделением букв от вводимых с клавиатуры слов- НЕБЫЛО!!!!
Если вы так категоричны относитесь к моему коду,который я составлял описарясь на знания,полученные из учебника,тогда напишите САМИ ЭТОТ КОД,не применяя массивов,операторов условия и т.д
Мне интересно как вы это сделаете
Krjuger
Просто вам надо бы написать более мене доходчиво ваше задание.
Цитата

Урок 3.2. по задаче мы должны написать программу которая из 3 строчек,выберет несколько,определенно запрограммированных букв,затем по алфавиту поменять их на N количество в лево/право,НО^
!)нам надо ввести 3 строчки
FINISHED
OR
PENDING?
а уже в каждой из строчек выбрать первую букву,в другой строчке вторую букву,и ее уже редактировать(менять на 1-2 пункта влево/право по алфавиту)
И в итоге таких манипуляций на выводе должно быть слово DONE

Я чесно пытался понять,что надо сделать,но понял лишь то,что у нас 3 строки , мы что то делаем с первой, второй и третьей.....
Я вот хоть убей не понял,как из FINISHED OR PENDING можно получить слово DONE.Ну выбрали мы из каждой строчки FOP, что за другая строчка, ну допустим выбираем 2 букву ,будет либо I,либо O,либо E.Какими магическими действиями вы руководствовались, чтобы из 4 букв, из которых всего 2 вообще входят в DONE, чтобы получить результат.Почему именно первую и третью меняем??Это ваше умозаключение или конкретное задание?

Так что не удивляйтесь,что вам не отвечают.То что вы сделали,это не работа с 3 строками а работа с 4 символами.....Так же не понятно, ваш пример с FINISHED OR PENDING DONE, это все что должна делать задача?Других возможных введенных строк быть не может? Или у нас строго фиксирован алгоритм замены букв?
IUnknown
Цитата
тогда напишите САМИ ЭТОТ КОД,не применяя массивов,операторов условия и т.д
Мне интересно как вы это сделаете
Легко. Только для этого надо внимательно читать всё, что написано ВЫШЕ по тексту (в книге), чтоб знать, как происходит ввод данных. Если автор описал его на должном уровне, разумеется. А если не описал - то надо менять книгу...

var
lett1 : char;
lett2 : char;
lett3 : char;
lett4 : char;
begin
readln(lett1);
readln(lett2);
readln(lett3, lett4);

lett1 := pred(pred(lett1));
lett3 := pred(pred(lett3));
writeln(lett1, lett2, lett3, lett4);
end.
Массивы есть? Нет. Операторы условия? Ни в коем виде. Строки вводятся? Вводятся. Результат получаем? Получаем. Где подвох?
Дмитрий Ильин
Уважаемые форумчане,я письменно привел кратко,обрано что нам необходимо сделать,в каждом сообщении есть приписка(смотрите вложение*),в 1 вложении в ПДФ файле текст задачи,а точнее ксерокопия страницы учебника с ней,я не знаю куда вы смотрели,все материалы по задаче я выложил,включая свой вариант решения(хоть и просто букв
P.s.. Kjuger смотри вложение с пдф файлом в конце моего сообщения(1-вого).
p.p.s сейчас проверю ваш код

*спустя 30 секунд blink.gif ,вау,честно сказать я не ожидал что все так просто....
А можете рассказать как так получилось что из всего слова(введенного),мы как то выбрали определенные буквы?
просто в учебнике написано как менять символы,отдельно,про манипуляции со словом- нет ни заметки,поэтому я не могу так сделать,можете объяснить?
Krjuger

readln(lett1);
readln(lett2);
readln(lett3, lett4);


Вот здесь все кроется,да мы вводим строки,но нам глубоко плевать, какие символы в первой и второй строках идут после первого элемента,мы создаем 2 элемента типа char и записываем в них первую букву.
readln(lett3, lett4); записываем в lett3 первую букву, а в lett4-вторую.....Почему так происходит...Так устроен readln, в книжке должно быть написано,как с ним работать, если не написано,то гугл знает, описания стандартных функций много в интернетах.
Дмитрий Ильин
ок,вот еще пара вопросов
1)А если мне нужно 6 символ от слова?6тую букву из слова,мне придется прописывать

a,b,c,d,e,f6:char;
Readln(a,b,c,d,e,f6); и только потом использовать мой f6 символ?
2) эту тему я понял,перешел к булевым выражениям,встал на задаче 4.1
вот собственно задача

Задание 4.1. Определите в программе 4 логических переменных, которые содержат следующую информацию о людях:
Married — «истина», если человек женат (замужем),
Blond — «истина», если у человека светлые волосы,
Male — «истина», если человек — мужчина,
Employed — «истина», если человек работает.

Составьте логические выражения, с помощью которых можно определить, является ли человек:
1) замужней женщиной;
2) неженатым мужчиной;
3) незамужней блондинкой;
4) безработной незамужней женщиной;
5) либо неженатым, либо безработным, либо и тем и другим.

у меня получается только два первых действия,а код занимает уже весь экран
Код

program qu_1;
uses crt;
var
Married,Blond,Male,Employed:boolean;
a1,b1,c1,d1:boolean;
  a,b,c,d:char;
begin
Married:=True;
Blond:=True;
Male:=True;
Employed:=True;
       writeln('Вы замуженяя ?[y/n]');
              Readln(a);
Married:= a = 'y';
           writeln(Married);
       Writeln('Вы неженаты?[y/n]');
              readln(b);
       writeln('Вы мужчина?[y/n]');
              readln(c);
Married:= b = 'y';
male:= c = 'y';
a1:=married and male;
       Writeln('вы неженатый мужчина? ответ: ',a1);


end.


и это только 2 действия,да и нелогично + надо как-то код упростить,а я немного не понимаю -как.Поможете?
Krjuger
ЭМ вообще то для этого надо создавать новые темы,а не делать свалку из одной, затем, чем можно пользоваться? Условиями можно?Во вторых, у вас неправильный принцип построения программы, сначала вы должны получить все 4 параметра о человеке, а уж потом начать проверять.

program qu_1;
uses crt;
var
Married,Blond,Male,Employed:boolean;
a1,a2,a3,a4,a5:boolean;
a,b,c,d:char;
begin
Married:=True;
Blond:=True;
Male:=True;
Employed:=True;
writeln('Married?я ?[y/n]');
Readln(a);
Married:= a = 'y';
writeln(Married);
Writeln('Blond?[y/n]');
readln(b);
Blond:= b = 'y';
writeln('Male?[y/n]');
readln©;
Male:= c = 'y';
writeln('Employed?[y/n]');
readln(d);
Employed:=d='y';
a1:= Married and not male;
Writeln('Married women: ',a1);
a2:= not Married and male;
Writeln('Not married men: ',a2);
a3:= not Married and Blond;
Writeln('Not Married Blond: ',a3);
a4:= Not Employed and not Married and not male;
Writeln('Not Work Not Married women: ',a4);
a5:= (Not Married and not Employed) or Not Married or not Employed;
Writeln('Number 5: ',a5);
readln;
end.


Твоя же работа,только доведенная,но я не проверил, все возможные варианты,так что проверь,если что то не сработает,говори,но вроде все должно быть норм.
IUnknown
Krjuger
Цитата
a3:= not Married and Blond;
- это неженатый блондин или незамужняя блондинка. В задании явно сказано, что нужна особа женского пола. А в условии A5 первая часть (то, что в скобках) явно лишняя. Минимизируй выражение - получишь (not Married or not Employed).
Дмитрий Ильин
кажется я понял
1) мы должны спросить у пользователя несколько вопросов(Мужчина ли он,Блондин ли он,работает/неработает)\
2)получив ответы на вопросы,мы заносим их в переменные
3)оперируя(всмысле используя) полученные ответы мы с помощью логических операций выводим правильные ответы в порядке 1) 2) 3) 4) 5) ?(а я вообще делал по 1 вопросу...)

Прошу прощенья за "свалку тем",просто если я каждый раз буду создавать тему,то.....ни к чему хорошему это не приведет,а тут в заголовке написано- "Помогите решить зачаду (Учебник Ушаков и Юрьева)"
Надеюсь на понимание и спасибо за код,сейчас буду разбирать.
Krjuger
Чорт, да чето я опростоволосился.

a3:= not Married and Blond and not Male;
Writeln('Not Married Blond women: ',a3);


Насчет второго,я понимаю,но у него 5 пункт хвучит так, ну и я решил не минимизировать,а сделать дословно.
Дмитрий Ильин
Все равно,булеан и условия If для меня(для понимания) сложноваты,может есть какой нибудь вариант где можно потренероваться,поднатянуться для понимания?Буду благодарен
Krjuger
Для понимания нет,просто решай задачи,пробуй, просто не надо спешить, если уж совсем не способен осознать, принимай на веру,в последствии с опытом переосмыслиш(но осоно не злоупотребляй этим)
Если пояснить то булеан хранит либо True,либо False, так же в некоторых источниках может быть правда,ложь или 0 , 1. Этот тип собственно отображает результат любых логических операций.А теперь на примере.
Married:= a = 'y';

У нас есть переменная a,мы сравниваем ее 'y'и записываем результат в переменную Married, у нас 2 варианта,либо а='y' ,тогда Merried будет True, либо Merried будет False, если а не равно 'y'.
Аналогично
a3:= not Married and Blond and not Male;
Дмитрий Ильин
как раз вот это я и понимаю )) Married:= a = 'y';
а вот a3:= not Married and Blond and not Male;
это уже сложно,плюс я не понимаю зачем изначально в программе прописывать 4 переменные которые имеют ответ=True,если в последствии мы можем повлиять на их значение
Male:= True
writeln('Мужчина?');readln(a);
Потом мы сравниваем переменную(которая зараннее уже положительна,т.е. True), male:= a = 'y';
вот этого не пойму ( перерыскал YouTube там только основы,т.е. элементарные уравнения типа X>3,а задачек с решениями нет,из одноклассников,или хотя бы паралели никто не учит паскаль,дельфи,с.
Да и думаю что Boolean Во всех языках есть,так что пропускать его,это очень плохо в будушем,хотя может со временем мозги "встанут" на нужное место,при дальнейшей учебе паскаля
Krjuger
Это одно из правил нормального программирования,все переменные инициализируются(создаются если попроще) с начальным значением.Дело в том,что некоторые языки требуют обязательно инициализировать,некоторые нет.Паскаль среди вторых.По сути если самому не инициализировать,то паскаль по дефолту чаще всего ставит нуль,но это не может нам гарантировать,что на 100500ом запуске программы он не запишет вместо нуля какую нибудь другую информацию.Поэтому признаком грамотной программы,пусть даже этого не требует среда, все равно будет их инициализация.

а вот a3:= not Married and Blond and not Male;

Смотри здесь уже чистая логика.В Married храниться женат ли человек, если человек не женат, то в Married будет 0(ложь), not Married вернет нам отрицание 0 тобишь 1(мы же ищем именно неженатого человека).А полная суть этой строчки заключается в том,что если not Married, Blond, not Male все будут единицами(правдой),то мы получим в а3 единицу,тобиш истину, если будет хотябы 1 ноль,тобиш ложь,то это будет означать что одно из условий не выполняеться и значит данный человек не подходит под описание и в а3 попадет ноль.Я думаю таких вещей,как Математическая логика, или Алгебра логики, вы не знаете, поэтому пояснять коментарий IUnknown про минимизацию для ответа на 5 вопрос я не стану.
Дмитрий Ильин
(not Married or not Employed).
На сколько я знаю not - имеет наивысший приорите,and - средний , Or и xor(отрицание)-наименьший,ведь так?
Исходя из этого ,мы получаем по действиям
1)Не замужем
2) не рабочий
3) или
4 не замужем ИЛИ НЕ РАБОТАЕТ,причем логическое ИЛИ будет зависеть от операндов 1 и 2
True + true = True
True +false = TRUE
FALSE + TRUE = TRUE
FALSE +FALSE = FALSE
Получается Если МЫ Замужем и работаем то выводится ...FALSE + FALSE = FAlse?
вот тут я и путаюсь)
А так спасибо) расжевали)
IUnknown
Цитата
На сколько я знаю not - имеет наивысший приорите,and - средний , Or и xor(отрицание)-наименьший,ведь так?
Так, ну и что?

Цитата
Исходя из этого ,мы получаем по действиям
Смотри:

У тебя есть переменная Married, которая обозначает, состоит ли человек в браке. И переменная Employed, которая обозначает, работает ли он. Утверждение гласит: not Married or not Employed.

Берем вариант: Married = true, Employed = false. Тогда условие примет вид: not true or not false, то есть, false or true. Чему равно? Правильно, true. Не замужем ИЛИ не работает? Да, человек или не в браке, или не работает, утверждение ИСТИННО. Что не так? Вроде все верно.

Берем другой вариант: Married = true, Employed = true. Тогда условие будет каким? not true or not true, то есть false or false, что равняется false. То есть, в переводе на нормальный язык: если человек состоит в браке и работает (это задается значениями переменных Married/Employed), то утверждение "не замужем ИЛИ не работает" ЛОЖНО. Он И состоит в браке И работает одновременно...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.