Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2012, 15:31   #1
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
Радость Программа

Здравствуйте, я только начинаю заниматься программированием и у меня возник такой вопрос, работаю на языке С, пытаюсь написать программу которая бы давала пользователю выбрать из 2 вариантов ответа, которые, в свою очередь, делились бы еще на 2 варианта ответа в каждом случае на экран бы выводился некоторый текст. У меня же почему то происходит только выбор из первых двух вариантов, но второй шаг не делается.

PC: вот мой пример я как уже только не пробовал:
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
main()
{        
char b1;
char r1;
char r2;

printf("Привет!"); 
getchar();
printf("1");
printf("X:Да Y:Нет");

b1=getch();


if (b1=='x') printf("2");                  if (b1=='y') printf("0");
if (b1=='x') printf("X:Да Y:Нет");    if (b1=='y') printf("X:Да Y:Нет");

if (b1=='x') r1=getch();              if (b1=='y') r2=getch();
if (r1=='х') printf("3");                  if (r2=='x') printf("1");
if (r1=='у') printf("1");                  if (r2=='y') printf("-1");
getchar();
}
Заранее спасибо!

Последний раз редактировалось ACE Valery; 16.11.2012 в 14:44.
truniger2011 вне форума Ответить с цитированием
Старый 15.11.2012, 15:47   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) r1==getch() - это сравнение, а не присваивание.
2) Плохая идея проверять значение r2, если ей ничего не присваивали (в этом случае в переменной "случайное" значение, которое нечаяно может оказаться каким не надо).
Abstraction вне форума Ответить с цитированием
Старый 15.11.2012, 17:52   #3
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
1) r1==getch() - это сравнение, а не присваивание.
2) Плохая идея проверять значение r2, если ей ничего не присваивали (в этом случае в переменной "случайное" значение, которое нечаяно может оказаться каким не надо).
это ошибка r1=getch(), но все равно не помагает

Цитата:
Сообщение от truniger2011 Посмотреть сообщение
это ошибка r1=getch(), но все равно не помагает
мне просто нужно чтобы присваивание переменной r1 и все действия с ней производились только в том случае если b1=='x'

Последний раз редактировалось Stilet; 16.11.2012 в 15:51.
truniger2011 вне форума Ответить с цитированием
Старый 15.11.2012, 18:23   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Есть операторные скобки:
Код:
if(b=='x'){
  printf("2");
  printf("X:Да Y:Нет");

  r1=getch();
  if (r1=='х') printf("3");
  else if (r1=='у') printf("1"); //else, строго говоря, излишне, но так чуть яснее мысль
}
Abstraction вне форума Ответить с цитированием
Старый 15.11.2012, 18:26   #5
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Есть операторные скобки:
Код:
if(b=='x'){
  printf("2");
  printf("X:Да Y:Нет");

  r1=getch();
  if (r1=='х') printf("3");
  else if (r1=='у') printf("1"); //else, строго говоря, излишне, но так чуть яснее мысль
}
Большое спасибо!

У меня еще один вопрос, есть ли такая функция в языке С, которая бы при определенном значении переменной возвращалась назад и начинала выполнение с определенной строчки программы заново? Как можно этого достичь?

