Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/165: Рейтинг темы: голосов - 165, средняя оценка - 4.72
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
1

Цикл в цикле (for()).

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

Author24 — интернет-сервис помощи студентам
Скажите пожалуйста, почему такая "штука" не работает?
C++
1
2
3
4
5
6
7
for ( i=0; i<N; i++ )
    {
        for (z=0;z<N;z++)
        {
         ... Выполняю своё действие.
        }   
    }
Цикл, который внутри первого, прогоняеться только 1 раз, хотя переменная N=40;
Ребята, подскажите пожалуйста как быть!
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2009, 17:43
Ответы с готовыми решениями:

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

Цикл for в цикле for
Может кто-нибудь поможет мне разобраться с эти. Не пойму почему циклы for не как не работают ...

Цикл в цикле
На плоскости находятся две фигуры. Одна фигура будет фиксирована и это будет многоугольник, другая...

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

20
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
26.09.2009, 17:47 2
здесь правильно.
возможно, что-то внутри цикла неверно.
и где объявления переменных?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
26.09.2009, 17:48 3
Win32, Если все три переменные объявлены и N инициализирована, должно работать.
0
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 17:51  [ТС] 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 минуту
В условии, во втором цикле, вобще запутался
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
26.09.2009, 17:54 5
кто тебя обманул что у тебя N равно 40? N = 3
C++
1
2
double A[] = { 3, 1, 2 };
N = sizeof(A) / sizeof(A[0]);
эти вложенные циклы работают до конца
0
Заблокирован
26.09.2009, 17:56 6
Win32,
напиши что должна делать программа
0
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 17:58  [ТС] 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,
напиши что должна делать программа
Отсортировать данный массив методом ящичной сортировки.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
26.09.2009, 18:00 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;
}
1
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 18:05  [ТС] 9
Может тогда кто нибудь поможет с самим алгоритмом?

Добавлено через 2 минуты
А именно с 4ым пунктом... Заранее спасибо!
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.09.2009, 18:14 10
При первом просмотре сразу видно:
- если массив не содержит отрицательных чисел, то min всегда будет равно 0 (хоть в дальнейшем эта переменная и не используется).
-
/*3. Определяем количество "ящиков"! */
M = max / 2 + 1;
, а сама переменная М в дальнейшем не используется.
0
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 18:25  [ТС] 11
Алгорит ящичной сортировки:
Пусть имееться некоторый массив. Находим самый минимальный и максимальный элемент. Задаем число корзин (ящиков). Вычисляем величину h = ( Amax - Amin ) / m ( m - количество ящиков). Далее просматриваем массив. Каждому Ai -> k ( Каждому элементу сопоставляем номер ящика, в котором он находиться).
k = [(Ai - Amax ) / h] + 1;
Каждому ящику придадим тип списка. Заполняем списки для каждого из ящиков. В каждом из ящиков в среднем содержиться n/m элементов. В каждом из ящиков проводим упорядовачиние (например с помощью линейного алгоритма).
Заполняем исходный массив.
=(
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.09.2009, 19:33 12
Первоначальный код сами писали?
0
25 / 24 / 1
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 19:36  [ТС] 13
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Первоначальный код сами писали?
Да.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
26.09.2009, 19:53 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() в каждом из ящиков произвести упорядовачиние элементов. И обязательное условие чтобы эти циклы не были вложены друг в друга.
1
Заблокирован
26.09.2009, 20:02 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 использовать нельзя - пиши в личку
1
25 / 24 / 1
Регистрация: 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
Заблокирован
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
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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
Заблокирован
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
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
27.09.2009, 13:47 20
Приношу извинения. Ошибся!(предполагал при условии что все числа массива a[] отрицательные)
2
27.09.2009, 13:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2009, 13:47
Помогаю со студенческими работами здесь

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

Почему не работает цикл while в цикле for
подскажите, почему не срабатывает вывод если while находится в for ? #include &lt;iostream&gt;...

Цикл в цикле для сортировки массивов
Объясните, пожалуйста, зачем используется цикл в цикле при сортировке в массиве? И зачем нужна...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru