Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
#1

Задача из учебника Дейтела Харви - C++

08.07.2012, 14:06. Просмотров 1329. Ответов 18
Метки нет (Все метки)

Задача: используйте одномерный массив для решения слудующей задачи. прочитайте 20 чисел, каждое из которых находится в диапазоне от 10 до 100 включительно. После того как прочли очередное число, напечатайте его, но только в том случае если оно не дублирует ранее прочитанные числа. Используйте наименьший возможный массив для решения этой задачи
http://www.cyberforum.ru/cpp-beginners/thread1091712.html

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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
int search (const int [], int, int);
 
int main()
{
    int array [] = {0};
    int counter=0;
    int arraySize=0, i=0;
    do {
        counter++;
        i++;
        cout<<"\n";
        cin>>array[i];
        if ( array[i] >=10 && array[i] <=100 ) {
            if ( search(array, array[i], i) == 1 ) {
                --i;
            }
            else {
                cout<<array[i];
                arraySize++;
            }
        }
        else {
            counter--;
            i--;
        }
    } while ( counter != 20 );
    
    cout<<endl<<arraySize; 
}
 
int search ( const int array[], int key, int size)
{
    for (int i=0; i<size; i++) {
        if ( array[ i ] == key ) {
            return 1;
        }
    }
}
Работает если в последовательности есть одинаковые чиса, но если все числа будут различны выдаёт ошибку...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2012, 14:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача из учебника Дейтела Харви (C++):

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

Задача из книги Дейтела "Квадрат"
Здравствуйте,В задаче использовать управляющие структуры(лог.операции, циклы)...

Из Дейтела (4.20)
Привет всем!!!! Ребята, есть задачка из Дейтела (4.20) для зачета, но совсем в...

Пример из Дейтела
Помоготе разобрать пример из Дейтела, #include&lt;iostream&gt; #include&lt;string&gt;...

Классы из Дейтела
Сейчас читаю книгу Дейтела (Как программировать на С++ (5-е издание, 2008) ),...

18
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 14:37 #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
#include <iostream.h>
 
int search (const int [], int, int);
 
int main()
{
    int array [20];
    int arraySize=0, z;
 
    while (1)
    {
        if (arraySize >= 20) break;
 
        cout << "Enter number: ";
        
        cin >> z;
        
        if ( z >=10 && z <= 100 )
        {
            if ( search(array,z,arraySize) < 0 ) cout << z << endl;
 
            array[arraySize++]=z;
 
        }
    } 
 
    return 0;
 
}
 
int search ( const int array[], int key, int size)
{
    for (int i=0; i<size; i++) 
        if ( array[i] == key ) return 1;
    return -1;   
}
0
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 14:45  [ТС] #3
Цитата Сообщение от Catstail Посмотреть сообщение
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
#include <iostream.h>
 
int search (const int [], int, int);
 
int main()
{
    int array [20];
    int arraySize=0, z;
 
    while (1)
    {
        if (arraySize >= 20) break;
 
        cout << "Enter number: ";
        
        cin >> z;
        
        if ( z >=10 && z <= 100 )
        {
            if ( search(array,z,arraySize) < 0 ) cout << z << endl;
 
            array[arraySize++]=z;
 
        }
    } 
 
    return 0;
 
}
 
int search ( const int array[], int key, int size)
{
    for (int i=0; i<size; i++) 
        if ( array[i] == key ) return 1;
    return -1;   
}
У тебя тут массив на 20 элементов, а нужно использовать наименьший массив
0
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 15:04 #4
Но описать придется все равно 20-элементый массив. Поскольку, если ввести 20 различных чисел, то как раз 20 элементов и понадобится...

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
#include <iostream.h>
 
int search (const int [], int, int);
 
int main()
{
    int array [20];
    int arraySize=0, z;
 
    while (1)
    {
        if (arraySize >= 20) break;
 
        cout << "Enter number: ";
        
        cin >> z;
        
        if ( z >=10 && z <= 100 )
        {
            if ( search(array,z,arraySize) < 0 ) 
              {
                 cout << z << endl;
                 array[arraySize++]=z;
               }
 
        }
    } 
 
    return 0;
 
}
 
int search ( const int array[], int key, int size)
{
    for (int i=0; i<size; i++) 
        if ( array[i] == key ) return 1;
    return -1;   
}
0
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 16:44  [ТС] #5
А есть идеи по уменьшению этого массива?
0
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 18:07 #6
Нет и быть не может (20-и различным числам нужно 20 элементов)
0
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 20:36 #7
ну как минимум двадцатому числу место в массиве не нужно, можно обойтись девятнадцатью

