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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 102, средняя оценка - 4.66
Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
#1

Цикл в цикле (for()). - C++

26.09.2009, 17:43. Просмотров 14953. Ответов 20
Метки нет (Все метки)

Скажите пожалуйста, почему такая "штука" не работает?
C++
1
2
3
4
5
6
7
for ( i=0; i<N; i++ )
    {
        for (z=0;z<N;z++)
        {
         ... Выполняю своё действие.
        }   
    }
Цикл, который внутри первого, прогоняеться только 1 раз, хотя переменная N=40;
Ребята, подскажите пожалуйста как быть!
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2009, 17:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Цикл в цикле (for()). (C++):

Цикл в цикле - C++
Здравствуйте! У меня есть много векторов со множеством значений. Мне нужно произвести над ними несколько операций. И нужно это сделать в...

Цикл в цикле - C++
Срочно нужно сдать до конца октября 5 программ, помогите пожалуйста с одной &quot; Дано натуральное число n, действительное x.Вычислить.&quot; ...

Цикл в цикле - C++
Написать программу, в которой пользователь вводит по строкам с клавиатуры элементы двумерного массива (пока пользователь не остановит...

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

Разложение экспоненты в ряд тейлора. Цикл в цикле - C++
Здравствуйте. Сама задача: составить программу для вычисления множества значений функции exp x на интервале −40,1 с шагом 0.5 не...

Выяснить почему после ввода первого элемента массива цикл не работает (std::cin в цикле for) - C++
Добрый день! Взялся за простой пример из книги Лафоре. #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; const...

20
Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 20:14  [ТС] #16
rrrFer, спасибо большое. А можно как нибудь
C
1
2
for(i=0;i<n;i++)
                v[(-a[i]+max)/h].push_back(a[i]);
сделать для double?

Добавлено через 33 секунды
valeriikozlov, спасибо большое, но ума не приложу как сделать по другому
0
rrrFer
Заблокирован
26.09.2009, 20:23 #17
Win32,
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
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
int main(){
    double *a,max,min,h,t1;
    int n,i,m,j,tmp,l,tmp2;
    vector<double> *v;
    n=40; m=5;
    
    a=new double[n];
    v=new vector<double>[m];
    for(i=0;i<n;i++)
        a[i]=i+0.5;
 
    for(i=0;i<n;i++)
        cout<<a[i]<<endl;
    cout<<"------------------------------\n";
 
    min=max=a[0];
    for(i=1;i<n;i++){
        if(a[i]>max)
            max=a[i];
        if(a[i]<min)
            min=a[i];
    }
 
    h=(max-min)/m+1;
    for(i=0;i<n;i++)
        v[int((-a[i]+max)/h)].push_back(a[i]);
 
    for(i=0;i<m;i++)
        for(j=0,tmp=v[i].size();j<tmp;j++){
            for(l=j+1,tmp2=j;l<tmp;l++)
                if(v[i][l]>v[i][tmp2])
                    tmp2=l;
            t1=v[i][j];
            v[i][j]=v[i][tmp2];
            v[i][tmp2]=t1;
        }
    for(i=0,l=0;i<m;i++)
        for(j=0,tmp=v[i].size();j<tmp;j++,l++)
            a[l]=v[i][j];
 
    for(i=0;i<n;i++)
        cout<<a[i]<<endl;
 
    system("pause");
    return 0;
}
1
valeriikozlov
Эксперт С++
4674 / 2500 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
27.09.2009, 13:15 #18
Win32,
Вот исправленная Ваша программа с использованием алгоритма ящичной сортировки, по возрастанию:
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
#include "stdio.h"
#include "iostream"
#include "math.h"
using namespace std;
 
int main()
{
        int     i;              /* Переменная для циклов                        */
        int z, az, temp;
        double max = 0; /* Максимальный элемент массива         */
        double min = 0; /* Минимальный элемент массива          */
        int N;                  /* Количество элементов в массиве       */
        int M=10;                /* Количество "ящиков"  */
        int H;                  /* Размер ящика                               */
        double S[40];           /* Отсортированный массив                       */
        int K[40];              /* Массив для хранения номеров ящиков        */
        double A[] =    /* Определяем массив                            */
        {
                14.2594,                7.6226,                 8.1113,                 23.7865,
                20.1796,                27.3322,                10.2708,                30.1469,
                11.0851,                24.4584,                20.0111,                27.8091,
                1.4991,                 31.7734,                0.0454,                 5.3713,
                31.1648,                29.7484,                29.4232,                -2.8434,
                6.6163,                 22.2269,                10.5985,                0.6183,
                19.8660,                -1.7290,                19.3626,                33.6190,
                20.4391,                15.6690,                8.3869,                 19.8722,
                15.8876,                9.4932,                 8.0816,                 10.4655,
                0.3828,                 6.9225,                 26.5060,                15.4990
        };
 
        /* 1. Определяем колличество элементов в массиве. */
        N = sizeof(A) / sizeof(A[0]);
 
        /* 2. Определяем максимальный и минимальный элемент этого массива. */
        max=min=A[0];
        for ( i=0; i<N; i++ )
        {
        if ( A[i] > max )
        max = A[i];
        if ( A[i] < min )
        min = A[i];
        }
 
        /* 3. Определяем размер "ящиков"! */
        H = (fabs(max-min)) /M;
 
        /* 4. "Раскидываем" элементы по "ящикам". */
        for ( i=0; i<N; i++ )
        {
            K[i]=(fabs(max-A[i]))/(H+1);
        }
        /* 5. Сортируем элементы в ящиках и заносим отсортируемые элементы в массив S[]. */
        S[0]=min;
        for ( i=0; i<N; i++ )
        {
            if(A[i]==min)
                K[i]=-1;       
        }
        for ( i=M-1, az=1; i>0, az<N-1; i--)
        {   
            min=max;
            int y=1;
            while(y==1)
            {
            y=0;
            min=max;
            for (z=0;z<N;z++)
            {
                if(K[z]==i && A[z]<min && A[z]>=S[az-1])
                {
                    min=A[z];
                    y=1;
                    S[az]=min;
                    temp=z;                 
                }
                if(z==N-1 && y==1)
                {
                    az++;
                    K[temp]=-1;             
                }
            }
            }
        }
        S[N-1]=max;
        /* 4. Выводим на печать уже отсортированный массив. */
        for ( i=0; i<N; i++ )
        {
        cout << S[i] << " ";
        } 
        cin.get();
        return 0;
}
Немного пояснения к коду:
- Количество ящиков (переменная int M) может быть разным и наверное должно задаваться пользователем (на конечный результат это не влияет). Если хотите можете сделать чтобы М задавалось пользователем в начале программы. Я думаю Вы это сможете сделать сами.
- в п.4 ( "Раскидываем" элементы по "ящикам".) на самом деле не раскидываем по ящикам а просто каждому элементу A[i] сопоставляем номер ящика (который записан в K[i]). Так например при количестве ящиков (M=10) A[3]=23.7865, K[3]=2. Т.е. элементу А[3] сопоставлен второй ящик.


rrrFer,
При определенных значениях массива a[],
C++
1
2
3
        h=(max-min)/m+1;
        for(i=0;i<n;i++)
                v[int((-a[i]+max)/h)].push_back(a[i]);
в данной части кода, индекс вектора v[] может быть отрицательный.
2
rrrFer
Заблокирован
27.09.2009, 13:25 #19
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Win32,
rrrFer,
При определенных значениях массива a[],
C++
1
2
3
        h=(max-min)/m+1;
        for(i=0;i<n;i++)
                v[int((-a[i]+max)/h)].push_back(a[i]);
в данной части кода, индекс вектора v[] может быть отрицательный.
несогласен, прошу пример.
2
valeriikozlov
Эксперт С++
4674 / 2500 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
27.09.2009, 13:47 #20
Приношу извинения. Ошибся!(предполагал при условии что все числа массива a[] отрицательные)
2
Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
27.09.2009, 17:37  [ТС] #21
1. ОГРОМНОЕ ВСЕМ СПАСИБО за помощь!!! Вы все прям мегакулхацкеры джедаи )))))

