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

Работа с динамической памятью через указатели. Загадочная ошибка. - C++

Восстановить пароль Регистрация
 
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
25.03.2012, 12:41     Работа с динамической памятью через указатели. Загадочная ошибка. #1
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++.
Есть такая задача:
Создать массив из N целых чисел, N вводит пользователь. Заполнить массив случайным образом в диапазоне от 1 до 12. Каждое число это оценка по 12-ти бальной системе. Перевести эти оценки в 5-ти бальную систему, где двойка от 1 до 3 включительно, тройка от 4 до 6, четверка от 7 до 9, пятерка от 10 до 12. Пользуясь указателем на массив целых чисел, посчитать процент двоек, троек, четверок и пятерок. Результат изобразить графически с помощью диаграммы, например:
2: **********
3: ********************
4: ****************************************
5: ******************************
У меня есть несколько вопросов по решению, вопросы выделены "!///!"
Вот решение:
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
#include<windows.h>
#include<time.h>
#include<iostream>
 
#define BAR_MAX 10      //число символов для отображения 100% на экране
 
using namespace std;
 
int main()
{
        int i;                  //переменная цикла
        int N;                  //количество элементов в массиве
        int *Marks;             //массив оценок
        int Twos=0;             //количество двоек
        int Threes=0;   //количество троек
        int Fours=0;    //количество четверок
        int Fives=0;    //количество пятерок
        int NumStars;   //количество * для отображения % на диаграмме
        srand(time(NULL));      
        cout<<"Enter number of elements:"<<endl;
        cin>>N;
        Marks=new int[N];       
        cout<<"Marks in the 12th system:"<<endl;
        //заполняем массив отметок числами от 1 до 12
        for(i=0;i<N;i++) 
        {
                Marks[i]=rand()%12+1;
                cout<<Marks[i]<<" ";
        }
        cout<<endl<<"Marks in the 5th system:"<<endl;
        //переводим в систему 1-5
        for(i=0;i<N;i++)
        {
                if((Marks[i]>=1)&&(Marks[i]<=3)) Marks[i]=2;
                else if((Marks[i]>=4)&&(Marks[i]<=6)) Marks[i]=3;
                else if((Marks[i]>=7)&&(Marks[i]<=9)) Marks[i]=4;
                else Marks[i]=5;
                cout<<Marks[i]<<" ";
        }
        cout<<endl;     
        //собираем статистику
        i=0;
        while(i<N)  
        {
                switch(*Marks) !///! Что происходит внутри while и  switch, каким образом собирается статистика? Что на каком шаге происходит? И правильно ли это? 
                {
                        case 2: Twos++;break;
                        case 3: Threes++;break;
                        case 4: Fours++;break;
                        case 5: Fives++;break;
                }
                Marks++;
                i++;
        }
        //рисуем диаграмму   !///! Диаграм рисуется каким то очень странным "способом", как изменить диаграмму таким образом что бы 1% был одной звездочкой? (всего 100%)
        cout<<"2:";
        NumStars=Twos*BAR_MAX/N;
        for(i=0;i<NumStars;i++) cout<<"*";
        cout<<endl;
        cout<<"3:";
        NumStars=Threes*BAR_MAX/N;
        for(i=0;i<NumStars;i++) cout<<"*";
        cout<<endl;
        cout<<"4:";
        NumStars=Fours*BAR_MAX/N;
        for(i=0;i<NumStars;i++) cout<<"*";
        cout<<endl;
        cout<<"5:";
        NumStars=Fives*BAR_MAX/N;
        for(i=0;i<NumStars;i++) cout<<"*";
        cout<<endl;     
        getchar();
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2012, 12:41     Работа с динамической памятью через указатели. Загадочная ошибка.
Посмотрите здесь:

C++ Работа с динамической памятью!
C++ Работа с динамической памятью через указатели.
C++ Разобраться в принципе работы задачч. (Работа с динамической памятью через указатели. )
C++ Работа с динамической памятью через указатели. Загадочная ошибка.
строки: работа с динамической памятью, перегруженные конструкторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:06     Работа с динамической памятью через указатели. Загадочная ошибка. #2
Первое что вижу забыл освободить память в конце программы
C++
1
delete[] Marks;
И можно было сделать все в одном цикле

Добавлено через 7 минут
Диаграм рисуется каким то очень странным "способом", как изменить диаграмму таким образом что бы 1% был одной звездочкой? (всего 100%)
C++
1
#define BAR_MAX 100      //число символов для отображения 100% на экране
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
25.03.2012, 13:06  [ТС]     Работа с динамической памятью через указатели. Загадочная ошибка. #3
При "освобождении" памяти при запуске выходит ошибка.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:12     Работа с динамической памятью через указатели. Загадочная ошибка. #4
C++
1
 Что происходит внутри while и  switch, каким образом собирается статистика? Что на каком шаге происходит?
C++
1
 case 2: Twos++;break;
Если *Marks - двойка то кол-во двоек Twos увеличивается на один.
Вот только конструкция выглядит как-то неправильно, пробуй так
C++
1
2
3
4
5
6
7
8
9
10
11
12
      i=0;
        while(i<N)  
        {
                switch(*(Marks+i)) // !!!
                {
                        case 2: Twos++;break;
                        case 3: Threes++;break;
                        case 4: Fours++;break;
                        case 5: Fives++;break;
                }
                i++;
        }
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.03.2012, 13:13     Работа с динамической памятью через указатели. Загадочная ошибка. #5
Цитата Сообщение от Avazart Посмотреть сообщение
Первое что вижу забыл освободить память в конце программы
после таких строк освободить память будет проблематично.
Цитата Сообщение от Hqw33 Посмотреть сообщение
Marks++;
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:19     Работа с динамической памятью через указатели. Загадочная ошибка. #6
Мда интерестный способ, с потерей указателя на 0-й элемент
Возможно изначально было int ^Marks; ?
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
25.03.2012, 13:24  [ТС]     Работа с динамической памятью через указатели. Загадочная ошибка. #7
*Marks должен был быть указателем на массив целых чисел...
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:29     Работа с динамической памятью через указатели. Загадочная ошибка. #8
*Marks должен был быть указателем на массив целых чисел...
Он не указывает на сам массив, он указывает на его начало и так и должно быть
а запись Marks++ его смешает и каждый раз теряется один элемент массива
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
25.03.2012, 13:31  [ТС]     Работа с динамической памятью через указатели. Загадочная ошибка. #9
Можно ли это исправить без ординальных изменений?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:43     Работа с динамической памятью через указатели. Загадочная ошибка. #10
Я уже указал что надо изменить, пробавал?
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
25.03.2012, 13:48  [ТС]     Работа с динамической памятью через указатели. Загадочная ошибка. #11
Вроде бы все работает, правда звездочек не 100, а 98 (или 99) выходит, но это можно исправить банальным способом. Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 13:50     Работа с динамической памятью через указатели. Загадочная ошибка.
Еще ссылки по теме:

Ошибка с динамической памятью C++
Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод C++
C++ Работа с динамической памятью

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
25.03.2012, 13:50     Работа с динамической памятью через указатели. Загадочная ошибка. #12
Погрешность округления NumStars=Fives*BAR_MAX/N;
Yandex
Объявления
25.03.2012, 13:50     Работа с динамической памятью через указатели. Загадочная ошибка.
Ответ Создать тему
Опции темы

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