Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> цикл while 
:(
    Опции темы
koljan
Дата 11.6.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


VIP
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 18.12.2005
Где: г.Архангельск

Репутация: нет
Всего: 1



Код

#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
но что-то не получается         что у меня не так? 


--------------------
PM MAIL ICQ   Вверх
Xenon
Дата 11.6.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Код

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


--------------------
user posted image  
PM MAIL   Вверх
doomik
Дата 11.6.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Одинокий волк
**


Профиль
Группа: Участник
Сообщений: 360
Регистрация: 25.10.2005
Где: #vingrad

Репутация: нет
Всего: 15



Не уверен в ответе, но попробуй добавить

Код

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

   

Это сообщение отредактировал(а) d00mik - 11.6.2006, 23:16


--------------------
"Единственный способ изучать новый язык программирования - писать на нем 
программы." 
- Brian Kernighan

Remember, st1ng3r 
/server irc.ircline.ru /j #vingrad
PM   Вверх
Pete
Дата 11.6.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



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


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Xenon
Дата 11.6.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
doomik
Дата 12.6.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Одинокий волк
**


Профиль
Группа: Участник
Сообщений: 360
Регистрация: 25.10.2005
Где: #vingrad

Репутация: нет
Всего: 15



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.  


--------------------
"Единственный способ изучать новый язык программирования - писать на нем 
программы." 
- Brian Kernighan

Remember, st1ng3r 
/server irc.ircline.ru /j #vingrad
PM   Вверх
Xenon
Дата 12.6.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



господа, из цикла не вываливаются 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 и вообще все, что грозит бесконечностью. =) 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 12.6.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
koljan
Дата 12.6.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


VIP
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 18.12.2005
Где: г.Архангельск

Репутация: нет
Всего: 1



Цитата(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');    

 

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

Это сообщение отредактировал(а) koljan - 12.6.2006, 20:15


--------------------
PM MAIL ICQ   Вверх
Fazil6
Дата 12.6.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

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

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

это от алгоритма зависит и ничего страшного в этом нет 
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 12.6.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Rockie, Я знаю, что есть break, но ведь return тоже можно?  smile  


--------------------
user posted image  
PM MAIL   Вверх
Fazil6
Дата 12.6.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

break и return служат для разных целей и break заменить return не может. Может еще goto вспомнишь?  
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(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 вспомнишь? 

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Fazil6
Дата 12.6.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

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

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;

 
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 12.6.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Вот на тебе пример.
Код

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, то нас выкидывает и из цикла и из функции.   

Это сообщение отредактировал(а) XenonSk - 12.6.2006, 21:56


--------------------
user posted image  
PM MAIL   Вверх
Pete
Дата 12.6.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



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


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

shmctl (shm, IPC_RMID, 0);

? 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Fazil6
Дата 12.6.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

какие тебе еще ссыски нужны? чем тебя пример не устраивает? или это по твоему не код? 
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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 Найти цитируемый пост)
 или это по твоему не код? 

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 12.6.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Я пас smile Это невозможно. 


--------------------
user posted image  
PM MAIL   Вверх
Fazil6
Дата 12.6.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

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

не  нужны не примеры, а ссылки. я сам вижу что такое работает
бред. где я тебе возьму такие ссылки? 
можешь привести аргументы, почему нельзя делать так, как я привел в последнем своем примере? 
PM MAIL   Вверх
Xenon
Дата 12.6.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
Fazil6
Дата 12.6.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



вот специально в проектах порылся. Настоящая программа.
Код

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'");

}

 
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 12.6.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 12.6.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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

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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
koljan
Дата 13.6.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


VIP
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 18.12.2005
Где: г.Архангельск

Репутация: нет
Всего: 1



что то мне кажется тут уже не по теме началось smile  


--------------------
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.