2.
valeriikozlov писал:
Количество ящиков (переменная int M) может быть разным и наверное должно задаваться пользователем (на конечный результат это не влияет).
В данном агоритме количество ящиков вычесляется по формуле: m = max / 2 + 1;

3. Ещё раз всем огромное спасибо!!!!

P.S. valeriikozlov, спасибо, но "под себя" переделал ещё вчера....

Вот так сделал:
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
#include "stdafx.h"
#include "windows.h" 
#include <iostream>
#include <vector>
 
using std::vector   ;
using std::cout     ;
using std::wcout    ;
using std::locale   ;
using std::cin      ;
using std::endl     ;
 
int main()
{ 
 
    wcout.imbue(locale(".866")) ;
 
    double a[] = {      /* Определяем элементы нашего массива.                      */
    14.2594,        7.6226,         8.1113,         23.7865,
    20.1796,        27.3322,        10.2708,        30.1469,
    11.0851,        24.4584,        20.0111,        27.8091,
    1.4991,         31.7734,        0.0454,         5.3713,
    31.1648,        29.7484,        29.4232,        -2.8434,
    6.6163,         22.2269,        10.5985,        0.6183,
    19.8660,        -1.7290,        19.3626,        33.6190,
    20.4391,        15.6690,        8.3869,         19.8722,
    15.8876,        9.4932,         8.0816,         10.4655,
    0.3828,         6.9225,         26.5060,        15.4990
    };
 
    double max    ;     /* Переменная для хранения максимального элемента.      */
    double min    ;     /* Переменная для хранения минимального элемента.       */
    double h      ;     /* Величина h                                           */
    double t1     ;     /* Переменная для хранения временных жанных из ящиков   */
 
    int n         ;     /* Переменная для хранения количества элементов массива */
    int i,l       ;     /* Переменная для циклов                                */
    int m         ;     /* Переменная для хранения количества ящиков            */
    int j         ;     /* Переменная для хранения */
    int tmp, tmp2 ;     /* Переменные для хранения временных данных из ящиков   */
                        /* Объявляем вектор для сортировки.                     */
    vector <double> *v ;
                        /* Определяем количество элементов в массиве            */
    n = sizeof ( a ) / sizeof ( a[0] ) ;
    double A[40]  ;     /* Создаем массив для хранения отсортированных элементов*/
                        /* Вывдоим на печать исходный массив элементов          */
    wcout << L"Массив исходных чисел: " << endl ;
    for ( i=0; i<40; i++ )
    cout << a[i] << " " ;
    cout << endl << endl ;
                        /* Определяем максимальный и минимальный элемент массива*/
    min = max = a[0] ;
    for( i=1; i<n; i++ )
    {
        if( a[i] > max )
            max = a[i] ;
        if( a[i] < min )
            min = a[i] ;
    }
                        /* Определяем количество "ящиков".                       */
    m = max / 2 ;
                        /* Задаем векторную величину.                            */
    v = new vector <double> [m] ;
                        /* Задаем величину h                                     */
    h =( max - min ) / m + 1 ;
                        /* Выполняем алгоритм сортировки                         */
    for ( i=0; i<n; i++ )
    v [ int ( ( -a[i] + max ) /h ) ] . push_back ( a[i] ) ;
 
    for ( i=0; i<m; i++ )
        for ( j=0, tmp=v[i] . size(); j<tmp; j++ )
            {
            for ( l=j+1, tmp2=j; l<tmp; l++ )
                if ( v[i][l]>v[i][tmp2] )
                    tmp2 = l ;
                    t1 = v [i][j] ;
                    v[i][j] = v[i][tmp2] ;
                    v[i][tmp2] = t1 ;
            }
    for ( i=0, l=0; i<m; i++ )
    for ( j=0, tmp=v[i] . size(); j<tmp; j++, l++ )
    a[l] = v[i][j] ;
 
    int plus = 39 ;        /* Переменная для инвертирования упорядоченного массива */ 
                                                   /* Ивертируем полеченный массив */
    for ( i=0; i<n; i++ )
    {
        A[plus] = a[i] ;
        plus = plus - 1 ;
    }
    
                                      /* Выводим отсортированный массив на печать. */
    wcout << L"Отсорированный в порядке возрастания исходный массив: " << endl ;
    for ( i=0; i<n; i++ )
    {
        cout << A[i] << " " ;
    }
    cout << endl << endl ;
    system (  "pause" ) ;
 
    return 0 ;
}
0
27.09.2009, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2009, 17:37
Привет! Вот еще темы с ответами:

Цикл: цикл for вообще никак не воспринимается транслятором - C++
Пишу программу, которая производит различные действия с одномерным массивом. Возникла следующая проблема: цикл for вообще никак не...

Почему цикл на при 1 уходит в бесконечный цикл? - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { int x=0, y=0,...

Цикл for/Цикл while Помогите срочно пожалуйста... - C++
1.Вычислить и вывести на экран в виде таблицы значения функции F от x1 до x2 с шагом dx. где a, b и c - действительные числа. 2.Цикл...

Задание на цикл с параметром и цикл с постусловием - C++
Помогите пожалуйста написать программу с этими циклами. 1. Вычислить и напечатать таблицу значений функции Z= (e^-x)sinx для 0&lt;=x&lt;=П,...


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

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

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