0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
1

Некорректная работа циклов, обходящих массивы

28.05.2015, 18:40. Показов 1015. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с тем что цикл подставляет не верное значение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
 
                 CurrentStat.Set_Points(1325) ;
 
                 for (int i = 0 ; i <= 5 ; ++i){
                    CurrentStat.Set_Amount(i, 1) ;
                    CurrentStat.Set_Plus(i, 0) ;
                    CurrentStat.Set_Cost(i, 2) ;
                 }
                 
                 Draw() ;
             }
См. Первую приложенную картинку.

Почему я решил что проблема именно здесь?
Да потому что если после цикла задать значение "вручную", то значение задается корректно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
 
                 CurrentStat.Set_Points(1325) ;
 
                 for (int i = 0 ; i <= 5 ; ++i){
                    CurrentStat.Set_Amount(i, 1) ;
                    CurrentStat.Set_Plus(i, 0) ;
                    CurrentStat.Set_Cost(i, 2) ;
                 }
 
                 CurrentStat.Set_Cost(0, 2) ;
 
                 Draw() ;
             }
См. вторую приложенную картинку.

Примечание: код находится в Form1.h

Переменные Amount, Plus, Cost представляют собой массивы типа int.
Проблема почему-то всегда в первом и иногда в последнем члене массива (хотя они находятся в цикли на "равных условиях").
Пожалуйста, скажите в чем может быть проблема.
Миниатюры
Некорректная работа циклов, обходящих массивы   Некорректная работа циклов, обходящих массивы   Некорректная работа циклов, обходящих массивы  

0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 18:40
Ответы с готовыми решениями:

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю...

