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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
#1

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

21.03.2010, 13:51. Просмотров 1674. Ответов 6
Метки нет (Все метки)

Задали задачку на циклические алгоритмы с кучей пояснений, но все равно похожего найти не могу в поиске((

С консоли вводятся целые числа в диапазоне ±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. Проверять на диапазон, на положение знака, на количество цифр.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2010, 13:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операторы цикла, целочисленные типы данных (C++):

Операторы цикла и вывод данных - C++
Условие: Напечатать таблицу значений функции f(x) и суммы S(x) в виде таблицы. Х изменяется в диапазоне от a до b с шагом h. Вычисление...

«Языки и технологии программирования» «Операторы цикла. Условные операторы» - C++
Не получается сделать что бы программа выводила все значения в промежутке, она выводит только одно. условия | ((z^3)+sin...

Операторы языка С++: операторы цикла (исправьте программу) - C++
#include <iostream> #include <cstdlib> #include <cmath> using namespace std; int main() { int a,n; float y,x; cout<<...

Операторы принятия решения и операторы цикла. - C++
Пожалуйста, помогите. Нужно срочно сделать задания: 1)Ввести с клавиатуры три символа sym1, sym2, sym3. Поменять их значения таким...

Операторы цикла и операторы передачи управления - C++
Вычислить сумму ряда S с погрешностью эпсилон, задаваемой с клавиатуры. Вывести количество итераций, сделанных при вычислении. Если...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? - C++
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

6
Зоти Сергей
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;
}
//---------------------------------------------------------------------------
1
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
22.03.2010, 15:50  [ТС] #3
спасибо))) вечером попробую!! =))
0
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 минуты
сумма здесь не среднее арифметическое а просто сумма совершенных чисел минус обычные числа
0
Зоти Сергей
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 к совершенным не относятся.
0
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
04.04.2010, 12:45  [ТС] #6
Вот что получается, текст программы не меняла... в результате sum складывает все числа
0
Миниатюры
Операторы цикла, целочисленные типы данных  
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
04.04.2010, 19:14  [ТС] #7
сделала все))
0
04.04.2010, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2010, 19:14
Привет! Вот еще темы с ответами:

Условные операторы.Операторы цикла - C++
1)По номеру y(y&gt;0) некоторого года определить с-номер его столетия(учесть что к примеру началом 20 столетия был 1901 а не 1900 год.)...

Операторы цикла - C++
Помогите с кодом: //--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #include...

операторы цикла - C++
написать программу для решения уравнений: http://s2.ipicture.ru/uploads/20110601/A52Swkt6.png ...

Операторы цикла (while, do...while) - C++
Вводится точность e. Вычислить сумму ряда (LR2). Вычисления продолжать до тех пор, пока очередное слагаемое не станет меньше e.


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

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

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