Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > цикл while


Автор: koljan 11.6.2006, 22:23
Код

#include <iostream.h>
#include <conio.h>
int fact(n)
{
  int q=1;
  int i;
   if(n==1) return n;
     else
    {
     for(i=2;i<=n;i++)
      {
       q=q*i;
      }
    }
    return q;
}
int main()
{
char letter;
int done=0;
int n;
while (done==0)
 {
   cout<<"Vvedite znachenie\n";
   cin>>n;
   cout<<"\n";
    cout<< fact(n)<<"\n";
   cout<<"exit(y/n)"<<"\n";
   cin>>letter;

   if ((letter == 'Y') || (letter == 'y'))
         done = 1;
         else
         done= 0;

   cout<<"\n";
   getch();
   return 0;
 }
}

у меня есть такой код хотел сделать чтобы программа завершалась при вводе n или N
но что-то не получается         что у меня не так? 

Автор: Xenon 11.6.2006, 22:32
Код

char letter;    
int n;    
do
 {    
   cout << "Vvedite znachenie\n";    
   cin >> n;    
   cou t<< "Exit(y/n)";    
   cin >> letter;    
}while (letter!='N' && letter!='n');
 

Автор: doomik 11.6.2006, 23:14
Не уверен в ответе, но попробуй добавить

Код

.
.
.
   if ((letter == 'Y') || (letter == 'y'))    
         done = 1;    
         else    
         done= 0;    
   cout<<"\n";
 if ( ( letter == 'N' ) || ( letter == 'n' ) )    //это добавить
   getch();    // убрать это и запустить с Alt + F5
   return 0;    
 }    
}

   

Автор: Pete 11.6.2006, 23:33
Проверь, что лежит в letter (распечатыванием ascii-кода, например): очень вероятно, что там '\n'. В сях часто такая проблема, про плюс точно не знаю. Если дело в этом, то положи сразу после cin >> n вот такую строку: while (getchar() != '\n'). 

Автор: Xenon 11.6.2006, 23:49
Зачем вы так жизнь усложняете? Просто проверять условие letter!='N' && letter!='n' и все. Засовывать переменную done ... Нафиг? smile И здесь бы я cin заменил бы на _getche() из религиозных соображений, так как пользователя просят нажать y/n, про ENTER ничего не говорится smile Нужно с самых пеленок уметь рассчитывать на тупого пользователя. 

Автор: doomik 12.6.2006, 08:24
XenonSk, 
Цитата
Просто проверять условие letter!='N' && letter!='n' и все

А почему на && ?  smile 
если
Цитата
...программа завершалась при вводе n или N



Добавлю к предыдушему моему посту, надо ещё именить while напривер на while ( done != 0 )    
в общеи вот код:

Код

#include <iostream.h>
int main()    
{    
char letter;    
int done;    // Здесь тоже есть изменения.
int n;    
while (done!=0)    // done никогда не будет равен нулью, и он будет выполнятся бесконечно
 {    
   cout<<"Vvedite znachenie\n";    
   cin>>n;    
   cout<<"\n";    
    cout<< "fact(n)"<<"\n";    
   cout<<"exit(y/n)"<<"\n";    
   cin>>letter;

  if ((letter == 'Y') || (letter == 'y'))     
         done = 1;     
         else          
   cout<<"\n";    
 if ( ( letter == 'n' ) || ( letter == 'N' ) )   // а вот тут он завершится если letter будет иметь значения n 
                                                               // или N.
   return 0;     
 }     
}

Должно работать, сам проверял  smile.  

Автор: Xenon 12.6.2006, 09:59
d00mik  Блин .... Цикл выполняется, пока условие верно. Допустим пользователь нажал N. Проверяем условие - letter неравно N  или letter неравно n. letter неравно N - false, letter неравно n - true. false || true == true, поэтому цикл будет дальше крутиться. 

Автор: Rockie 12.6.2006, 18:51
господа, из цикла не вываливаются return -ом =)
Код
#include <conio.h>
#include <iostream.h>
int fact(int);

int fact(int n)  // не забываем тип аргумента
{ int q=1;
  int i;
   if(n==1) return n;
     else
    {
     for(i=2;i<=n;i++)
      {
       q=q*i;
      }
    }
    return q;
}