Хэш-массивы - некорректная проверка на существование элемента
Всем доброго времени суток! такая проблема: %hash = ( 'start' =&gt; 'a', 'a' =&gt; 'b', 'b' =&gt;...

Работа с INI: некорректная работа пользовательской функции
Ранее нашел код для работы с ini-файлами: public class INI { ///...

Программирование циклов с параметром. Одномерные массивы
Произвести следующую обработку 15 вещественных чисел: найти количество отрицательных чисел, а...

11
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 18:46  [ТС] 2
Хм, я только заметил, что вместе с Cost[0] изменился и Plus[5]:
C++
1
CurrentStat.Set_Cost(0, 2) ;
Похоже на ошибку в описаниях функций класса, но там ошибки быть не может :
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
/* Stat.cpp */
#pragma once /* Защита от двойного подключения заголовочного файла */
#include "stdafx.h"
#include "Stat.h"
 
void Stat::Increase(int Index, int Count) {
    for (int i = 0 ; i < Count ; ++i){
        if (Stat::Points > Stat::Cost[Index] && Stat::Amount[Index] < 99){
            ++Stat::Amount[Index] ;
            Stat:Points = Stat::Points - Stat::Cost[Index] ;
            
            //Установка цены стата:
            Stat::Cost[Index] = 2 ;
            if (Stat::Amount[Index] > 10) { Stat::Cost[Index] = 3 ; } ;
            if (Stat::Amount[Index] > 20) { Stat::Cost[Index] = 4 ; } ;
            if (Stat::Amount[Index] > 30) { Stat::Cost[Index] = 5 ; } ;
            if (Stat::Amount[Index] > 40) { Stat::Cost[Index] = 6 ; } ;
            if (Stat::Amount[Index] > 50) { Stat::Cost[Index] = 7 ; } ;
            if (Stat::Amount[Index] > 60) { Stat::Cost[Index] = 8 ; } ;
            if (Stat::Amount[Index] > 70) { Stat::Cost[Index] = 9 ; } ;
            if (Stat::Amount[Index] > 80) { Stat::Cost[Index] = 10 ; } ;
            if (Stat::Amount[Index] > 90) { Stat::Cost[Index] = 11 ; } ;
        } ;
    }
} ;
 
void Stat::Decrease(int Index, int Count){
} ;
 
int Stat::Get_Points(){
    return Stat::Points ;
} ;
 
int Stat::Get_Amount(int Index){
    return Stat::Amount[Index] ;
} ;
 
int Stat::Get_Plus(int Index){
    return Stat::Plus[Index] ;
} ;
 
int Stat::Get_Cost(int Index){
    return Stat::Cost[Index] ;
} ;
 
void Stat::Set_Points(int Count){
    Stat::Points = Count ;
} ;
 
void Stat::Set_Amount(int Index, int Count){
    Stat::Amount[Index] = Count ;
} ;
 
void Stat::Set_Plus(int Index, int Count){
    Stat::Plus[Index] = Count ;
} ;
 
void Stat::Set_Cost(int Index, int Count){
    Stat::Cost[Index] = Count ;
} ;
Добавлено через 51 секунду
Прототипы методов класса:
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
/* Stat.h */
#pragma once /* Защита от двойного подключения заголовочного файла */
 
 
class Stat {
public:
    void Increase(int, int) ;
    void Decrease(int, int) ;
 
    int Get_Points() ;
    int Get_Amount(int) ;
    int Get_Plus(int) ;
    int Get_Cost(int) ;
 
    void Set_Points(int) ;
    void Set_Amount(int,int) ;
    void Set_Plus(int,int) ;
    void Set_Cost(int,int) ;
 
private:
    int Points ;
    int Amount[5] ;
    int Plus[5] ;
    int Cost[5] ;
} ;
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 19:27  [ТС] 3
Прикладываю проект.
Вложения
Тип файла: rar project1.rar (766.1 Кб, 0 просмотров)
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
28.05.2015, 20:25 4
Выход за границу массива. Цикл до шести, а массивы на 5 элементов
Цитата Сообщение от Glikadin Посмотреть сообщение
for (int i = 0 ; i <= 5 ; ++i)
Цитата Сообщение от Glikadin Посмотреть сообщение
int Amount[5] ;
int Plus[5] ;
int Cost[5] ;
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 20:48  [ТС] 5
Выход за границу массива. Цикл до шести, а массивы на 5 элементов
Первый элемент массива с индексом "0". В массиве 6 элементов, если попробовать "обратится" к несуществующему элементу массива - приложение "вылетает".

Добавлено через 7 минут
Если я правильно понимаю цикл подставляет значения следующим образом:
i = 0 ;
i = 1 ;
i = 2 ;
i = 3 ;
i = 4 ;
i = 5 ;
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
28.05.2015, 20:59 6
Цитата Сообщение от Glikadin Посмотреть сообщение
В массиве 6 элементов
Как так ?
Цитата Сообщение от Glikadin Посмотреть сообщение
int Amount[5]
Там цифра пять .
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 21:05  [ТС] 7
0 - тоже цифра, в учебнике написано, что массив по умолчанию начинается с "0" = \
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
28.05.2015, 21:11 8
при чем тут массив с нуля и цикл ?
Массив у вас на пять элементов, а цикл до шести и всЁ.
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 21:18  [ТС] 9
Давайте посчитаем элементы массива int Amount[5]
0 - первый элемент
1 - второй
2 - третий
3 - четвертый
4 - пятый
5 - шестой.

Разберем цикл:
C++
1
2
3
4
5
                 for (int i = 0 ; i <= 5 ; ++i){
                    CurrentStat.Set_Amount(i, 1) ;
                    CurrentStat.Set_Plus(i, 0) ;
                    CurrentStat.Set_Cost(i, 2) ;
                 }
1шаг: i = 0 ; прибавим к i , 1
2шаг: i = 1 ; прибавим к i , 1
3шаг: i = 2 ; прибавим к i , 1
4шаг: i = 3 ; прибавим к i , 1
5шаг: i = 4 ; прибавим к i , 1
6шаг: i = 5 , стоп т.к. i уже не <= 5

Или я что-то не так понял ?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
28.05.2015, 21:25 10
Лучший ответ Сообщение было отмечено Glikadin как решение

Решение

Цитата Сообщение от Glikadin Посмотреть сообщение
Давайте посчитаем элементы массива int Amount[5]
Давайте .
0
1
2
3
4

Откуда шестой ? Если в массиве пять.
1
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 22
28.05.2015, 21:27  [ТС] 11
Хм, я могу быть уверен в том что цифра 5 указывает не на номер последнего элемента массива, а на количество элементов?
Спасибо, помогло, наверное я просто невнимательно читал учебник.
0
Администратор
Эксперт .NET
9427 / 4714 / 760
Регистрация: 17.04.2012
Сообщений: 9,570
Записей в блоге: 14
29.05.2015, 19:26 12
Цитата Сообщение от Glikadin Посмотреть сообщение
в учебнике написано, что массив по умолчанию начинается с "0"
Правильно написано. А ещё должно быть написано, что цифра в объявлении массива означает количество элементов в массиве, а не максимальный индекс.
0 - первый элемент
1 - второй
2 - третий
3 - четвертый
4 - пятый
Т.е. макс. индекс - 4.
1
29.05.2015, 19:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2015, 19:26
Помогаю со студенческими работами здесь

Программирование циклов с параметром. Одномерные массивы
ужас, помогите решить лабораторную, завтра экзамен, а у меня не сделано, я вообще не понимаю как...

Избавиться от циклов через массивы ячеек и cellfunc
Добрый день! Есть массив данных, он разбивается на n разных частей, при этом решается задача на...

Некорректная работа
Подскажите пожалуйста. Поставил win10, как-то сразу криво пошла установка anaconda. Запуск только...

Некорректная работа
Здравствуйте. Есть триггер который удаляет запись и сохраняет ее в другую таблицу.(из таблицы билет...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru