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

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

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

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

26.09.2009, 17:43. Просмотров 14095. Ответов 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
26.09.2009, 17:47 #2
здесь правильно.
возможно, что-то внутри цикла неверно.
и где объявления переменных?
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
26.09.2009, 17:48 #3
Win32, Если все три переменные объявлены и N инициализирована, должно работать.
0
Win32
25 / 24 / 0
Регистрация: 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
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
rrrFer
Заблокирован
26.09.2009, 17:56 #6
Win32,
напиши что должна делать программа
0
Win32
25 / 24 / 0
Регистрация: 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
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 18:05  [ТС] #9
Может тогда кто нибудь поможет с самим алгоритмом?

Добавлено через 2 минуты
А именно с 4ым пунктом... Заранее спасибо!
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.09.2009, 18:14 #10
При первом просмотре сразу видно:
- если массив не содержит отрицательных чисел, то min всегда будет равно 0 (хоть в дальнейшем эта переменная и не используется).
-
/*3. Определяем количество "ящиков"! */
M = max / 2 + 1;
, а сама переменная М в дальнейшем не используется.
0
Win32
25 / 24 / 0
Регистрация: 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
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.09.2009, 19:33 #12
Первоначальный код сами писали?
0
Win32
25 / 24 / 0
Регистрация: 18.08.2009
Сообщений: 126
26.09.2009, 19:36  [ТС] #13
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Первоначальный код сами писали?
Да.
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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
rrrFer
Заблокирован
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2009, 20:02
Привет! Вот еще темы с ответами:

Цикл: цикл 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;=П,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.09.2009, 20:02
Ответ Создать тему
Опции темы

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