Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Дмiтрiй
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 16
#1

Зацикливание в меню, как исправить? - C++

07.02.2013, 13:09. Просмотров 337. Ответов 6
Метки нет (Все метки)

Скажите что нужно изменить, чтобы при вызове из "менюшки", функция не повторялась бесконечно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
//
#include "StdAfx.h"
#include <cstdio>
#include <windows.h>
#include <cmath>
 
 
void myfoo_array(int ** arr,int & height,int & width) //уплотняет массив
{
     for ( int i = 0 , flag = false; i < height ; ++i , flag=false )
     {
         for (int j=0; j < width ; ++j)
             if ( arr[i][j]!=0 )
             {
                 flag = true; 
                 break;
             }
        if (!flag)
        {
            delete [] arr[i];
            memcpy ( arr+i , arr+i+1 , sizeof  (arr[i])*(height-i-1) );
            --i; --height;
        }
     }
 
     for ( int i = 0 , flag=false ; i < width ; ++i , flag=false )
     {
         for (int j=0;j<height;++j)
             if ( arr[j][i] != 0)
             {
                 flag = true; 
                 break;
             }
        if ( !flag )
        {
            for ( int d = 0 ; d < height ; ++d )
                memcpy ( arr[d]+i , arr[d]+i+1 , sizeof (arr[d][i])*(width-i-1) ); //memcpy - копирует память; sizeof возвращает размер переданного объекта в байтах.
            --i; --width;
        }
     } 
} 
 
 
int ** create_array(int **& arr,int & height,int & width) //создает массив
{
    scanf("%d %d", &width, &height);
    printf("\n");
    
    arr = new int*[height];   // height - высота    widtf - ширина
    for (int i = 0; i< height; ++i)
    {
        arr[i] = new int [width];
    }
     return arr;
}
 
 
void in_array(int **& arr,const int & height,const int & width) // задает коордиинаты массива
{
    for (int i = 0; i< height; ++i)
    {
        for (int j = 0; j< width; ++j)
        {
            printf("Введите элемент [%d][%d]: ", i+1, j+1);
            scanf("%d", arr[i]+j);
        }
    }
}
 
void print_array(int ** arr,const int & height,const int & width) //выводит массив //выводит уплотненный массив
{
    for (int i = 0; i< height; ++i)
    {
        for (int j = 0; j< width; ++j)
        {
            printf("%d", arr[i][j]);
        }
        printf ("\n");
    }
}
 
int modsum_array(int ** arr,const int & height,const int & width) //считает сумму
{
    int sum = 0;
    for( int i = 0; i < height; ++i)
        for( int j = 0; j < width; ++j)
            if ( i < j )
            {
                sum += abs (arr[i][j]);
            }
      return sum;
}
 
int main()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int ** a = NULL;
    int height = 0;
    int width = 0;
    int menu = 0;
    {
        printf("Меню программы:\n");
        printf("1.Введите размерность массива (ширина, высота): \n");
        printf("2.Введите значения элементов массива: \n");
        printf("3.Вы ввели матрицу: \n");
        printf("4.Уплотнить матрицу. \n");
        printf("5.Вывести измененную матрицу: \n");
        printf("6.Вывести сумму элементов расположенных выше главной диагонали. \n");
        printf("--------------------------------\n");
        printf("0.Выход. \n");
 
        scanf("%d", &menu);
 
        do
        {
            switch (menu)
            {
            case 1:
                {
                printf("Введите размерность массива (ширина, высота): \n");
                create_array(a,height,width); //создает массив
                }
                break;
            case 2:
                {
                printf("Введите значения элементов массива: \n");
                in_array(a,height,width); // задает коордиинаты массива
                }
                break;
            case 3:
                {
                printf("Вы ввели матрицу: \n");
                print_array(a,height,width); //выводит массив
                }
                break;
            case 4:
                {
                printf("Уплотнить матрицу. \n");
                myfoo_array(a,height,width); //уплотняет массив
                }
                break;
            case 5:
                {
                printf("Вывести измененную матрицу: \n");
                print_array(a,height,width); //выводит уплотненный массив
                }
                break;
            case 6:
                {
                printf ("\nСумма элементов расположенных выше главной диагонали равна: %d", modsum_array(a,height,width)); //считает сумму
                }
                break;
            case 0:
                break;
            default:
                printf ("Неверный пункт меню");
            }
        } while (menu != 0);
        
        return 0;
    }
    for (int i = 0; i< height; ++i)
    
    {
        delete [] a[i];
    }
    delete [] a; 
    getchar();
    getchar();  
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 13:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зацикливание в меню, как исправить? (C++):