Последний раз редактировалось Stilet; 16.11.2012 в 15:50.
truniger2011 вне форума Ответить с цитированием
Старый 15.11.2012, 22:23   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
У меня еще один вопрос, есть ли такая функция в языке С, которая бы при определенном значении переменной возвращалась назад и начинала выполнение с определенной строчки программы заново? Как можно этого достичь?
Есть два ответа, не очень понимаю, о чём именно Вы спрашиваете, поэтому приведу оба.
1) В C (как и практически в любом императивном языке) есть операторы цикла. Для C их три -
Код:
for(A; B; C) D;
Это означает "выполнить A, затем раз за разом проверять B и, если оно истинно, делать D, C, снова проверять B и т.д.". Для примера, вот код, который выполнит Something() ровно 20 раз:
Код:
int i;
//...
for(i=0; i<20; ++i){
  Something();//Нежелательно, чтобы код, подставленный вместо Something, менял i
}
Затем,
Код:
while(A) B;
Это означает - раз за разом проверять A и, если оно верно, выполнять B. И, наконец,
Код:
do A while(B);
Это означает делать A, затем проверять B и так раз за разом. Обратите внимание, что do...while выполнит внутреннее выражение (называемое также телом цикла) по крайней мере один раз, даже если условие ложно с самого начала; простой while может не отработать ни разу.
В теле любого из трёх циклов имеют силу два оператора - break (выход) и continue (продолжение). К примеру, вот вариант "бесконечного цикла", который лежит в основе существования любого окна (названия функций неточные):
Код:
while(true){
  message = GetNextMessage(); //Получаем следующее сообщение (например, о нажатии на кнопку)
  if(IsMessageToQuit(message)) break; //Если сообщение - "на выход", окно умирает

  ProcessMessage(message); //Обрабатываем сообщение
}
А вот цикл "с пропусками":
Код:
for(n=1; n<100; ++n){
  if(!isPrime(n)) continue; //Если n - не простое, то переходим к следующему
  //...
}
Обратите внимание, что в цикле for continue "перемещает" нас к третьему предложению цикла (++n в данному случае), и только потом будет проверено условие.

2) Также в C есть "прокалывающие" программу оператор goto и функции setjmp() и longjmp(). setjmp() ставит "якорь" в произвольной точке программы, а longjmp() возвращает к этому "якорю". goto просто осуществляет переход на метку, но только в пределах одной функции. Ни первое, ни второе - по крайней мере, на начальном этапе знакомства с языком, - использовать лично я настоятельно не рекомендую.
Abstraction вне форума Ответить с цитированием
Старый 16.11.2012, 11:52   #7
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
По умолчанию

Цитата:
2) Также в C есть "прокалывающие" программу оператор goto и функции setjmp() и longjmp(). setjmp() ставит "якорь" в произвольной точке программы, а longjmp() возвращает к этому "якорю". goto просто осуществляет переход на метку, но только в пределах одной функции. Ни первое, ни второе - по крайней мере, на начальном этапе знакомства с языком, - использовать лично я настоятельно не рекомендую.
Благодарю вас, думаю что функции setjmp() и longjmp() это то что мне нужно. Я всё же сделаю копию программы и попробую поэкспериментировать с ними, еще раз большое вам спасибо за ответы.

Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
main()
{
char w1;

setjmp();
printf("1? X:Da Y:Net");
w1=getch();
if (w1=='x') printf ("1!");
if (w1=='y') { 
longjmp();
}
getchar();
}
Вот попытался написать такую программу с этими функциями, выдает следующую ошибку 8 D:\Sistem\IT\Безымянный1.cpp `setjmp' undeclared (first use this function).

[QUOTE=truniger2011;1132440]
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
main()
{
char w1;

setjmp();
printf("1? X:Da Y:Net");
w1=getch();
if (w1=='x') printf ("1!");
if (w1=='y') { 
longjmp();
}
getchar();
}
Вот попытался написать такую программу с этими функциями, выдает следующую ошибку 8 D:\Sistem\IT\Безымянный1.c`setjmp' undeclared (first use this function). PC:Я конечно понимаю что вы не рекомендовали использовать данные функции, но я не вижу тут других вариантов

Последний раз редактировалось Stilet; 16.11.2012 в 15:51.
truniger2011 вне форума Ответить с цитированием
Старый 16.11.2012, 14:42   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Полезный ресурс. По C++, правда; вот C-описание в Вики. Обраите внимание как на необходимость #include соответствующего заголовка, так и на аргументы функций.

Но ещё раз: это не тот фокус, который осмысленно применять в простых программах. Настоятельно советую приучиться делать так:
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

