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

Операторы цикла, целочисленные типы данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
21.03.2010, 13:51     Операторы цикла, целочисленные типы данных #1
Задали задачку на циклические алгоритмы с кучей пояснений, но все равно похожего найти не могу в поиске((

С консоли вводятся целые числа в диапазоне ±32765 до прекращения ввода по клавише Esc. Количество вводимых чисел заранее неизвестно. Требуется подсчитать количество введенных чисел и вычислить среднюю сумму введенных чисел по правилу: если введенное число совершенное, то оно прибавляется к сумме, а если нет, то вычитается из суммы. Подсчитать количество совершенных и несовершенных чисел. Определить минимальное и максимальное из всех введенных чисел.
Массивы использовать нельзя.

Требования:
Интерфейс и вычисление суммы реализуются в главной функции Main(). Использовать операторы циклов for, do, while, использовать goto нельзя. Количество вводимых чисел не задается, а определяется в процессе ввода. Для проверки, что введенное число обладает заданным свойством разработать функцию bool Check(int). Разработать функцию bool InputNumber(int&), которая вводит целое число посимвольно и возвращает True, если пользователь нажал Enter, или возвращает False, если пользователь нажал Esc. Обрабатываемые символы: + – 0 1 2 3 4 5 6 7 8 9 Delete Enter Esc. Проверять на диапазон, на положение знака, на количество цифр.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
22.03.2010, 14:41     Операторы цикла, целочисленные типы данных #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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream.h>
#include <conio.h>
#define ESC 27
#define ENTER 13
#define BACKSPACE 8
#define UPPER_RANGE 32765
#define LOWER_RANGE -32765
#include <vector.h>
//---------------------------------------------------------------------------
struct CDigitList
{
        CDigitList * Next;
        int Digit;
        int Num;
};
CDigitList * DigitList;
vector <char> CharacterVector;
//---------------------------------------------------------------------------
CDigitList * GetDigitFromList(int Index)
{
        CDigitList * TempDigit = DigitList;
        while(TempDigit)
        {
                if(TempDigit->Num==Index)
                {
                        return TempDigit;
                }
                TempDigit=TempDigit->Next;
 
        }
        return NULL;
}
//---------------------------------------------------------------------------
void AddDigitToList(int NewDigit)
{
        int Num=0;
        CDigitList * NewEllement = new CDigitList;
        CDigitList * TempDigit = DigitList;
        if(DigitList)
        {
                Num=DigitList->Num;
                while(TempDigit->Next)
                {
                        TempDigit=TempDigit->Next;
                        Num=TempDigit->Num;
                }
                TempDigit->Next=NewEllement;
                TempDigit=NewEllement;
        }
        else
        {
                Num=0;
                DigitList=TempDigit=NewEllement;
        }
        if(TempDigit)
        {
                TempDigit->Next=NULL;
                TempDigit->Num=Num+1;
                TempDigit->Digit=NewDigit;
        }
}
//---------------------------------------------------------------------------
bool Check(int RecDigit)
{
        int Summ=0;
        for(int i=1;i<RecDigit;i++)
        if(!(RecDigit%i))
        {
                Summ+=i;
        }
        return Summ==RecDigit;
}
//---------------------------------------------------------------------------
bool InputNumber(int&EnteredDigit)
{
        char PressedButton;
 
        do
        {
                PressedButton=getch();
                clrscr();
                if(PressedButton==BACKSPACE)
                {
                        CharacterVector.erase(&CharacterVector[CharacterVector.size()-1]);
                }
                else
                {
                        if(PressedButton!=ESC)
                        {
                                CharacterVector.push_back(PressedButton);
 
                        }
                }
                for(int i=0;i<(int)CharacterVector.size();i++)
                        printf("%c",CharacterVector[i]);
                if(PressedButton==ENTER)
                {
                        EnteredDigit = atoi(&CharacterVector[0]);
                        break;
                }
 
        }while(PressedButton!=ESC);
        CharacterVector.clear();
        return PressedButton!=ESC;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
        int EnteredDigit=0;
        CharacterVector.clear();
        int PerfectSumm=0;
        int MaxValue=LOWER_RANGE;
        int MinValue=UPPER_RANGE;
        bool IsEnter;
        int NumberofDigits=0;
        int NumberOfPerfectDigits=0;
        int NumberOfNotPerfectDigits=0;
        while(true)
        {
                IsEnter=InputNumber(EnteredDigit);
                if(IsEnter)
                {
                        if(EnteredDigit>UPPER_RANGE||EnteredDigit<LOWER_RANGE)
                        {
                                printf("OUT OF RANGE!!!\n");
                                continue;
                        }
                        printf("New Digit Added: %d",EnteredDigit);
                        AddDigitToList(EnteredDigit);
                        NumberofDigits++;
                }
                else
                        break;
        }
        clrscr();
        for(int i=1;i<=NumberofDigits;i++)
        {
                int CurrentValue=GetDigitFromList(i)->Digit;
                if(Check(CurrentValue))
                {
                        if(CurrentValue>MaxValue)
                                MaxValue=CurrentValue;
                        if(CurrentValue<MinValue)
                                MinValue=CurrentValue;
                        PerfectSumm+=CurrentValue;
 
                        NumberOfPerfectDigits++;
                }
                else
                {
                        PerfectSumm-=CurrentValue;
                        NumberOfNotPerfectDigits++;
                }
        }
        if(NumberOfPerfectDigits)
        {
                printf("Amount of Perfect digits: %d\n",NumberOfPerfectDigits);
                printf("SUMM of Perfect digits: %d\n",PerfectSumm);
                printf("MAX Perfect digit: %d\n",MaxValue);
                printf("MIN Perfect digit: %d\n",MinValue);
        }
        printf("Amount of Not-Perfect digits: %d\n",NumberOfNotPerfectDigits);
        getch();
 
        if(NumberofDigits)
        {
                for(int i=NumberofDigits;i>0;i--)
                        delete GetDigitFromList(i)->Next;
                delete GetDigitFromList(1);
        }
        return 0;
}
//---------------------------------------------------------------------------
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
22.03.2010, 15:50  [ТС]     Операторы цикла, целочисленные типы данных #3
спасибо))) вечером попробую!! =))
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
04.04.2010, 00:36  [ТС]     Операторы цикла, целочисленные типы данных #4
Зоти Сергей
программа считает все числа, кроме 1, совершенными, но, согласно http://ru.wikipedia.org/wiki/%D0%A1%...81%D0%BB%D0%B0 нужно вычитать все из суммы все числа, кроме совершенных...

