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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2011, 22:23   #1
BrutalSnowflake
Пользователь
 
Аватар для BrutalSnowflake
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию Почему прога зацикливаеться?

Доброго времени суток, господа! Непойму почему прога зацикливается при вводе чисел от 1-4, ничего не должно делать, а при написании левого значения должно возвращать и просить ввести опять, а вместо этого оно зацикливаеться т.е. момент повторного ввода числа cin>>oper оно тупо пропускает уважаемые знатоки, подскажите, спс заранее! ЗЫ: использую Borland C++ 5.02
Код:
#include <iostream.h>
#include <conio.h>
	void main()
   	{int er, oper;
      do {
      	cout<<"Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
			cin>>oper;
         switch (oper){
         	case 1:
            	break;
            case 2:
		break;
            case 3:
            	break;
            case 4:
            	break;
            default: cout<<"Oshibka vvoda! Vvedite chislo ot 1 do 4";
            er=1;
            	break;
            }
         }
         while (er==1);
         getch();
      }
BrutalSnowflake вне форума Ответить с цитированием
Старый 24.01.2011, 22:26   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <iostream>
#include <conio.h>

using namespace std;

	int main()
   	{int er, oper;
   	bool flag = true;
      do {
      	cout<<"Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
			cin>>oper;
         switch (oper){
         	case 1: {
                //Твой код
                flag = false;
            } break;
            case 2: {
                //Твой код
                flag = false;
            } break;
            case 3: {
                //Твой код
                flag = false;
            } break;
            case 4:{
                //Твой код
                flag = false;
            } break;

            default: cout<<"Oshibka vvoda! Vvedite chislo ot 1 do 4";
            }
         }
         while (flag);
         getch();

         return 0;
      }

Последний раз редактировалось profi; 24.01.2011 в 22:59.
profi вне форума Ответить с цитированием
Старый 24.01.2011, 22:48   #3
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

У вас в коде ещё несколько ошибок:
1. void main() — это неправильно, должно быть int main.
2. Должно быть не #include <iostream.h>, а #include <iostream.>
3. cin и cout лежат в пространстве имён std, используйте std::cin и т.п..
4. (не ошибка) getch() это ерунда из C, а вы пишите на C++, используйте cin.get().
5. (не ошибка) Слишком коряво записан switch, можно короче, см. мой код.
6. (не ошибка) Кривое форматирование.
7. (не ошибка) err можно сделать bool.
8. (не ошибка) Плохие названия объектов. Из названия объекта сразу должно быть понятно, что это такое.
9. (не ошибка) Вообще, изначально err можно сделать 1 и в случае ошибки ввода не менять его.

Ну а зацикливается банально потому, что нигде не присваивается 0.

Вот, с учётом всех замечаний:
Код:
#include <iostream>

int main()
{
    int operation_type;
    bool input_is_wrong;
    input_is_wrong = true;
    do {
        std::cout << "Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
        std::cin >> operation_type;
        switch(operation_type) {
        case 1:
        case 2:
        case 3:
        case 4:
            input_is_wrong = false;
            break;
        default:
             std::cout << "Oshibka vvoda! Vvedite chislo ot 1 do 4" << std::endl;
             break;
        }
    } while(input_is_wrong == true);
    std::cin.get();
}
И ещё одно замечание. К чему тут вообще switch? Логичней сделать на if.

Код:
#include <iostream>

int main()
{
    int operation_type;
    bool input_is_wrong;
    input_is_wrong = true;
    do {
        std::cout << "Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
        std::cin >> operation_type;
        if ( operation_type >= 1 && operation_type <= 4 ) {
            input_is_wrong = false;
        } else {
             std::cout << "Oshibka vvoda! Vvedite chislo ot 1 do 4" << std::endl;
        }
    } while(input_is_wrong == true);
    std::cin.get();
}
Но раз уж мы делаем на if, то просто можно break-нуться сразу из цикла, и не надо никаких input_is_wrong!
Код:
#include <iostream>

int main()
{
    int operation_type;
    while(true) {
        std::cout << "Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
        std::cin >> operation_type;
        if ( operation_type >= 1 && operation_type <= 4 ) {
            break;
        } else {
             std::cout << "Oshibka vvoda! Vvedite chislo ot 1 do 4" << std::endl;
        }
    }
    std::cin.get();
}
А ещё лучше сделать так:
Код:
#include <iostream>

