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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 14:06     Задача из учебника Дейтела Харви #1
Задача: используйте одномерный массив для решения слудующей задачи. прочитайте 20 чисел, каждое из которых находится в диапазоне от 10 до 100 включительно. После того как прочли очередное число, напечатайте его, но только в том случае если оно не дублирует ранее прочитанные числа. Используйте наименьший возможный массив для решения этой задачи

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;
        }
    }
}
Работает если в последовательности есть одинаковые чиса, но если все числа будут различны выдаёт ошибку...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2012, 14:06     Задача из учебника Дейтела Харви
Посмотрите здесь:

C++ Из Дейтела (4.20)
C++ Хто учил С++ по книге «Как программировать на С++ »авторы:Харви Дэйтэл, Пол Дэйтэл зайдите...
Классы из Дейтела C++
C++ Самоучитель от Дейтела врет?
C++ ответы на книгу Дейтела
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
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;   
}
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 элементов, а нужно использовать наименьший массив
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
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;   
}
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 16:44  [ТС]     Задача из учебника Дейтела Харви #5
А есть идеи по уменьшению этого массива?
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
08.07.2012, 18:07     Задача из учебника Дейтела Харви #6
Нет и быть не может (20-и различным числам нужно 20 элементов)
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 20:36     Задача из учебника Дейтела Харви #7
ну как минимум двадцатому числу место в массиве не нужно, можно обойтись девятнадцатью

Добавлено через 2 минуты
к тому же, у нас известен диапазон чисел, на каждое число достаточно 7 бит, так что для 19 таких чисел будет достаточно 17 байт (раз уж в задаче стоит требование по уменьшению размера массива), вместо 80 байт, соответствующих int array[20];
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
08.07.2012, 20:49     Задача из учебника Дейтела Харви #8
Да, это так. Принимаю. Достаточно 19 элементов. Что же до длины, то можно использовать тип char (это сэкономит память), но все равно придется выделять не менее 19-и элементов.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 20:56     Задача из учебника Дейтела Харви #9
А можно в одну переменную записывать несколько чисел. Тогда главное условие задачи будет выполнено. Но извращение то еще.
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;   
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 21:06     Задача из учебника Дейтела Харви #11
Цитата Сообщение от Flexoid1 Посмотреть сообщение
а если объявить массив на 10 элементов и в одном числе хранить 2?
Можно объявить на 3 элемента.
Flexoid1
5 / 5 / 0
Регистрация: 08.07.2012
Сообщений: 20
08.07.2012, 21:43  [ТС]     Задача из учебника Дейтела Харви #12
Цитата Сообщение от yekka Посмотреть сообщение
ну как минимум двадцатому числу место в массиве не нужно, можно обойтись девятнадцатью

Добавлено через 2 минуты
к тому же, у нас известен диапазон чисел, на каждое число достаточно 7 бит, так что для 19 таких чисел будет достаточно 17 байт (раз уж в задаче стоит требование по уменьшению размера массива), вместо 80 байт, соответствующих int array[20];
А как это реализовать?
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 21:57     Задача из учебника Дейтела Харви #13
Цитата Сообщение от Flexoid1 Посмотреть сообщение
А как это реализовать?
забей на этот способ, он не самый эффективный.
на самом деле для этой задачи нужен всего лишь 91 бит, т.е. достаточно 12 чаров или 3 инта
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 22:03     Задача из учебника Дейтела Харви #14
Цитата Сообщение от yekka Посмотреть сообщение
нужен всего лишь 91 бит
Под сколько чисел?
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
08.07.2012, 22:05     Задача из учебника Дейтела Харви #15
Цитата Сообщение от soon Посмотреть сообщение
Под сколько чисел?
под числа от 10 до 100, нужно просто помечать одним битом, какое из этих чисел встречалось, а какое нет.
а какая у нас будет выборка, 20 чисел или 20 000 000 чисел, при таком подходе уже не важно
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
08.07.2012, 22:11     Задача из учебника Дейтела Харви #16
Нет, ребята... 91 бита не хватит. В самом худшем случае придется хранить 19 чисел: 80,81,...,99
Каждое из них требует 7 бит. Итого 7*19=133 бита. Но не думаю, чтобы элементарная задача предполагала такое иезуитское решение. О практической пользе я уже и не говорю.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 22:16     Задача из учебника Дейтела Харви #17
Catstail, не надо хранить числа. Можно хранить в битах использование/неиспользование того или иного числа. Пока что у yekka самый оптимальный вариант(по количеству занимаемой памяти)
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
08.07.2012, 22:19     Задача из учебника Дейтела Харви #18
Да, согласен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 07:51     Задача из учебника Дейтела Харви
Еще ссылки по теме:

C++ Задача из книги Дейтела "Шахматная доска"
C++ Задача из книги Дейтела "Квадрат"
Задача из книги Дейтела "Ромб" C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 07:51     Задача из учебника Дейтела Харви #19
Как насчёт реализации с битовым учётом?
Yandex
Объявления
09.07.2012, 07:51     Задача из учебника Дейтела Харви
Ответ Создать тему
Опции темы

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