Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 12:41   #1
Hqw33
 
Регистрация: 25.03.2012
Сообщений: 5
По умолчанию Работа с динамической памятью через указатели. Загадочная ошибка.

Пишу в 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: ******************************
У меня есть несколько вопросов по решению, вопросы выделены "!///!"
Вот решение:
Код:
#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();
   }
Hqw33 вне форума Ответить с цитированием
Старый 28.03.2012, 18:20   #2
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Вместо этого:
Цитата:
Сообщение от Hqw33 Посмотреть сообщение
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++;
}
}
[/CODE]
Вот так:
Код:
for(int i = 0; i<n; i++)
         {
                switch(Marks[i])
                {
                        case 2: Twos++;break;
                        case 3: Threes++;break;
                        case 4: Fours++;break;
                        case 5: Fives++;break;
                }
         }
rmv240899 вне форума Ответить с цитированием
Старый 28.03.2012, 18:42   #3
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Ещё я вижу ошибки в расчетах, но пока не знаю как их исправить...
rmv240899 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод динамической матрицы через указатели ShockTrooper Помощь студентам 2 27.02.2012 00:02
Списки (Си). Проблема с динамической памятью. hak555 Помощь студентам 0 18.12.2011 21:20
ошибка в работе с динамической памятью thrashkid Общие вопросы C/C++ 8 30.06.2011 00:48
Работа с ListBox и Edit и динамической памятью Serebah Помощь студентам 5 19.11.2010 13:41