Добавлено через 3 минуты
есть пример для чисел Фибоначчи:
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
93
94
95
96
97
98
#include<iostream>
#include<conio.h>
using namespace std;
 
/*
Функция bool Check(int num);
-------------------------------------------
Аргументы:
    int num: проверяемое число
-------------------------------------------
Возвращает true, если данное число num
является числом Фибоначчи и false, 
если не является
*/
bool Check(int num) {
    int i=0, g=1, k=0, z=-1;
 // i - предыдущее число Фибоначчи, g - текущее число, k - временная переменная
    while(g+i<=num || g+i<=-1*num) {
        if(g+i==num || z*(g+i)==num) return true;
        k=g;
        g+=i;
        i=k;
        z*=-1;
    }
    return false;
}   
 
bool Input(short &num) {
    char tmp;
    short minus_flag=1;
    num=0;
    
    while(tmp=getch()) {
        switch(tmp) {
            case '0': 
            case '1':
            case '2':
            case '3':
            case '4': 
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                if(num*10+(int)tmp-48<=SHRT_MAX && -1*(num*10+(int)tmp-48)>=SHRT_MIN) {
                    num*=10;
                    num+=(int)tmp-48;
                    printf("%c", tmp);
                }
                break;
            case '-': 
                if(num==0) {
                    minus_flag=-1;
                    printf("%c", tmp);
                }
                break;
            case 27:
                num*=minus_flag;
                printf("\n");
                return false;
            case 13: 
                num*=minus_flag;
                printf("\n");
                return true;
        }
    }
}
 
void main(void) {   
    short num;
    int average=0;
    short qNum=0, min=SHRT_MAX, max=SHRT_MIN, qFib=0; 
 
    printf("Input numbers over Enter. Press Esc for complete\n");
 
    while(Input(num)==true) {
        qNum++;
        if(num>=max) max=num;
        if(num<=min) min=num;
        if(Check(num)) {
            average-=num;
            qFib++;
        }
        else average+=num;
    }   
    if(qNum!=0)
    {
        average/=qNum;
        printf("Numbers: %d\n", qNum);
        printf("Fibonacci: %d\n", qFib);
        printf("Average amount: %d\n", average);
        printf("Max number: %d\n", max);
        printf("Min number: %d\n", min);
    }
    else printf("You did not input numbers\n\n");
 
    system("pause");
}

но здесь функция bool InputNumber(int&) реализована по другому(

Добавлено через 1 минуту
подскажите как переделать плииииз!!

Добавлено через 3 минуты
сумма здесь не среднее арифметическое а просто сумма совершенных чисел минус обычные числа
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
04.04.2010, 01:16     Операторы цикла, целочисленные типы данных #5
Программа не считает все числа совершенными кроме 1
Совершенное число — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).
например 6, 28
6=(1 + 2 + 3 = 6), 28 =1 + 2 + 4 + 7 + 14
Проверьте. Введите числа 6,28
потом введите 7,8
После, нажмите ESC.
Получите макс. мин совершенных и сумму. чила 7 и 8 к совершенным не относятся.
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
04.04.2010, 12:45  [ТС]     Операторы цикла, целочисленные типы данных #6
Вот что получается, текст программы не меняла... в результате sum складывает все числа
Миниатюры
Операторы цикла, целочисленные типы данных  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2010, 19:14     Операторы цикла, целочисленные типы данных
Еще ссылки по теме:

ОПЕРАТОРЫ ЦИКЛА C++
C++ операторы цикла
Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? C++
C++ Операторы цикла и операторы передачи управления
Операторы языка С++: операторы цикла (исправьте программу) C++

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

Или воспользуйтесь поиском по форуму:
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
04.04.2010, 19:14  [ТС]     Операторы цикла, целочисленные типы данных #7
сделала все))
Yandex
Объявления
04.04.2010, 19:14     Операторы цикла, целочисленные типы данных
Ответ Создать тему
Опции темы

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