int main()
{
    int operation_type;
    std::cout << "Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
    std::cin >> operation_type;
    while ( operation_type >= 1 && operation_type <= 4 ) {
        std::cout << "Oshibka vvoda! Vvedite chislo ot 1 do 4" << std::endl;
        std::cin >> operation_type;
    }
    std::cin.get();
}
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Stilet; 27.01.2011 в 14:45.
Obey-Kun вне форума Ответить с цитированием
Старый 24.01.2011, 23:02   #4
BrutalSnowflake
Пользователь
 
Аватар для BrutalSnowflake
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

profi , Obey-Kun, спс!
Obey-Kun, с 5 пункта по 9, это просто потому что этот код я выдрал из программы, и постирал лишнеее чтоб не смущало, bool тож делал, просто при перебирании вариантов в чём может быть проблема заменил на инт.
А чем плох void?
И почему именно при повторном использовании функции появляються такие заморочки, т.е. функция cin пропускается?

А что вообще значит operation_type? я только изучать начинаю с++

Кстати, борланд чёт не хочет понимать что это за пространство имён std O_O чё делать? B std::cin в том числе О_о

Последний раз редактировалось Stilet; 27.01.2011 в 14:47.
BrutalSnowflake вне форума Ответить с цитированием
Старый 24.01.2011, 23:11   #5
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

просто товарищ Obey-Kun видимо знает только один компилятор по коду видно, что это борланд с++
pacniwassano вне форума Ответить с цитированием
Старый 24.01.2011, 23:12   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
А что вообще значит operation_type? я только изучать начинаю с++
Ничего не значит, просто назвал так.

Цитата:
Кстати, борланд чёт не хочет понимать что это за пространство имён std O_O чё делать? B std::cin в том числе О_о
Старая версия что ли? Поставь Code::Blocks.

Цитата:
А чем плох void?
По стандарту так нельзя делать, int это всегда main. Что в C, что в C++.
http://www2.research.att.com/~bs/bs_faq2.html#void-main

Цитата:
И почему именно при повторном использовании функции появляються такие заморочки, т.е. функция cin пропускается?
Не понял вопроса.

Цитата:
Сообщение от pacniwassano Посмотреть сообщение
просто товарищ Obey-Kun видимо знает только один компилятор по коду видно, что это борланд с++
Ну почему, я использую gcc и icc. С бородатого года борланд с++ в реале имел дело 1 раз, владельцу сразу сказал его снести и поставить что-нибудь нормальное. Ещё работал с компилятором из VS... Нормальный компилятор, жаль только C и C++ целиком не поддерживает. Но получше, чем всякое старьё.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Stilet; 27.01.2011 в 14:47.
Obey-Kun вне форума Ответить с цитированием
Старый 24.01.2011, 23:18   #7
BrutalSnowflake
Пользователь
 
Аватар для BrutalSnowflake
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

Цитата:
Старая версия что ли? Поставь Code::Blocks.
В первом сообщении написал ещё Borland C++ 5.02
Цитата:
Старая версия что ли? Поставь Code::Blocks.
Что это?
Цитата:
Цитата:
И почему именно при повторном использовании функции появляються такие заморочки, т.е. функция cin пропускается?
Не понял вопроса.
Всмысле первый раз вводиться всё нормально. А в случаи если вводишь левое значение, то оно вместо того чтобы опять выбить форму ввода числа тупо зацикливаеться

Проблема цикла не пропадает даже если через VS 6.0 компилить

Последний раз редактировалось Stilet; 27.01.2011 в 14:48.
BrutalSnowflake вне форума Ответить с цитированием
Старый 24.01.2011, 23:54   #8
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Покажи код.

Code::Blocks — http://www.codeblocks.org/ — хорошая бесплатная IDE.

Цитата:
Всмысле первый раз вводиться всё нормально. А в случаи если вводишь левое значение, то оно вместо того чтобы опять выбить форму ввода числа тупо зацикливаеться
Потому что с твоим компилятором изначальное значение err получалось равно 0 (верней, не совсем так, но не хочется лезть в дебри). Попробуй написать err=1 после объявления.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 24.01.2011 в 23:58.
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 00:01   #9
BrutalSnowflake
Пользователь
 