Нужно исправить while (зацикливание) - C++
После while (!(cin &gt;&gt; a.age) || a.age &gt; 0 || a.age &lt; 150) идет зацикливание. Всю голову уже сломал, помогите исправить. Вот весь код: ...

Зацикливание do-while в меню со switch - C++
Доброго времени суток. Пытаюсь написать программу по обработке динамического двумерного массива. Массив заполняется и обрабатывается...

зацикливание программы. Не могу найти понять что исправить - C++
При вводе буквы происходит зацикливание программы строчкой &quot;Введите 1ый катет:&quot; или &quot;Введите 2ой катет: &quot; ,смотря где ввести букву.......

Зацикливание действий: программа выходит в главное меню и снова заходит в выбранный метод записи. - C++
Всем привет! Ребят, подскажите мне, что я написал не так в программе. При запуске программы Я выбираю первое действие (Запись в файл...

Как определить зацикливание процесса? - C++
Собственно, сабж в названии. Как определить, что некоторая программа другого процесса зациклилась? Или, допустим, имея свой процесс и...

Как избежать зацикливание ввода не числа? - C++
Как избежать зацикливание ввода не числа? чтобы при вводе символа не уходил в бесконечный цикл. Пример: #include &lt;iostream.h&gt; ...

6
-=ЮрА=-
Заблокирован
Автор FAQ
07.02.2013, 13:29 #2
Дмiтрiй, в буффере остаются \n от ввода они то и коробят scanf на следующей итерации цикла меню в Си это легко исправить дописав getchar после каждого scanf. В плюсах для этой цели служит cin.sync либо таже cin.get после cin>>param
0
Дмiтрiй
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 16
07.02.2013, 13:42  [ТС] #3
Везде getchar натыкал, все равно зацикливание =(
0
ya_noob
_
202 / 146 / 9
Регистрация: 08.10.2011
Сообщений: 432
07.02.2013, 14:08 #4
Дык scanf из строки 115 наверное должен лежать внутри цикла, а не снаружи, чтобы можно было повторно вводить номер пункта меню.
И зачем вам нужен блок для строк 104-164 ? Такое ощущение, что цикл do там должен быть, а не в строках 117-161
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.02.2013, 14:17 #5
Цитата Сообщение от Дмiтрiй Посмотреть сообщение
Везде getchar натыкал, все равно зацикливание =(
- да какой там цикл, парень у тебя и смесь Си/С++ и лаги в коде и плохой концепт. Ниже я дотянул его до стандарта Си.
А тебе рекомендую почитать литературу почему нельзя Си и плюсы одновременно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int ** myfoo_array (int ** arr, int *height,int *width);//óïëîòГ*ГїГҐГІ Г¬Г*Г±Г±ГЁГў
int ** create_array(int ** arr,int *height, int *width);//ñîçäГ*ГҐГІ Г¬Г*Г±Г±ГЁГў
void in_array(int ** arr,const int height,const int width); // Г§Г*Г¤Г*ГҐГІ êîîðäèèГ*Г*ГІГ» Г¬Г*Г±Г±ГЁГўГ*
void print_array(int ** arr,const int height,const int width); //âûâîäèò Г¬Г*Г±Г±ГЁГў //âûâîäèò óïëîòГ*ГҐГ*Г*ûé Г¬Г*Г±Г±ГЁГў
int modsum_array(int ** arr,const int height,const int width); //Г±Г·ГЁГІГ*ГҐГІ ñóììó
 
int main()
{
 
    system("chcp 1251");
 
    int i;
    int ** a = NULL;
    int height = 0;
    int width = 0;
    int menu  = 10;
    while(menu)
    {
        printf("ГЊГҐГ*Гѕ ïðîãðГ*ììû:\n");
        printf("1.Ââåäèòå Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ* (øèðèГ*Г*, âûñîòГ*): \n");
        printf("2.Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГї ýëåìåГ*òîâ Г¬Г*Г±Г±ГЁГўГ*: \n");
        printf("3.Âû ââåëè Г¬Г*òðèöó: \n");
        printf("4.ÓïëîòГ*ГЁГІГј Г¬Г*òðèöó. \n");
        printf("5.Âûâåñòè èçìåГ*ГҐГ*Г*ГіГѕ Г¬Г*òðèöó: \n");
        printf("6.Âûâåñòè ñóììó ýëåìåГ*òîâ Г°Г*ñïîëîæåГ*Г*ûõ âûøå ГЈГ«Г*ГўГ*îé äèГ*ГЈГ®Г*Г*ëè. \n");
        printf("--------------------------------\n");
        printf("0.Âûõîä. \n");
 
        scanf("%d", &menu);
 
        switch (menu)
        {
            case 1:
                printf("Ââåäèòå Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ* (øèðèГ*Г*, âûñîòГ*): \n");
                a = create_array(a, &height, &width); //ñîçäГ*ГҐГІ Г¬Г*Г±Г±ГЁГў
                break;
            case 2:
                printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГї ýëåìåГ*òîâ Г¬Г*Г±Г±ГЁГўГ*: \n");
                in_array(a,height,width); // Г§Г*Г¤Г*ГҐГІ êîîðäèèГ*Г*ГІГ» Г¬Г*Г±Г±ГЁГўГ*
                break;
            case 3:
                printf("Âû ââåëè Г¬Г*òðèöó: \n");
                print_array(a,height,width); //âûâîäèò Г¬Г*Г±Г±ГЁГў
                break;
            case 4:
                printf("ÓïëîòГ*ГЁГІГј Г¬Г*òðèöó. \n");
                a = myfoo_array(a,&height,&width); //óïëîòГ*ГїГҐГІ Г¬Г*Г±Г±ГЁГў
                break;
            case 5:
                printf("Âûâåñòè èçìåГ*ГҐГ*Г*ГіГѕ Г¬Г*òðèöó: \n");
                print_array(a,height,width); //âûâîäèò óïëîòГ*ГҐГ*Г*ûé Г¬Г*Г±Г±ГЁГў
                break;
            case 6:
                printf ("\nÑóììГ* ýëåìåГ*òîâ Г°Г*ñïîëîæåГ*Г*ûõ âûøå ГЈГ«Г*ГўГ*îé äèГ*ГЈГ®Г*Г*ëè Г°Г*ГўГ*Г*: %d", modsum_array(a,height,width)); //Г±Г·ГЁГІГ*ГҐГІ ñóììó
                break;
            case 0:
                menu = 0;
                break;
            default:
                printf ("ГЌГҐГўГҐГ°Г*ûé ГЇГіГ*ГЄГІ ìåГ*Гѕ");
                break;
        } 
    }
    for (i = 0; i< height && a; ++i)
        free((void *)a[i]);
   // delete [] a; //Г‡Г* ГЅГІГ® Г*Г*äî îòðóáûâГ*ГІГј ðóêè Гў êîäå Ñè!
    return 0;
}
 
int ** myfoo_array(int ** arr,int *height,int *width) //óïëîòГ*ГїГҐГІ Г¬Г*Г±Г±ГЁГў
{
    int i, j, d, flag;
     for (i = 0 , flag = 0; i < *height ; ++i , flag=0 )
     {
         for (j=0; j < *width ; ++j)
             if ( arr[i][j]!=0 )
             {
                 flag = 1; 
                 break;
             }
        if (!flag)
        {
            free((void *)arr[i]);
            memcpy ( arr+i , arr+i+1 , sizeof  (arr[i])*(*height-i-1) );
            i = i - 1; 
            *height = *height - 1;
        }
     }
 
     for ( i = 0 , flag=0 ; i < *width ; i++ , flag=0 )
     {
         for (j=0;j < *height;++j)
             if ( arr[j][i] != 0)
             {
                 flag = 1; 
                 break;
             }
        if ( !flag )
        {
            for (d = 0 ; d < *height ; ++d )
                memcpy ( arr[d]+i , arr[d]+i+1 , sizeof (arr[d][i])*(*width-i-1) ); //memcpy - êîïèðóåò ГЇГ*ìÿòü; sizeof âîçâðГ*Г№Г*ГҐГІ Г°Г*çìåð ïåðåäГ*Г*Г*îãî îáúåêòГ* Гў ГЎГ*éòГ*Гµ.
            --i; 
            *width = *width - 1;
        }
     } 
     return arr;
} 
 
 
int ** create_array(int ** arr,int *height,int *width) //ñîçäГ*ГҐГІ Г¬Г*Г±Г±ГЁГў
{
    scanf("%d %d", width, height);    
    int i;
    arr = (int **)malloc(*height*sizeof(int *));   // height - âûñîòГ*    widtf - øèðèГ*Г*
    for (i = 0; i< *height; ++i)
        arr[i] = (int *)malloc(*width*sizeof(int));
    return arr;
}
 
 
void in_array(int ** arr,const int height,const int width) // Г§Г*Г¤Г*ГҐГІ êîîðäèèГ*Г*ГІГ» Г¬Г*Г±Г±ГЁГўГ*
{
    int i, j;
    for (i = 0; i< height; ++i)
    for (j = 0; j< width; ++j)
    {
        printf("Ââåäèòå ýëåìåГ*ГІ [%d][%d]: ", i+1, j+1);
        scanf("%d", arr[i]+j);
    }
}
 
void print_array(int ** arr,const int height,const int width) //âûâîäèò Г¬Г*Г±Г±ГЁГў //âûâîäèò óïëîòГ*ГҐГ*Г*ûé Г¬Г*Г±Г±ГЁГў
{
    int i, j;
    for (i = 0; i< height; ++i)
    {
        for (j = 0; j< width; ++j)
        {
            printf("%d", arr[i][j]);
        }
        printf ("\n");
    }
}
 
int modsum_array(int ** arr,const int height,const int width) //Г±Г·ГЁГІГ*ГҐГІ ñóììó
{
    int sum = 0;
    int i, j;
    for( i = 0; i < height; i++)
    for( j = 0; j < width;  j++)
    {
         if ( i < j )
         {
            sum += abs (arr[i][j]);
         }
    }
    return sum;
}
1
Миниатюры
Зацикливание в меню, как исправить?  
-=ЮрА=-
Заблокирован
Автор FAQ
07.02.2013, 14:18 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
system("chcp 1251");
- если студия новая, то замени эту руссификацию на setlocale(LC_ALL,"RUS"); + добавь в хедеры locale.h
1
Дмiтрiй
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 16
07.02.2013, 14:22  [ТС] #7
Спасибо! Буду учиться
0
07.02.2013, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2013, 14:22
Привет! Вот еще темы с ответами:

Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a) - C++
You have a pointer to some element in a linked list (a =&gt; b =&gt; c =&gt; d =&gt; e). What is the fastest way to tell if there is a loop in the...

зацикливание в C++ - C++
Подскажите, пожалуйста, как зациклить программу, чтобы при попытке набрать другой символ выдавалось сообщение с ошибкой и происходило...

Зацикливание - C++
Помогите разобраться while (point &gt;= min &amp;&amp; point &lt;= max || prodal &gt;= min &amp;&amp; prodal &lt;= max) { cin &gt;&gt; point; sobestoimostb = point...

зацикливание - C++
Не выдает нужного результата происходит зацыкливание // wer.cpp : Defines the entry point for the console application. // ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru