Помогите с доработкой программы
| |
Nikstoun | Дата: Понедельник, 23 Ноября 2015, 20:46 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Приветствую всех ! Есть простенькая программа .
-----------------------------------------
Код var b:integer; a:string; pon:='понедельник'; vt:='вторник'; sr:='среда'; ch:='четверг'; pya:='пятница'; subb:='суббота'; voskr:='воскресенье'; //Выводится случайное число от 1 до 7 , пользователь должен написать //название дня недели соответствующий цифре , все это зациклено begin write ('Вы увидите число , напишите название дня недели '); writeln ('соответствующее этому числу '); b:=random(1,7); Writeln ('День номер ', b); Write ('Это '); Read (a); if b=1 then begin if a=pon then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это понедельник !'); if b=2 then begin if a=vt then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это вторник !'); if b=3 then begin if a=sr then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это среда !'); if b=4 then begin if a=ch then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это четверг !'); if b=5 then begin if a=pya then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это пятница !'); if b=6 then begin if a=subb then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это суббота !'); if b=7 then begin if a=voskr then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это воскресенье !'); end.
-------------------------------------------------
Вот в чем проблема , кроме вывода "вы правы" выводится еще и 6 "вы не правы" , в чем ошибка ? P.S. Как видите , пока что тут нет циклов , будут в будущем .
Сообщение отредактировал Nikstoun - Понедельник, 23 Ноября 2015, 20:53 |
|
| |
Sasha7b9 | Дата: Понедельник, 23 Ноября 2015, 20:57 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| Э, так читать - все глаза поломать можно. Я бы на твоём месте проявил сочувствие к читающим и отформатировал текст.
Танкист МК
|
|
| |
martuk | Дата: Понедельник, 23 Ноября 2015, 21:22 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Все очень просто!) "Вы не правы" выводится уже от других условий! Используй кейсы! Никаких циклов в будущем не нужно!
Добавлено (23 ноября 2015, 21:20) ---------------------------------------------
Цитата Nikstoun ( ) в чем ошибка ? И кстати в коде нет ошибок. Он делает так как ты ему сказал! Разжую сейчас!
Допустим тебе выелось 1 и ты написал pon, то он конечно сравнил в первом условии и выдал "вы правы!", все хорошо но ты забыл о следующих проверках. Следующая проверка не прошла, и она конечно выкинула "Вы не правы!" и так 6 раз.
Чтобы обойти это:
1. Использую вложенное условие (хотя не рекомендуется) Например:
Код if b=1 then begin if a=pon then Writeln ('Вы правы !'); end else begin writeln ('Вы не правы ! Это понедельник !');
//Если 1 условие не прошло, то проверяем второе if b=2 then begin if a=vt then Writeln ('Вы правы !'); end else begin writeln ('Вы не правы ! Это Вторник!'); //И здесь начинай так же проверять среду end end
2. Используй кейсы!) А то слишком много ифоф. Грузить будет процессор)
Сообщение отредактировал martuk - Понедельник, 23 Ноября 2015, 21:27 |
|
| |
Nikstoun | Дата: Понедельник, 23 Ноября 2015, 21:29 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| martuk, спасибо за подсказки , но вот в чем проблема . Я и так использовал вложенные условия , если внимательно присмотреться то можно увидеть их !
--------------------
Код if b=1 then begin if a=pon then Writeln ('Вы правы !'); end Else writeln ('Вы не правы ! Это понедельник !');
if b=1 then begin if a=pon then Writeln ('Вы правы !'); end else begin writeln ('Вы не правы ! Это понедельник !');
p.s. одно и то же) -----------------------------------------------
Расскажи о кейсах (или дай ссылку на изучению оного) .
|
|
| |
martuk | Дата: Понедельник, 23 Ноября 2015, 21:37 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Цитата Sasha7b9 ( ) Я бы на твоём месте проявил сочувствие к читающим и отформатировал текст. Сайт почему то убирает пробелы...
Ну вот, так может понятней
Код >[color=blue]if[/color] b=1 [color=blue]then[/color][color=blue]begin[/color] >___[color=blue]if[/color] a=pon [color=blue]then[/color] Writeln ([color=purple]'Вы правы !'[/color]); >[color=blue]end else begin[/color] >___writeln ([color=purple]'Вы не правы ! Это понедельник !'[/color]);
>___[color=green]//Если 1 условие не прошло, то проверяем второе[/color] >___[color=blue]if[/color] b=2 t[color=blue]hen begin[/color] >______if a=vt [color=blue]then[/color] Writeln ([color=purple]'Вы правы !'[/color]); >___[color=blue]end else begin[/color] >______writeln ([color=purple]'Вы не правы ! Это Вторник!'[/color]); >______[color=green]//И здесь начинай так же проверять среду[/color] >___[color=blue]end[/color] >[color=blue]end[/color]
Добавлено (23 ноября 2015, 21:37) ---------------------------------------------
Цитата Nikstoun ( ) Я и так использовал вложенные условия Ага, ты использовал внутри каждой проверки цифр. А собственно нужно, чтобы следующая проверка осуществлялась внутри else предыдущей проверки.
Опа. Я своем коде ошибся, погоди секунду
Сообщение отредактировал martuk - Понедельник, 23 Ноября 2015, 21:34 |
|
| |
Nikstoun | Дата: Понедельник, 23 Ноября 2015, 21:39 | Сообщение # 6 |
почетный гость
Сейчас нет на сайте
| martuk, я понял в чем проблема ! У меня есть 2 if при 1 цифре . 1 if проверяет равно ли b числу , а 2 if проверяет равно ли a переменной ... Дак вот , суть в том , что при 2 if есть всего-лишь 1 else ! И это else относится к 1 if , то есть если b не равно 1 , то действие не просто пропускается , а запускается else , при котором пишется , что мы не правы ! Как это исправить ?
----------------------------
И да , я сначала написал , а потом прочитал твой коммент )
Сообщение отредактировал Nikstoun - Понедельник, 23 Ноября 2015, 21:40 |
|
| |
martuk | Дата: Понедельник, 23 Ноября 2015, 21:53 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| Сейчас напишу рабочий вид
Добавлено (23 ноября 2015, 21:45) ---------------------------------------------
Код var nedelya:array[1..7] of string; var i:integer; var a:string;
nedelya[1] := pon; nedelya[2] := vt; nedelya[3] := sr; nedelya[4] := ch; nedelya[5] := pya; nedelya[6] := subb; nedelya[7] := voskr;
begin
i:=random(1,7); Writeln ('День номер ', i); Write ('Это '); Read (a);
if nedelya[i] = a then begin ShowMessage('Вы правы') end else begin ShowMessage('Вы не правы! это '+nedelya[i]) end
end
Добавлено (23 ноября 2015, 21:47) --------------------------------------------- А может и не рабочий, я без среды. Так пишу) Подправь мелкие ошибки) И запусти. Это куда легче чем париться с ифами
Добавлено (23 ноября 2015, 21:53) --------------------------------------------- Знаешь что, я тут посмотрел, и мой предыдущий код вполне рабочий, только надо ответ "не верно" нужно перенести в else проверки написанного слова.
Сообщение отредактировал martuk - Понедельник, 23 Ноября 2015, 22:17 |
|
| |
Nikstoun | Дата: Понедельник, 23 Ноября 2015, 23:13 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| martuk, вообщем немного поразмыслив , просмотрев то , что ты мне скинул , я пришел к этому !
---------------------
Код var b:integer; a:string; pon:='понедельник'; vt:='вторник'; sr:='среда'; ch:='четверг'; pya:='пятница'; subb:='суббота'; voskr:='воскресенье'; //Выводится случайное число от 1 до 7 , пользователь должен написать //название дня недели соответствующий цифре , все это зациклено begin write ('Вы увидите число , напишите название дня недели '); writeln ('соответствующее этому числу '); b:=random(1,7); Writeln ('День номер ', b); Write ('Это '); Read (a); if b=1 then begin if a=pon then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это понедельник !'); end; if b=2 then begin if a=vt then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это вторник !'); end; if b=3 then begin if a=sr then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это среда !'); end; if b=4 then begin if a=ch then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это четверг !'); end; if b=5 then begin if a=pya then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это пятница !'); end; if b=6 then begin if a=subb then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это суббота !'); end; if b=7 then begin if a=voskr then Writeln ('Вы правы !') Else writeln ('Вы не правы ! Это воскресенье !'); end; end.
---------------------------
Все работает так как нужно , с циклами пока не морочался , а это вполне рабочий вариант на 1 число . Спасибо за помощь ! (Лови +1)
|
|
| |
martuk | Дата: Понедельник, 23 Ноября 2015, 23:59 | Сообщение # 9 |
заслуженный участник
Сейчас нет на сайте
| Модератор, спс) но только не надо было заключать в код подсветку! Nikstoun, зачем цикл то? Используй кейсы на выбор числа. Или тот мой последний вариант.
|
|
| |
Nikstoun | Дата: Вторник, 24 Ноября 2015, 14:58 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
| martuk, слушай , расскажи как можно засунуть целую кучу строк ( в данном случае выбор числа и последующее его написание ) под 1 переменную , или что-то одиночное , что будет содержать эти строки ? Чтобы обойтись без копипаста и засорения пространства )
Мне посоветовали НАПИСАТЬ процедуру или функцию , это как ?
Сообщение отредактировал Nikstoun - Вторник, 24 Ноября 2015, 15:19 |
|
| |
martuk | Дата: Вторник, 24 Ноября 2015, 16:10 | Сообщение # 11 |
заслуженный участник
Сейчас нет на сайте
| Нужно создать функцию, а затем вызывать ее из любого места твоей программы. Найди в гугле.
|
|
| |
Gudleifr | Дата: Четверг, 26 Ноября 2015, 22:15 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Цитата Nikstoun ( ) Помогите... Помочь тут можно только парадоксальным советом: забейте на простые задачки и переходите к сложным. Дело в том, что старые пердуны-задачкотворцы думают, что Вы, как умная Маша, пойдете от простого к сложному: напишете что-то вроде "СОЗДАТЬ-НАБОР-ОБЪЕКТОВ, СЛУЧАЙНО-ВЫБРАТЬ-ОДИН, ВЫВЕСТИ-ОДИН-ИЗ-ЕГО-ПАРАМЕТРОВ, ЗАПРОСИТЬ-ДРУГОЙ-ПАРАМЕТР, ПРОВЕРИТЬ-СООТВЕТСТВИЕ-ПАРАМЕТРОВ", а затем честно будете переводить это с человеческого языка на язык программирования. Но, ведь, для перевода с языка на язык надо знать "некоторые принципы"... Но откуда их взять? Если, Вы, как и почти все "современные программисты" идете по пути "заучивания мелких частностей"? И Ваши способности "программиста" будут ограничены объемами Вашей памяти. Так что, не грузите "мусор", читайте, переписывайте и запоминайте большие работающие программы. Так сейчас делает подавляющее большинство коммерчески успешных программистов. Даже учебники сейчас так пишут. Например, официальные толкования даже по таким замухрышкам, как Perl или Tcl/Tk, весят по 1000 страниц. Вычленить из них "суть" невозможно в принципе...
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
Nikstoun | Дата: Суббота, 28 Ноября 2015, 22:24 | Сообщение # 13 |
почетный гость
Сейчас нет на сайте
| Gudleifr, то есть , не нужно усваивать основы , а сразу нужно "набивать" навык , переписывая готовые более сложные программы ? Странно ...
|
|
| |
Gudleifr | Дата: Суббота, 28 Ноября 2015, 23:13 | Сообщение # 14 |
почти ветеран
Сейчас нет на сайте
| Цитата Nikstoun ( ) сразу нужно "набивать" навык Скорее, усваивать методом погружения. Как обычный иностранный язык.
Цитата Nikstoun ( ) не нужно усваивать основы Нужно. Но где Вы их возьмете? Для примера примерно перечислю концепции, которые у программиста пролетают в голове даже в таком элементарном случае: СОЗДАТЬ-НАБОР-ОБЪЕКТОВ - нужно множество поддерживающее операции ВСТАВИТЬ и ПРИНАДЛЕЖАТЬ. К счастью, оно счетное, т.е. элементы можно пронумеровать, и маленькое, можно хранить элементы подряд. В принципе, если бы оно было чуть посложнее, пришлось бы использовать таблицу расстановки. И еще крупно повезло, что нам достаточно выбрать только один элемент (если бы их было несколько, вместо массива пришлось бы использовать список, поддерживающий операцию УДАЛИТЬ). Кстати, есть языки в которых обычных массивов нет. СЛУЧАЙНО-ВЫБРАТЬ-ОДИН - т.к. у нас простой массив, достаточно одного случайного числа. Если бы надо было бы выбрать несколько, возможно, было бы перетасовать список и брать подряд. А если бы количество элементов в множестве было бы неизвестно заранее, пришлось бы получать случайное число для каждого. И т.д., и т.п... Обратите внимание, что после ВЫБОРА само множество нам более не нужно, достаточно оставить только ПАРАМЕТРЫ выбранного...
В принципе, раньше все эти "основы" давали раньше, чем пускали за компьютеры... А сейчас вероятнее подсмотреть в чужих программах.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Воскресенье, 29 Ноября 2015, 15:55 |
|
| |
Xakep | Дата: Суббота, 28 Ноября 2015, 23:23 | Сообщение # 15 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата martuk ( ) 2. Используй кейсы!) А то слишком много ифоф. Грузить будет процессор) Процессор прям перегреется и сгорит от стольких ифоф :D
Цитата martuk ( ) Сайт почему то убирает пробелы... лучше используйте тогда gist или pastebin и ссылку на код давайте, а то так вообще ужас же, ни отступов ни подсветки.
Сообщение отредактировал Xakep - Суббота, 28 Ноября 2015, 23:25 |
|
| |
|