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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
#1

Нужен алгоритмом по вставлению числа в массив - C++

17.06.2012, 03:16. Просмотров 1108. Ответов 27
Метки нет (Все метки)

Помогите...
Дана последовательность действительный чисел A1 <= A2, <= ... An. Вставить действительно число b в неё так, чтобы последовательность осталась неубывающей.
Есть код. Нужен сам алгоритм по вставлению числа в массив. Уже несколько дней пытаюсь найти ответ.

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
#include <iostream>
using namespace std;
 
int main()
{
   int n, a[n], b; 
    cout << "Введите количество элементов в массиве" << endl;
   cin >> n;
    cout << "Введите b" << endl;
   cin >> b;
    cout << "Введите значение элементов" << endl;
   for (int i = 0; i < n; i++)
    cin >> a[i]; 
   for (int i = 0; i < n; i++)  
    cout << a[i] << " ";
   for (int i = 0; i < n; i++)
    for (int j = i; j < n; j++) 
     while (a[i] > a[j])
     { 
       cout << "Введите значения последовательно" << endl;
       for (int i = 0; i < n; i++)
       cin >> a[i];
     }
    cout << endl;
    // алгоритм вставки
    
system("PAUSE >> null");    
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 03:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен алгоритмом по вставлению числа в массив (C++):

Конвертор десятичного числа в шестнадцатиричное с алгоритмом преобразования - C++
Конвертор десятичного числа в шестнадцатиричное с алгоритмом преобразования (без простого вывода числа в шестнадцатиричной)... помогите...

Рекурсия (функция определения НОД (наибольшего общего делителя) числа алгоритмом Евклида) - C++
Доброго времени суток. Есть определенная функция определения НОД(наибольшего общего делителя) числа алгоритмом Евклида: int nod(int a,...

нужен тип целого числа для числа 19!= 121 645 100 408 832 000 - C++
Нужно посчитать сумму цифр целого положительного числа. double summacifr(double chislo) { double summa=0; while(chislo) ...

Ввести в программу строку (числа, латиница), считать только числа, записать числа в массив - C++
Нужна помощь! Срочно! Нужно ввести в программу строку (числа, латиница), считать только числа, записать числа в массив. Помогите,...

Нужен исходник программы для нахождения кротчайшего пути алгоритмом Флойда - Delphi
Всем привет. Может у кого-нибудь есть исходник программы для нахождения кротчайшего пути алгоритмом Флойда.

Шифрование алгоритмом моноалфавитной подстановки и Алгоритмом Цезаря - Visual Basic
Здравствуйте, помогите исправить код чтобы выводилось одинаково зашифрованное сообщение, и методом моноалфавитной подстоновкой и методом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,666
Записей в блоге: 17
19.06.2012, 01:01 #16
Как я понял последние элементы в массиве должны теряться после вставки?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
19.06.2012, 01:19 #17
Цитата Сообщение от Avazart Посмотреть сообщение
Как я понял последние элементы в массиве должны теряться после вставки?
Зачем теряться? Между прочим, в самом задании про массивы ни слова. Там последовательность. Почему размер массива, хранящего последовательность, обязательно должен быть равен длине последовательности мне совершенно не понятно.
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.06.2012, 01:30  [ТС] #18
dima koz, Спасибо огромное. Протестил все варианты, всё работает.

Добавлено через 1 минуту
Avazart, Пока что с моими знаниями я не могу до конца разобрать ваш код, но всё равно спасибо.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
19.06.2012, 01:33 #19
Ну и ещё один
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
#include <iostream>
 
using namespace std;
 
int main()
{
    const unsigned ARRAY_SIZE = 100;
    unsigned n;
    int a[ARRAY_SIZE], b; 
    do {
        cout << "Введите количество элементов в массиве от 1 до " << ARRAY_SIZE-1 << endl;
        if (!(cin >> n))
        {
            cerr << "FATAL: Input error" << endl;
            return 1;
        }
    } while (n < 1 || n >= ARRAY_SIZE);
    
    cout << "Введите b" << endl;
    cin >> b;
 
    cout << "Введите значение элементов" << endl;
    for (unsigned i = 0; i < n; i++)
        cin >> a[i]; 
    cout << endl;
 
    if (!cin)
    {
        cerr << "FATAL: Input error" << endl;
        return 1;
    }
 
    // алгоритм вставки
    unsigned idx = n;
    for (; idx > 0 && a[idx-1] > b; --idx)
        a[idx] = a[idx-1];
    a[idx] = b;
 
    cout << "New sequence:\n";
    for (unsigned i = 0; i <= n; i++)
        cout << a[i] << ' ';
    cout << endl; 
 
    return 0;
}
2
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.06.2012, 01:46  [ТС] #20
LittleGirl, Всё работает, но опять же до того момента, когда я пытаюсь вставить 11 в последовательность arr[10] = {1,2,3,4,5,6,7,8,9,10}. В итоге 11 стоит между 2 и 3.
Спасибо за код

Добавлено через 4 минуты
grizlik78, Да тоже абсолютно работающий код. Спасибо!
0
Alex330
118 / 118 / 4
Регистрация: 12.06.2012
Сообщений: 130
19.06.2012, 02:27 #21
Леонид посмотрите мой код пожалуйста. Пишу под линуксом, возможно нужны другие библиотеки. я тоже только учусь. Буду рад в дальнейшем разбирать подобные примеры. А что за задачник?
C++ (Qt)
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 namespace std;
int main()
{
    const int n = 10;
    int arr[n], b;
    //формируем последовательность
    for (int i= 1; i<n+1; i ++) 
        arr[i-1]= i;
 
    //вводим число
    cout <<"Введите число от 1 до "<<n <<" ";
    cin >> b;
 
    //создаем итоговый массив для последовательности + введенное число
    int arrRezault[n+1]; 
 
    // заполняем итоговый массив
    bool valueInserted = false;
    for (int i= 0; i<n; i ++)
    {
        if (valueInserted)
          arrRezault[i+1] = arr[i];
       else
         if (arr[i] >= b)
           {
              valueInserted=true;
              arrRezault[i] = b; 
              arrRezault[i+1] = arr[i];
           }
           else
             arrRezault[i] = arr[i];
    }
         
    if (!valueInserted)
        arrRezault[n+1]=b;      
    
    //Выводим последовательность
    for (int i= 0; i<n+1; i ++) 
        cout <<"arrRezault["<<i <<"]="<< arrRezault[i]<<"\n";
    
    return 0;
}
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
19.06.2012, 02:47 #22
Alex330, в строке 36 должно быть
C++
1
arrRezault[n] = b;
1
Alex330
118 / 118 / 4
Регистрация: 12.06.2012
Сообщений: 130
19.06.2012, 07:23 #23
спасибо, grizlik78 - все верно, должно быть arrRezault[n] = b;
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.06.2012, 10:34  [ТС] #24
Alex330, Поскольку массив заполняется уже изначально 10 значениями
C++
1
2
for (int i= 1; i<n+1; i ++) 
 arr[i-1]= i;
То получается что когда я хочу вставить 5 в эту последовательность от 1 до 10, он её просто дублирует так, как она уже есть и на выходе у нас массив {1,2,3,4,5,5,6,7,8,9,10}. Если вставляю 11 в последовательность, то на выходе у нас {1,2,3,4,5,6,7,8,9,10,0}, а не {1,2,3,4,5,6,7,8,9,10,11}. Единственное что правильно вставляет так это 0 в начало последовательность, на выходе {0,1,2,3,4,5,6,7,8,9,10}
Что касается задач, они у меня не из сборника, они у меня просто распечатаны на А4, их тут где-то 200 с лишним. На одномерные и двумерные массивы.
1
Alex330
118 / 118 / 4
Регистрация: 12.06.2012
Сообщений: 130
19.06.2012, 13:18 #25
Цитата Сообщение от Leonman Посмотреть сообщение
Alex330 Если вставляю 11 в последовательность, то на выходе у нас {1,2,3,4,5,6,7,8,9,10,0}, а не {1,2,3,4,5,6,7,8,9,10,11}
А это с учетом замечания что, в 36 строке кода должно быть arrRezault[n] = b вместо arrRezault[n+1] = b ?
Именно этот фрагмент кода отвечает за указанный случай.
Вечером проверю еще раз и выложу исправленный вариант.

Хотя по красоте мой алгоритм далек от этого:

C++ (Qt)
1
2
3
4
5
// алгоритм вставки
    unsigned idx = n;
    for (; idx > 0 && a[idx-1] > b; --idx)
        a[idx] = a[idx-1];
    a[idx] = b;
Перебор массива с конца
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.06.2012, 14:05  [ТС] #26
Alex330, С учётом arrRezault[n] = b вместо arrRezault[n+1] = b 11 вставляется правильно, на выходе {1,2,3,4,5,6,7,8,9,10,11}.
Я хотел ещё спросить что означает unsigned перед idx = n;
1
Alex330
118 / 118 / 4
Регистрация: 12.06.2012
Сообщений: 130
19.06.2012, 14:15 #27
Для указания типа unsigned int достаточно привести только ключевое слово unsigned , в общем случае unsigned - модификатор типа, указывает на то, что число беззнаковое.
Например:
переменная типа short может применять значения от -32768 до 32767,
а переменная типа unsigned short может применять значения от 0 до 65535
и та и другая переменная используют 16 бит для хранения чисел.

В данном примере unsigned idx = n; - создание переменной idx типа unsigned int - беззнаковое целое с начальным значением n.
Могу ошибаться, но по-моему "величина" int (т.е. сколько разрядов она использует) зависит от параметров ОС, на 32 битных это наверное 32, у меня наверное 64.
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.06.2012, 21:32  [ТС] #28
Alex330, Спасибо более мение стало понятно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2012, 21:32
Привет! Вот еще темы с ответами:

Отсортировать массив алгоритмом выбора, Шелла, проиллюстрировать библиотекой Граф - Turbo Pascal
Люди, выручайте!!!! Ребенку задали задание по информатике, родители в шоке!!!! Задача: Дается массив из n чисел, его нужно отсортировать...

Найти количество сложений для вычисления n-го числа Фибоначчи рекурсивным и обычным алгоритмом. - C (СИ)
Найти количество сложений для вычисления n-го числа Фибоначчи рекурсивным и обычным алгоритмом. Результаты выдать в виде таблицы. ...

По заданному X нужно в массив записать следующие числа записанные в массив раздельно по каждой цифре числа - C (СИ)
Помогите сделать следующее или посоветуйте как сделать это иначе. Пример: Пусть X=3. Мне по заданному X нужно в массив записать...

JSON массив из PHP, получаю объект, а нужен массив - jQuery
Всем привет! Формирую массив на стороне сервера, массив - результат выборки из БД. Передаю его на клиент. $list = $cat -&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.06.2012, 21:32
Ответ Создать тему
Опции темы

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