Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 102, средняя оценка - 4.66
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 17:43     Цикл в цикле (for()). #1
Скажите пожалуйста, почему такая "штука" не работает?
C++
1
2
3
4
5
6
7
for ( i=0; i<N; i++ )
    {
        for (z=0;z<N;z++)
        {
         ... Выполняю своё действие.
        }   
    }
Цикл, который внутри первого, прогоняеться только 1 раз, хотя переменная N=40;
Ребята, подскажите пожалуйста как быть!
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
26.09.2009, 17:47     Цикл в цикле (for()). #2
здесь правильно.
возможно, что-то внутри цикла неверно.
и где объявления переменных?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9382 / 5432 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
26.09.2009, 17:48     Цикл в цикле (for()). #3
Win32, Если все три переменные объявлены и N инициализирована, должно работать.
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 17:51  [ТС]     Цикл в цикле (for()). #4
Вобщем, вот всё:
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
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
 
using namespace std;
 
int _tmain()
{
    int i;      /* Переменная для циклов            */
    int z = 0;
    int az=-1;
    double max = 0; /* Максимальный элемент массива     */
    double min = 0; /* Минимальный элемент массива      */
    int N;          /* Количество элементов в массиве   */
    int M;          /* Количество "ящиков"              */
    double S[40];       /* Отсортированный массив           */
    double A[] =    /* Определяем массив                */
    {
        3,1,2
    };
 
    /* 1. Определяем колличество элементов в массиве. */
    N = sizeof(A) / sizeof(A[0]);
 
    /* 2. Определяем максимальный и минимальный элемент этого массива. */
    for ( i=0; i<N; i++ )
    {
    if ( A[i] > max )
    max = A[i];
    if ( A[i] < min )
    min = A[i];
    }
 
    /* 3. Определяем количество "ящиков"! */
    M = max / 2 + 1;
 
    /* 4. "Раскидываем" элементы по "ящикам" отсортированного массива. */
    for ( i=0; i<N; i++ )
    {
        for (z=0;z<N;z++)
        {
            int zs=z+2;
            if ( A[z]<zs && A[z]>z)
            {
            az=az+1;
            S[az]=A[z];
            cout << "If " << A[z] << " < " << zs << " and " << A[z] << " > " << z << endl;
            cout << "ITS: " << z << "     " << A[z] << " going into S" << az << endl;
            cout << z << endl << endl;
            A[z]=0;
            }
        }   
    }
 
    /* 4. Выводим на печать уже отсортированный массив. */
    for ( i=0; i<N; i++ )
    {
    cout << S[i] << " ";
    }
 
    cin.get();
    return 0;
}
Делаю сортировку массива. Этот массив - это просто пример. Массив Ящичным алгоритмом. Инфы по нем в интернете нет. Помоги пожалуйста, второй день сижу.... ((((

Добавлено через 1 минуту
В условии, во втором цикле, вобще запутался
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
26.09.2009, 17:54     Цикл в цикле (for()). #5
кто тебя обманул что у тебя N равно 40? N = 3
C++
1
2
double A[] = { 3, 1, 2 };
N = sizeof(A) / sizeof(A[0]);
эти вложенные циклы работают до конца
rrrFer
Заблокирован
26.09.2009, 17:56     Цикл в цикле (for()). #6
Win32,
напиши что должна делать программа
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 17:58  [ТС]     Цикл в цикле (for()). #7
Цитата Сообщение от M128K145 Посмотреть сообщение
кто тебя обманул что у тебя N равно 40? N = 3
C++
1
2
double A[] = { 3, 1, 2 };
N = sizeof(A) / sizeof(A[0]);
Изначальная переменная:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
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 минуту
Цитата Сообщение от rrrFer Посмотреть сообщение
Win32,
напиши что должна делать программа
Отсортировать данный массив методом ящичной сортировки.
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
26.09.2009, 18:00     Цикл в цикле (for()). #8
цикл проходит полностью! вот
посмотри
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
#include "iostream"
 
using namespace std;
 
int _tmain()
{
    int     i;              /* Переменная для циклов                        */
    int z = 0;
    int az=-1;
    double max = 0; /* Максимальный элемент массива         */
    double min = 0; /* Минимальный элемент массива          */
    int N;                  /* Количество элементов в массиве       */
    int M;                  /* Количество "ящиков"                          */
    double S[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]);
    cout<<N<<endl;
 
    /* 2. Определяем максимальный и минимальный элемент этого массива. */
    for ( i=0; i<N; i++ )
    {
        if ( A[i] > max )
            max = A[i];
        if ( A[i] < min )
            min = A[i];
    }
 
    /* 3. Определяем количество "ящиков"! */
    M = max / 2 + 1;
 
    int counti(0), countz(0);
    /* 4. "Раскидываем" элементы по "ящикам" отсортированного массива. */
    for ( i=0; i<N; i++ )
    {
        ++counti;
        for (z=0;z<N;z++)
        {
            ++countz;
            int zs=z+2;
            if ( A[z]<zs && A[z]>z)
            {
                az=az+1;
                S[az]=A[z];
                cout << "If " << A[z] << " < " << zs << " and " << A[z] << " > " << z << endl;
                cout << "ITS: " << z << "     " << A[z] << " going into S" << az << endl;
                cout << z << endl << endl;
                A[z]=0;
            }
        }       
    }
 
    std::cout<<"counti = "<<counti<<"\ncountz = "<<countz;
 
    cin.get();
    return 0;
}
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 18:05  [ТС]     Цикл в цикле (for()). #9
Может тогда кто нибудь поможет с самим алгоритмом?

Добавлено через 2 минуты
А именно с 4ым пунктом... Заранее спасибо!
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.09.2009, 18:14     Цикл в цикле (for()). #10
При первом просмотре сразу видно:
- если массив не содержит отрицательных чисел, то min всегда будет равно 0 (хоть в дальнейшем эта переменная и не используется).
-
/*3. Определяем количество "ящиков"! */
M = max / 2 + 1;
, а сама переменная М в дальнейшем не используется.
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 18:25  [ТС]     Цикл в цикле (for()). #11
Алгорит ящичной сортировки:
Пусть имееться некоторый массив. Находим самый минимальный и максимальный элемент. Задаем число корзин (ящиков). Вычисляем величину h = ( Amax - Amin ) / m ( m - количество ящиков). Далее просматриваем массив. Каждому Ai -> k ( Каждому элементу сопоставляем номер ящика, в котором он находиться).
k = [(Ai - Amax ) / h] + 1;
Каждому ящику придадим тип списка. Заполняем списки для каждого из ящиков. В каждом из ящиков в среднем содержиться n/m элементов. В каждом из ящиков проводим упорядовачиние (например с помощью линейного алгоритма).
Заполняем исходный массив.
=(
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.09.2009, 19:33     Цикл в цикле (for()). #12
Первоначальный код сами писали?
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 19:36  [ТС]     Цикл в цикле (for()). #13
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Первоначальный код сами писали?
Да.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.09.2009, 19:53     Цикл в цикле (for()). #14
Судя по приведенному Вами алгоритму ящичной сортировки в Вашем коде есть несколько ошибок, и если первую половину кода можно просто исправить, то вторую половину (как раз ту о которой Вы задали первый вопрос) нужно переписывать. Как я понял Вы в данной части кода:
C++
1
2
3
4
5
6
7
for ( i=0; i<N; i++ )
        {
                for (z=0;z<N;z++)
                {
                 ... Выполняю своё действие.
                }       
        }
пытались каждому элементу (Ai) сопоставить номер ящика (k) и здесь же пытались в каждом из ящиков произвести упорядовачиние элементов.
Эти два действия необходимо разделить (т.е. не выполнять их в одном цикле for()).
Сначало в первом цикле for() необходимо каждому элементу (Ai) сопоставить номер ящика (k), а в следующем цикле for() в каждом из ящиков произвести упорядовачиние элементов. И обязательное условие чтобы эти циклы не были вложены друг в друга.
rrrFer
Заблокирован
26.09.2009, 20:02     Цикл в цикле (for()). #15
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
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
int main(){
    int *a,max,n,i,m,min,h,j,tmp,l,tmp2;
    vector<int> *v;
    n=40; m=5;
    
    a=new int[n];
    v=new vector<int>[m];
    for(i=0;i<n;i++)
        a[i]=n-i;
 
    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[(-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;
            l=v[i][j];
            v[i][j]=v[i][tmp2];
            v[i][tmp2]=l;
        }
    for(i=m-1,l=0;i>=0;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;
}
по возрастанию

Добавлено через 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
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
int main(){
    int *a,max,n,i,m,min,h,j,tmp,l,tmp2;
    vector<int> *v;
    n=40; m=5;
    
    a=new int[n];
    v=new vector<int>[m];
    for(i=0;i<n;i++)
        a[i]=i;
 
    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[(-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;
            l=v[i][j];
            v[i][j]=v[i][tmp2];
            v[i][tmp2]=l;
        }
    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 минуту
в задании сказано использовать список, я использовал std::vector, просто заменить массивом не получится, т.к. надо знать сколько элементов уже есть в каждом массиве. Если STL использовать нельзя - пиши в личку
Win32
 Аватар для Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 20:14  [ТС]     Цикл в цикле (for()). #16
rrrFer, спасибо большое. А можно как нибудь
C
1
2
for(i=0;i<n;i++)
                v[(-a[i]+max)/h].push_back(a[i]);
сделать для double?

Добавлено через 33 секунды
valeriikozlov, спасибо большое, но ума не приложу как сделать по другому
rrrFer
Заблокирован
26.09.2009, 20:23     Цикл в цикле (for()). #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;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
27.09.2009, 13:15     Цикл в цикле (for()). #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[] может быть отрицательный.
rrrFer
Заблокирован
27.09.2009, 13:25     Цикл в цикле (for()). #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[] может быть отрицательный.
несогласен, прошу пример.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2009, 13:47     Цикл в цикле (for()).
Еще ссылки по теме:

C++ Цикл: цикл for вообще никак не воспринимается транслятором
C++ Почему цикл на при 1 уходит в бесконечный цикл?
Цикл в цикле C++
Задание на цикл с параметром и цикл с постусловием C++
C++ Выяснить почему после ввода первого элемента массива цикл не работает (std::cin в цикле for)

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
27.09.2009, 13:47     Цикл в цикле (for()). #20
Приношу извинения. Ошибся!(предполагал при условии что все числа массива a[] отрицательные)
Yandex
Объявления
27.09.2009, 13:47     Цикл в цикле (for()).
Ответ Создать тему
Опции темы

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