Добавлено через 2 минуты
к тому же, у нас известен диапазон чисел, на каждое число достаточно 7 бит, так что для 19 таких чисел будет достаточно 17 байт (раз уж в задаче стоит требование по уменьшению размера массива), вместо 80 байт, соответствующих int array[20];
0
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 20:49 #8
Да, это так. Принимаю. Достаточно 19 элементов. Что же до длины, то можно использовать тип char (это сэкономит память), но все равно придется выделять не менее 19-и элементов.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 20:56 #9
А можно в одну переменную записывать несколько чисел. Тогда главное условие задачи будет выполнено. Но извращение то еще.
0
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 21:01  [ТС] #10
Решил не заморачиваться и сделал так:
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
int search (const int [], int, int);
 
int main()
{
    const int arraySize=20;
    int array [arraySize];
    int counter=0;
    for (int i=0; i<arraySize; i++) {
        cout<<"Enter number: ";
        cin >> array [ i ];
        if (array [i] >=10 && array [ i ] <=100) {
            if ( search(array, array [ i ], i ) != 1 ) {
                cout<< array [ i ]<<endl;
            }
        }
        else {
            cout<<"Error\n";
            i--;
        }
    }
    for (int i=0; i<arraySize; i++) {
        cout<< array[i]<<' ';
    }
}
 
int search ( const int array[], int key, int size)
{
    for (int i=0; i<size; i++) 
        if ( array[i] == key ) return 1;
    return -1;   
}
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 21:06 #11
Цитата Сообщение от Flexoid1 Посмотреть сообщение
а если объявить массив на 10 элементов и в одном числе хранить 2?
Можно объявить на 3 элемента.
1
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 21:43  [ТС] #12
Цитата Сообщение от yekka Посмотреть сообщение
ну как минимум двадцатому числу место в массиве не нужно, можно обойтись девятнадцатью

Добавлено через 2 минуты
к тому же, у нас известен диапазон чисел, на каждое число достаточно 7 бит, так что для 19 таких чисел будет достаточно 17 байт (раз уж в задаче стоит требование по уменьшению размера массива), вместо 80 байт, соответствующих int array[20];
А как это реализовать?
0
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 21:57 #13
Цитата Сообщение от Flexoid1 Посмотреть сообщение
А как это реализовать?
забей на этот способ, он не самый эффективный.
на самом деле для этой задачи нужен всего лишь 91 бит, т.е. достаточно 12 чаров или 3 инта
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 22:03 #14
Цитата Сообщение от yekka Посмотреть сообщение
нужен всего лишь 91 бит
Под сколько чисел?
0
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 22:05 #15
Цитата Сообщение от soon Посмотреть сообщение
Под сколько чисел?
под числа от 10 до 100, нужно просто помечать одним битом, какое из этих чисел встречалось, а какое нет.
а какая у нас будет выборка, 20 чисел или 20 000 000 чисел, при таком подходе уже не важно
0
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 22:11 #16
Нет, ребята... 91 бита не хватит. В самом худшем случае придется хранить 19 чисел: 80,81,...,99
Каждое из них требует 7 бит. Итого 7*19=133 бита. Но не думаю, чтобы элементарная задача предполагала такое иезуитское решение. О практической пользе я уже и не говорю.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 22:16 #17
Catstail, не надо хранить числа. Можно хранить в битах использование/неиспользование того или иного числа. Пока что у yekka самый оптимальный вариант(по количеству занимаемой памяти)
1
Catstail
Модератор
23528 / 11636 / 2034
Регистрация: 12.02.2012
Сообщений: 18,976
08.07.2012, 22:19 #18
Да, согласен.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 07:51 #19
Как насчёт реализации с битовым учётом?
0
09.07.2012, 07:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 07:51
Привет! Вот еще темы с решениями:

ответы на книгу Дейтела
Здравствуйте! Подскажите,где можно скачать ответы на задачи из учебника...

Самоучитель от Дейтела врет?
Почему в самоучителе по С++ от Дейтела Х, программа, выводящая текст...

Разбить по файлам пример из Дейтела
Хочу разбить по файлам пример из книги Дейтела. Что куда сохранять!? Пожалуйсто...

Где найти примеры задач из книги Дейтела по C++
Скачал книгу Дейтела на C++ не могу найти примеры задач, мб есть у кого?


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

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

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