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


Автор: Альдорон 31.5.2011, 21:05
Написал программу, но не знаю как избавится от её зацикливания
Ниже приведен кусок кода

Код

#include <stdio.h> /*стандартный заголовочный файл ввода/вывода*/
#include <math.h>  /*для выполнения простых математических операций*/
#include <conio.h> /*для getch()*/
#include <locale.h> /* для setlocale()*/
void main()
{
    int n,I,R,U,I1,I2,I3,I4,I5,I6,I7,I8,I9,R1,R2,R3,R4,R5,R6,R7,R8,R9,q,g;/*Перечисление переменных*/
    setlocale(LC_ALL, "");/*функци для вывода русского языка*/
    wprintf (L"%s\n",L"Это программа для рассчета напряжения в электро цепи");
    wprintf (L"%s\n",L"для начала работы нажмите <ENTER>");
    getchar();  /*ждем ввод*/
    LOOP:
    setlocale(LC_ALL, "");
    wprintf (L"%s\n",L"Введите количество узлов в цепи (от 1 до 10)");
    wscanf    (L"%d",&n);
    /*Далее идет варианты вычисления в зависимости*/ 
    /*от количества узловых точек в электро цепи*/
    switch (n)
    {
        case 1: 
                    wprintf (L"%s\n", L"Введите I");
                    wscanf  (L"%d",&I);
                    wprintf (L"%s\n", L"Введите R");
                    wscanf  (L"%d",&R);
                    U=I*R;    /*рассчетная формула для двух переменных*/
                    printf    ("%s\n","*********************************************");
                    printf    ("U = %d\n", U);/*вывод ответа*/
                    wprintf (L"%s\n", L"Для продолжения работы нажмите <g>,для выхода нажмите <q>");
                    wscanf    (L"%d",&q);
                    wscanf    (L"%d",&g);
                    if(g);
                    goto LOOP;
                    if(q);
                    getch();
                    break;
        case 2:
                    wprintf (L"%s\n", L"Введите I");
                    wscanf  (L"%d",&I);
                    wprintf (L"%s\n", L"Введите I1");
                    wscanf  (L"%d",&I1);
                    wprintf (L"%s\n", L"Введите R");
                    wscanf  (L"%d",&R);
                    wprintf (L"%s\n", L"Введите R1");
                    wscanf  (L"%d",&R1);
                    U=I*R+I1*R1;/*рассчетная формула для четырех переменных*/
                    printf    ("%s\n","*********************************************");
                    printf    ("U = %d\n", U);
                    wprintf (L"%s\n", L"Для продолжения работы нажмите <g>,для выхода нажмите <q>");
                    wscanf    (L"%d",&q);
                    wscanf    (L"%d",&g);
                    if(g);
                    goto LOOP;
                    if(q);
                    getch();
                    break;    


Заранее благодарен.

Автор: DarkProg 31.5.2011, 22:24
Всё просто - напишите программу не используя goto и вы поймёте.

А вообще вот этот кусочек кода поправьте и поидее заработает...

Код

if(g) 
goto LOOP;
if(q)
{
getch();
break;
}  


P.S. не компилил, так на ходу разбирал, вроде верно...

Автор: Альдорон 31.5.2011, 23:07
А подскажите как без goto добиться того чтобы программа возвращалась в начало?

Автор: awesome 1.6.2011, 00:06
Цитата(Альдорон @  31.5.2011,  23:07 Найти цитируемый пост)
А подскажите как без goto добиться того чтобы программа возвращалась в начало? 


Код

#include <stdio.h> /*стандартный заголовочный файл ввода/вывода*/
#include <math.h>  /*для выполнения простых математических операций*/
#include <conio.h> /*для getch()*/
#include <locale.h> /* для setlocale()*/
void main()
{
    int n,I,R,U,I1,I2,I3,I4,I5,I6,I7,I8,I9,R1,R2,R3,R4,R5,R6,R7,R8,R9;/*Перечисление переменных*/
    char ch = ' ';
    setlocale(LC_ALL, "");/*функци для вывода русского языка*/
    wprintf (L"%s\n",L"Это программа для рассчета напряжения в электро цепи");
    wprintf (L"%s\n",L"для начала работы нажмите <ENTER>");
    getchar();  /*ждем ввод*/
    setlocale(LC_ALL, "");
    while(ch != 'q')
    {
    wprintf (L"%s\n",L"Введите количество узлов в цепи (от 1 до 10)");
    wscanf    (L"%d",&n);
    /*Далее идет варианты вычисления в зависимости*/ 
    /*от количества узловых точек в электро цепи*/
    switch (n)
    {
        case 1: 
                    wprintf (L"%s\n", L"Введите I");
                    wscanf  (L"%d",&I);
                    wprintf (L"%s\n", L"Введите R");
                    wscanf  (L"%d",&R);
                    U=I*R;    /*рассчетная формула для двух переменных*/
                    printf    ("%s\n","*********************************************");
                    printf    ("U = %d\n", U);/*вывод ответа*/
                    wprintf (L"%s\n", L"Для продолжения работы нажмите <g>,для выхода нажмите <q>");
                    wscanf    (L"%s",&ch);
                    break;
        case 2:
                    wprintf (L"%s\n", L"Введите I");
                    wscanf  (L"%d",&I);
                    wprintf (L"%s\n", L"Введите I1");
                    wscanf  (L"%d",&I1);
                    wprintf (L"%s\n", L"Введите R");
                    wscanf  (L"%d",&R);
                    wprintf (L"%s\n", L"Введите R1");
                    wscanf  (L"%d",&R1);
                    U=I*R+I1*R1;/*рассчетная формула для четырех переменных*/
                    printf    ("%s\n","*********************************************");
                    printf    ("U = %d\n", U);
                    wprintf (L"%s\n", L"Для продолжения работы нажмите <g>,для выхода нажмите <q>");
                    wscanf    (L"%s",&ch);
                    break;   
    }
    }
}

Автор: bsa 1.6.2011, 10:34
Зачем setlocale вызывается более 1 раза? Да еще и в цикле!

Автор: awesome 1.6.2011, 18:16
Цитата(bsa @  1.6.2011,  10:34 Найти цитируемый пост)
Зачем setlocale вызывается более 1 раза? Да еще и в цикле! 

Это к кому вопрос? =)

Автор: bsa 2.6.2011, 09:42
awesome, к ТС, конечно smile

Автор: awesome 3.6.2011, 05:49
Так это чтобы наверняка, контрольный так сказать smile 

Автор: Dov 3.6.2011, 17:16
Цитата(Альдорон @  31.5.2011,  21:05 Найти цитируемый пост)
Написал программу, но не знаю как избавится от её зацикливания

Альдорон, в предыдущей твоей теме я показал тебе как с помощью цикла из трёх сотен строк твоего кода можно сделать всего несколько строчек. По ходу, ты сам 'зациклился'.  smile Ну, это твоё дело. 

Цитата(Альдорон @  31.5.2011,  23:07 Найти цитируемый пост)
А подскажите как без goto добиться того чтобы программа возвращалась в начало?

Показую ещё раз...
Код
int main()
{
    int    I, R, n, U;

    while(true)
    {
        printf("enter the number of nodes (from 1 to 10): ");
        scanf("%d", &n);

        U = 0;
        for(char i = ' '; n; (i == ' ' ? i = '1' : ++i), n--)
        {
            printf("enter I%c: ", i);
            scanf("%d", &I);
            printf("enter R%c: ", i);
            scanf("%d", &R);
            U += I * R;
        }
        printf("U = %d\n", U);

        fflush(stdin);
        printf("\npress <q> to quit or any key to continue\n");
      
        if(tolower(getch()) == 'q')
            break;
    }
    return 0;
}




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