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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Команда ветвления if 
:(
    Опции темы
Mello
Дата 10.2.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот кусок программного кода, вводятся название продукции и ее товарооборот, при вводе отрицательного числа происходит закрытие программы
Код

double stat()

    {            

char name1[9], name2[9], name3[9];
float tovb1, tovb2, tovb3;
float tovt1, tovt2, tovt3;
float iq1, iq2, iq3;
float ip1, ip2, ip3;


system ("cls");
int i;

printf(" \n Vvedite nazvaniya produktov: \n"); 
scanf_s("%9s", name1,10);
scanf_s("%9s", name2, 10);
scanf_s("%9s", name3, 10);


    float* fArray[3]={&tovb1,&tovb2,&tovb3};
    fArray[0]=&tovb1;
    printf(" Vvedite bazisnyi tovarooborot \n");

for (i=0; i<3; i++)
{

    scanf_s("%f",fArray[i]);
    
    
    
    if (tovb1<0) 
    {
    
     std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);  if (tovb2<0)
 
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);if (tovb3<0)
    
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);
    
if (tovb3>0)

    goto x;
}

}


x:;
    float* tArr[3]={&tovt1,&tovt2,&tovt3};
    tArr[0]=&tovt1;
    printf(" Vvedite tekushyi tovarooborot \n");
for(i=0; i<3; i++)
{
    scanf_s("%f", tArr[i]);
    
    if (tovt1 <0)
    {
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);  
if (tovt2<0)
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);  
if (tovt3<0)
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);
if (tovt3>0)
goto x1;

}
Дело в том что, если введенное значение отрицаеально, то как и нужно происходит выход из программы, при вводе остальных отрицательных в остальные две переменые, программа не производит выход! Хелп!



Добавлено через 44 секунды
Дело в том что, если введенное значение отрицаеально, то как и нужно происходит выход из программы, при вводе остальных отрицательных в остальные две переменые, программа не производит выход! Хелп!
PM MAIL   Вверх
feodorv
Дата 10.2.2012, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Mello @  10.2.2012,  19:15 Найти цитируемый пост)
    if (tovt1 <0)
    {
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);  
if (tovt2<0)
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);  
if (tovt3<0)
std::cout <<"Otrizatelnye chisla nedopuskayutsya";
exit(EXIT_SUCCESS);
if (tovt3>0)
goto x1;
}


Может быть так:
Код

    if (tovt1 <0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS); 
    }
    if (tovt2<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);  
    }
    if (tovt3<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);
    }
    if (tovt3>0) goto x1;

А то у Вас все exit'ы находятся внутри if (tovt1 <0) { ... }


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vol4ek
Дата 10.2.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


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

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



Код


 if (tovt1 <0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      Sleep(5000);
      exit(EXIT_SUCCESS); 
    }



прочитать чтоб можно было.  smile 
PM MAIL ICQ   Вверх
Mello
Дата 10.2.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Может быть так:код C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
      if (tovt1 <0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS); 
    }
    if (tovt2<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);  
    }
    if (tovt3<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);
    }
    if (tovt3>0) goto x1;




А то у Вас все exit'ы находятся внутри if (tovt1 <0) { ... }

Как раз так я изначально и делал,  но тогда уже и при вводе положительного числа программа почемуто закрывается smile 
PM MAIL   Вверх
feodorv
Дата 11.2.2012, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Mello @  10.2.2012,  22:44 Найти цитируемый пост)
программа почемуто закрывается 

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Mello
Дата 11.2.2012, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да пишет что отрицательные числа недопускается,  хотя ввожу положительные, и закрывается, это меня больше всего удивило
PM MAIL   Вверх
feodorv
Дата 12.2.2012, 00:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Mello @  11.2.2012,  18:46 Найти цитируемый пост)
Да пишет что отрицательные числа недопускается,  хотя ввожу положительные, и закрывается, это меня больше всего удивило 

Судя по всему, у Вас нарушена логика происходящего в программе. Смотрите:
Код

float tovb1, tovb2, tovb3;
...
float* fArray[3]={&tovb1,&tovb2,&tovb3};
...
fArray[0]=&tovb1; /* это надо выбросить ;) т.к. лишнее */

Пока всё супер, но нужно учесть, что  переменные tovb1, tovb2, tovb3 не проинициализированы. В случае, когда Вы их будете считывать с консоли, это не имеет значения. Но!... что же дальше:
Код

for (i=0; i<3; i++)
{
    scanf_s("%f",fArray[i]);
    ....
}

И тут всё супер. Но!...
Код

for (i=0; i<3; i++)
{
    scanf_s("%f",fArray[i]);

    if (tovt1 <0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS); 
    }
    if (tovt2<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);  
    }
    if (tovt3<0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS);
    }

  ...
}