int main()
{ char letter = ' ';
  int n = 0;
  while (1)      
 { cout<<"Vvedite znachenie\n";
   cin>>n;
   cout<<"\n";
   cout<< fact(n)<<"\n";

   cout<<"exit(y/n)"<<"\n";
   cin>>letter;

   if ( ( letter == 'Y') || (letter == 'y') ) break;
   if ( ( letter == 'n') || (letter == 'N') ) continue;
 }
   cout<<"\nHappy End =)";
   cout<<"\n";
   getch();
   return 0;    
 }

а вообще такие конструкции 
Код
  while (1)   
 лучше вообще не использовать. imho и вообще все, что грозит бесконечностью. =) 

Автор: Xenon 12.6.2006, 20:09
Rockie, Почему? Можно return заюзать, только тебя и из функции выкинет smile 

Автор: koljan 12.6.2006, 20:12
Цитата(XenonSk @  11.6.2006,  22:32 Найти цитируемый пост)
код C++    
Код

char letter;     
int n;     
do    
 {     
   cout << "Vvedite znachenie\n";     
   cin >> n;     
   cou t<< "Exit(y/n)";     
   cin >> letter;     
}while (letter!='N' && letter!='n');    

 

спасибо всё хорошо работает  

Автор: Fazil6 12.6.2006, 20:22
Цитата

господа, из цикла не вываливаются return -ом =)

почему это? очень даже.
Цитата

а вообще такие конструкции 
код C++    
1:    
  while (1)    
 лучше вообще не использовать. imho и вообще все, что грозит бесконечностью. =) 

это от алгоритма зависит и ничего страшного в этом нет 

Автор: Rockie 12.6.2006, 20:28
Цитата(XenonSk @  12.6.2006,  20:09 Найти цитируемый пост)
Rockie, Почему? Можно return заюзать, только тебя и из функции выкинет  

можно еще "format c:" заюзать =)
http://www.cheeter.lv/uroki/cc/book014.htm 

Автор: Xenon 12.6.2006, 20:32
Rockie, Я знаю, что есть break, но ведь return тоже можно?  smile  

Автор: Fazil6 12.6.2006, 20:37
Цитата

можно еще "format c:" заюзать =)
break, continue 

break и return служат для разных целей и break заменить return не может. Может еще goto вспомнишь?  

Автор: Rockie 12.6.2006, 20:47
Цитата(Fazil6 @  12.6.2006,  20:22 Найти цитируемый пост)
почему это? очень даже.


ссылки пожалуйста, где это очень даже используется.

Цитата(Fazil6 @  12.6.2006,  20:22 Найти цитируемый пост)
это от алгоритма зависит и ничего страшного в этом нет 

это мое личное мнение - я считаю циклы такого рода злом. если разбираться в своем деле то вообще ничего страшного нет.

Цитата(Fazil6 @  12.6.2006,  20:37 Найти цитируемый пост)
break и return служат для разных целей и break заменить return не может. 
 и я о чем

Цитата(Fazil6 @  12.6.2006,  20:37 Найти цитируемый пост)
 Может еще goto вспомнишь? 

а это к чему?..
 

Автор: Fazil6 12.6.2006, 20:59
Цитата

ссылки пожалуйста, где это очень даже используется.

пожалуйста, утрированный пример
Код

char x = 0;
std::cout << "Continue? y/n :";
while(1)
    {
        
        std::cin >> x;
        if(x == 'n') return 0;  // break здесь не катит никак
        if(x == 'y') break;
    }
// bla-bla что-то делаем
return 0;

 

Автор: Rockie 12.6.2006, 21:50
Цитата(Fazil6 @  12.6.2006,  20:59 Найти цитируемый пост)
пожалуйста, утрированный пример

и все же ссылки - на код, который использует подобные конструкции, то есть выходит из цикла оператором return.
 

Автор: Xenon 12.6.2006, 21:55
Вот на тебе пример.
Код

int main ()
{
    int x=5;
    while (x>0)
    {
        x--;
        if (x==3)
        {
            return 0;
        }
    }
    cout << "Done";
    _getch();
    return 0;
}

И
Код

int main ()
{
    int x=5;
    while (x>0)
    {
        x--;
        if (x==3)
        {
            break;
        }
    }
    cout << "Done";
    _getch();
    return 0;
}