int main(void)
{
  char w1;
  while(true){ //"Вечный" цикл
    printf("1? X:Da Y:Net");
    w1=getch();
    if (w1=='x') printf ("1!");
    if (w1=='y') break; //Выходим из цикла
  }
  getchar();
}
Abstraction вне форума Ответить с цитированием
Старый 16.11.2012, 19:55   #9
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Полезный ресурс. По C++, правда; вот C-описание в Вики. Обраите внимание как на необходимость #include соответствующего заголовка, так и на аргументы функций.

Но ещё раз: это не тот фокус, который осмысленно применять в простых программах. Настоятельно советую приучиться делать так:
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

int main(void)
{
  char w1;
  while(true){ //"Вечный" цикл
    printf("1? X:Da Y:Net");
    w1=getch();
    if (w1=='x') printf ("1!");
    if (w1=='y') break; //Выходим из цикла
  }
  getchar();
}
Сейчас попробую
truniger2011 вне форума Ответить с цитированием
Старый 17.11.2012, 14:16   #10
truniger2011
Пользователь
 
Регистрация: 15.11.2012
Сообщений: 34
По умолчанию

Я снова обращаюсь к вам, я вам наверное уже изрядно надоел но все же Я разобрал ваш пример:
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

int main(void)
{
  char w1;
  while(true){ //"Вечный" цикл
    printf("1? X:Da Y:Net");
    w1=getch();
    if (w1=='x') printf ("1!");
    if (w1=='y') break; //Выходим из цикла
  }
  getchar();
}
Но это очень простой пример, и у меня не получается перенести его на более сложный алгоритм:
Код:
#include <stdio.h>
#include <conio.h>
main()
{
char p1;
char p2;
char p3;
char m1;
char m2;
char pm1;
char pm2;
char pm3;
char pm4;
printf("Hai!");
getchar();
printf(" 1 Win? X:Da Y:Net");
p1=getch();
if (p1=='x') {
printf(" -1 Win? X:Da Y:Net");
m1=getch();
if (m1=='x'); //Если m1=='x', возвращаемся к строчке 16
else if (m1=='y') {
printf(" -2 Win? X:Da Y:Net");
m2=getch();
if (m2=='x'); //Если m2=='x', вовращаемся к строчке 16
else if (m2=='y') printf (" ...");
}
}


else if (p1=='y') {
printf(" 2 Win? X:Da Y:Net");
p2=getch();

if (p2=='x') {
printf(" -1 Win? X:Da Y:Net");
pm1=getch();
if (pm1=='x'); //Если pm1=='x', возвращаемся к строчке 16
else if (pm1=='y') {
printf(" -2 Win? X:Da Y:Net");
pm2=getch();
if (pm2=='x'); //Если pm2=='x', вовращаемся к строчке 16
else if (pm2=='y') printf (" ...");
}
}

else if (p2=='y') {
printf(" 3 Win? X:Da Y:Net");
p3=getch();

if (p3=='x') {
printf(" -1 Win? X:Da Y:Net");
pm3=getch();
if (pm3=='x'); //Если pm3=='x', возвращаемся к строчке 16
else if (pm3=='y') {
printf(" -2 Win? X:Da Y:Net");
pm4=getch();
if (pm4=='x'); //Если pm4=='x', вовращаемся к строчке 16
else if (pm4=='y') printf (" ...");
}
}

else if (p3=='y') printf (" ...");
}
}
getchar();
}
В тех случаях где я сделал пометки мне необходимо чтобы выполнение начиналось заново с 16 строки программы, в данном случае это строка:
Код:
printf(" 1 Win? X:Da Y:Net");
truniger2011 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа как программа. вопрос leonidsm Общие вопросы C/C++ 5 02.10.2012 21:30
Программа с применением записей и программа с применение множеств smert99 Помощь студентам 0 16.06.2011 23:14
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
Программа создания файла, программа обработки файла [PASCAL] Виколяшка Помощь студентам 1 22.09.2009 22:56