Аватар для BrutalSnowflake
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

Цитата:
Code::Blocks — http://www.codeblocks.org/ — хорошая бесплатная IDE.
ААа, попробую.

Знаю, что код убого написан, но эт первые программы, которые пытаюсь делать, и делаю как могу. На коде значками коммента отмечу где, тот цикл.
Код:
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
................................................................
	void main()

    {float pervoe, vtoroe, result,ostatok;
    int oper, N, i=0, j=0, znak=0;
    long int celoe, res;
    char chislo[30]="",b[100000];
    bool er=false;

    cout<<"ROME Calculator v1.00 \n ILCHENKO DMITRIY \n\n Spisok rimskih cifr:\n I = 1 \n V = 5 \n X = 10 \n L = 50 \n C = 100 \n D = 500 \n M = 1000 \n\n Menshie cifri dolgni sledovat za bolshimi krome sluchaev s \n IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900 \n\n Cifri ne dolzni povtorjatsa bolshe 3 raz podrjad \n    XIIII - neverno \n    XIX - verno \n\n";
    do{
   	do
      {
      	char chislo[30]="";
      	cout<<"Vvedite chislo:\n\n";
			cin>>chislo;
         cout<<"\n";
         if (Error(chislo)==true) cout<<"Oshibka vvoda!\n\n";
      		else {cout<<chislo<<" = "<<rimTranslate(chislo)<<"\n\n";
            		pervoe=rimTranslate(chislo);
            		}
         er=Error(chislo);
      }
      while (er==true);

      do
      {
      	char chislo_dva[30]="";
      	cout<<"Vvedite vtoroe chislo:\n\n";
			cin>>chislo_dva;
         cout<<"\n";
      	if (Error(chislo_dva)==true) cout<<"Oshibka vvoda!\n\n";
      		else {cout<<chislo_dva<<" = "<<rimTranslate(chislo_dva)<<"\n\n";
                  vtoroe=rimTranslate(chislo_dva);
            		}
         er=Error(chislo_dva);
      }
      while (er==true);
      do //..........................................................
      	{
      	cout<<"Viberite operciu: \n 1. Slogenie \n 2. Vichitanie \n 3. Umnogenie \n 4. Delenie \n\n";
			cin>>oper;
         switch (oper){
         	case 1: result=pervoe+vtoroe;
            	break;
            case 2: result=abs(pervoe-vtoroe);
            	if ((pervoe-vtoroe)<0) znak=1;
            	break;
            case 3: result=pervoe*vtoroe;
            	break;
            case 4: result=pervoe/vtoroe;
            	break;
            default: cout<<"Oshibka vvoda! Vvedite chislo ot 1 do 4";
            er=true;
            	break;
            }
         }
      while (er==true);//..........................................................
      celoe=result;
      ostatok=result-celoe;
      if (oper==2 && znak==1)
      	{
      	cout<<"Resultat = -"<<result<<"\n";
     	 	cout<<"Celaja chast = "<<celoe<<" = -";
         }
      else
      	{
         cout<<"Resultat = "<<result<<"\n";
         cout<<"Celaja chast = "<<celoe<<" = ";
         }
   while (celoe>=1000)
   	{celoe-=1000;
      b[i]='M';
      i++;
      }
   while (celoe>=900)
      {celoe-=900;
      b[i]='C';
      i++;
      b[i]='M';
      i++;
      }
   while (celoe>=500)
   	{celoe-=500;
      b[i]='D';
   	i++;
      }
   while (celoe>=400)
   	{celoe-=400;
      b[i]='C';
      i++;
      b[i]='D';
      i++;
   	}
   while (celoe>=100)
   	{celoe-=100;
      b[i]='C';
      i++;
      }
   while (celoe>=90)
   	{celoe-=90;
      b[i]='X';
      i++;
      b[i]='C';
      i++;
      }
   while (celoe>=50)
   	{celoe-=50;
      b[i]='L';
      i++;
      }
   while (celoe>=40)
   	{celoe-=40;
      b[i]='X';
      i++;
      b[i]='L';
      i++;
      }
   while (celoe>=10)
   	{celoe-=10;
      b[i]='X';
      i++;
      }
   while (celoe>=5)
   	{celoe-=5;
      b[i]='V';
      i++;
      }
   while (celoe==4)
   	{celoe-=4;
      b[i]='I';
      i++;
      b[i]='V';
      i++;
      }
   while (celoe>=1)
   	{celoe-=1;
      b[i]='I';
      i++;
      }

      if (result>=1){
      for (j=0;j<i;j++)
      	cout<<b[j];}
         else cout<<"0";
      cout<<"\nDrobnaja chast = "<<ostatok<<"\n\n Hotite eshe proizvesti vichislenija:\n\n 1 - da\n 2 - net \n";
   	cin>>N;
      cout<<"__________________________________________________________________________\n\n";
   }
   while (N==1);
   }