Сравни пример работы двух программ.
Если пишим return, то нас выкидывает и из цикла и из функции.   

Автор: Pete 12.6.2006, 21:56
Цитата(Fazil6 @  12.6.2006,  21:59 Найти цитируемый пост)
Код
...
if(x == 'n') return 0;  // break здесь не катит никак
...


Смотря, что идет после цикла. А вдруг там стоит
Код

shmctl (shm, IPC_RMID, 0);

? 

Автор: Fazil6 12.6.2006, 22:03
Цитата

и все же ссылки - на код, который использует подобные конструкции, то есть выходит из цикла оператором return.

какие тебе еще ссыски нужны? чем тебя пример не устраивает? или это по твоему не код? 

Автор: Rockie 12.6.2006, 22:05
XenonSk, мне  нужны не примеры, а ссылки. я сам вижу что такое работает:
Код
#include<iostream.h>
#include<conio.h>

int f(){
  char x = 0;
  while(1)
  {  cout << "Continue? y/n :";
     cin >> x;
     if(x == 'n') { cout<<"was n "; return 1; } 
     if(x == 'y') { cout<<"was y "; return 2; }
  }
}

int main()
{ clrscr();
  cout<<f();

  getch();
  return 0;
}

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

Добавлено @ 22:05 
Цитата(Fazil6 @  12.6.2006,  22:03 Найти цитируемый пост)
 или это по твоему не код? 

это по-моему не ссылка 

Автор: Xenon 12.6.2006, 22:12
Я пас smile Это невозможно. 

Автор: Fazil6 12.6.2006, 22:41
Цитата

вот мне и интересно, есть ли реальные листинги настоящих программ, которые такой прием используют.

а то, что ты написал не настоящее? что значит настоящие программы?
то, что я пишу по твоему не настоящие? 
Цитата

не  нужны не примеры, а ссылки. я сам вижу что такое работает
бред. где я тебе возьму такие ссылки? 
можешь привести аргументы, почему нельзя делать так, как я привел в последнем своем примере? 

Автор: Xenon 12.6.2006, 22:50
Rockie, Ты видишь, что это работает, но по-мойму не понимаешь в чем разница работы  smile  

Автор: Fazil6 12.6.2006, 22:51
вот специально в проектах порылся. Настоящая программа.
Код

ExecNode_t ScriptExe::GetExeStatement(const std::string& name)
{
    ScriptList::iterator i = s_list.begin();
    while(i != s_list.end())
    {
        if((*i)->Name() == name) return *i;
        ++i;
    }

    throw std::runtime_error("ScriptExe::GetExeStatement запрошенная инициализация отсутствует '" + name + "'. Переменная не инициализирована операцией 'set'");

}

 

Автор: Rockie 12.6.2006, 22:55
Цитата(Fazil6 @  12.6.2006,  22:41 Найти цитируемый пост)
можешь привести аргументы, почему нельзя делать так, как я привел в последнем своем примере? 

нет. мне это и не нужно. я же тебе не говорю, что у тебя руки кривые просто на мой взгляд программа получается малопонятной. мне интересно кто так ЕЩЕ делает. 

Автор: Xenon 12.6.2006, 23:01
Rockie, Млин, разве, в конце концов, не бывает случаев, когда в цикле происходят некоторые манипуляции и в связи с каким-то условием нужно либо прервать цикл и перейти к выполнению последующих операция, либо прервать цикл и выйти из функции?
Или у тебя в цикле возникла ошибка, тебе же нужно не просто выйти из цикла, а еще и функцию завершить и передать в окружение сообщение об ошибке. КАкие еще примеры? 

Автор: Rockie 12.6.2006, 23:13
Цитата(XenonSk @  12.6.2006,  23:01 Найти цитируемый пост)
Млин, разве, в конце концов, не бывает случаев, когда в цикле происходят некоторые манипуляции и в связи с каким-то условием нужно либо прервать цикл и перейти к выполнению последующих операция, либо прервать цикл и выйти из функции?

да. пожалуй бывают, просто я с такими не встречался и для меня такой прием был неизвестен.

Добавлено @ 23:20 
то есть идея то понятна, а я втупил именно в сам вызов return из while. то есть вроде как while возвращает значение. не знал что так можно. 

Автор: koljan 13.6.2006, 23:41
что то мне кажется тут уже не по теме началось smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)