уже не супер. В теле цикла считывается переменная по адресу fArray[i], а проверка на отрицательность идёт сразу по всем 3-м переменным! На первом шаге цикла (i равное 0) tovb2 и tovb3 вообще ещё не проинициализированы (содержат мусор), а уже делается попытка проверить их значение на отрицательность)))

По-моему, логичнее было бы так:
Код

for (i=0; i<3; i++)
{
    scanf_s("%f",fArray[i]);

    if ( *fArray[i] <0)
    {
      std::cout <<"Otrizatelnye chisla nedopuskayutsya";
      exit(EXIT_SUCCESS); 
    }
}

И операторов меньше, и смысла больше)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Mello
Дата 14.2.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое, вы мне помогли, но вот есть подобная конструкция, только она занесена в бесконечный цикл и при вводе отрицательных значений  возвращает к началу цикла, разрушение цикла осуществляется меткой оставленой за пределами тела цикла
Код
int ix1, ix2, ix3, ix4;

unsigned short f1,f2,f3,f4;
unsigned short fi1,fi2,fi3,fi4;
unsigned short m1, m2, m3, m4;
while (1)
{
    

printf(" 1. Vvedite kolichestvo izgotovlenyh detaley\n");  
scanf_s("%i", &ix1);
if(ix1<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (ix1>0)
printf("1.kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 1 brigade\n");
scanf_s("%d", &f1);
if (f1<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (f1>0)
printf("1.kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 2 brigade\n");
scanf_s("%d", &fi1);
if (fi1<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (fi1>0)
m1=f1+fi1;
printf("1.Obshee kolichestvo rabochih imejushih dannuyu proizvoditelnost ravna\n %i" ,m1 );
if (m1<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (m1>0)
system("cls");

printf(" 2. Vvedite kolichestvo izgotovlenyh detaley \n");
scanf_s("%i", &ix2);
if (ix2>0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (ix2<0)
printf("2.kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 1 brigade\n");
scanf_s("%d", &f2);
if (f2>0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (f2<0)
printf("2.kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 2 brigade\n");
scanf_s("%d", &fi2);
if (fi2>0)

m2=f2+fi2;
printf("2.Obshee kolichestvo rabochih imejushih dannuyu prroizvoditelnost ravna\n %i" ,m2 );
if (m2>0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (m2<0)
system("cls");
printf(" 3. Vvedite kolichestvo izgotovlenyh detaley\n"); 
scanf_s("%i", &ix3);
if (ix3<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (ix3>0)
printf("3. Kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 1 brigade \n");
scanf_s("%d", &f3);
if (f3<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (f3>0)
printf("3. Kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 2 brigade \n");
scanf_s("%d", &fi3);
if (fi3<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (fi3>0)
m3=f3+fi3;
printf("3.Obshee kolichestvo rabochih imejushih dannuyu proizvoditelnost \n %i" ,m3);
if (m3<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (m3>0)

system("cls");
printf(" 4. Vvedite kolichestvo izgotovlenyh detaley\n"); 
scanf_s("%i", &ix4);
if (ix4<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (ix4>0)
printf("4. Kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 1 brigade \n");
scanf_s("%d", &f4);
if (f4<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (f4>0)
printf("4. Kol-vo rabochih imeyushih dannuyu proizvoditelnost' v 2 brigade \n");
scanf_s("%d", &fi4);
if (fi4<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim";
continue;
}
if (fi4>0)
goto t;
}


Тут подобные симптомы, при вводе первого отр. значения преходит в начало цикла, потом только через два значения и т.д
PM MAIL   Вверх
feodorv
Дата 14.2.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
разрушение цикла осуществляется меткой оставленой за пределами тела цикла

Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
if (fi4>0)
goto t;

Давайте обходиться без дополнительных goto:
Код

if (fi4>0) break;



Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
Тут подобные симптомы

Так ведь всегда можно напечатать, что именно вызвало "подобные симптомы", есди уж отладчик никак:
Код

if (f1<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim (f1)";
continue;
}
...
if (f2<0)
{
std::cout <<" \n Vvod otricatelnyh chisel nedopustim (f2)";
continue;
}
...



Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
if (fi4>0)
goto t;

Мне не понятно, если я введу fi4 как 0, то цикл по-новой пойдёт? За что? А если m1 есть 0, то экран не будем стирать?


Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
Тут подобные симптомы, при вводе первого отр. значения преходит в начало цикла, потом только через два значения и т.д 

Не понял симптомов. Вы же сами пишете continue, что и означает переход на начало цикла. 


Цитата(Mello @  14.2.2012,  11:06 Найти цитируемый пост)
unsigned short f1,f2,f3,f4;
unsigned short fi1,fi2,fi3,fi4;
unsigned short m1, m2, m3, m4;

Проверять изначально неотрицательные величины (unsigned) на отрицательность???

Ну если у Вас unsigned, то и ввод нужно делать unsigned:
Код
scanf_s("%u", &ix1);


Ну и если у Вас C++, то уж до конца:
Код

cin >> ix1;



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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