BrutalSnowflake вне форума Ответить с цитированием
Старый 25.01.2011, 00:01   #10
BrutalSnowflake
Пользователь
 
Аватар для BrutalSnowflake
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

Всё не влезло, там где в самом начале куча точек там вот это:
Код:
   int Error(char *a)
   {  bool error=false;
   	int strl=strlen(a), i, j;
      for (i=0;i<strl;i++)

      {	switch (a[i]){
      		case 'M':case 'D': case 'C': case 'L': case 'X':case 'V': case 'I': case ' ': break;
            default: error=true;
            break;}

      	if (a[i]==a[i+1] && a[i]==a[i+2] && a[i]==a[i+3]) error=true;
         for(int j=i+1;j<strl;j++)
         	{if (a[i]!=a[i+1] && a[i]==a[j]) error=true;

             if (a[i]=='I')
             	switch (a[j])
               	{case 'V':case 'X': if (a[j]!=a[i+1]) error=true;
                  	break;
                  case 'L':case 'C':case 'D':case 'M': error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             if (a[i]=='V')
             	switch (a[j])
               	{
                  case 'V':case 'X':case 'L':case 'C':case 'D':case 'M': error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             if (a[i]=='X')
             	switch (a[j])
               	{case 'L':case 'C': if (a[j]!=a[i+1]) error=true;
                  	break;
                  case 'D':case 'M': error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             if (a[i]=='L')
             	switch (a[j])
               	{
                  case 'L':case 'C':case 'D':case 'M': error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             if (a[i]=='C')
             	switch (a[j])
               	{case 'D':case 'M': if (a[j]!=a[i+1]) error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             if (a[i]=='D')
             	switch (a[j])
                  {
                  case 'D':case 'M': error=true;
                  	break;
                  default: error=false;
                  	break;
                  }
             }
      }
	  return error;
   }

   int rimTranslate(char *a)
	{
		long int summ=0;
		int strl=strlen(a);
		for (int i=0;i<strl;i++)
      {	switch(a[i]){
 		     	case 'M':if (a[i-1]!='C') summ+=1000;
   	      	break;
      	   case 'D':if (a[i-1]!='C') summ+=500;
            	break;
				case 'C':if (a[i-1]!='X')
            				if (a[i+1]=='D') summ+=400;
        	 						else {if (a[i+1]=='M') summ+=900;
         	         				else summ+=100;
            	            		}
               break;
            case 'L':if (a[i-1]!='X') summ+=50;
					break;
				case 'X':if (a[i-1]!='I')
            				if (a[i+1]=='L') summ+=40;
     		    					else {if (a[i+1]=='C') summ+=90;
         	         				else summ+=10;
            	      				}
            	break;
            case 'V':if (a[i-1]!='I') summ+=5;
					break;
				case 'I':if (a[i+1]=='V') summ+=4;
            			else {if (a[i+1]=='X') summ+=9;
                           else summ+=1;
                           }
    		     	break;
				default:
					break;
	  	 }
	 }
	return summ;
	}
BrutalSnowflake вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не понятно почему прога закрывается Saka Помощь студентам 11 21.12.2009 23:55
Помогите понять почему прога виснет Asira Помощь студентам 5 21.12.2009 22:57
не могу найти почему вылетает прога Андрей Куб Общие вопросы Delphi 19 28.04.2009 06:54