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

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

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

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

17.06.2012, 03:16. Просмотров 1144. Ответов 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
Здравствуйте, помогите исправить код чтобы выводилось одинаково зашифрованное сообщение, и методом моноалфавитной подстоновкой и методом...

27
blits
2 / 2 / 0
Регистрация: 06.02.2012
Сообщений: 33
17.06.2012, 03:30 #2
C
1
2
3
4
5
6
7
8
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];
            }
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 270
17.06.2012, 03:33  [ТС] #3
Что такое?
0
blits
2 / 2 / 0
Регистрация: 06.02.2012
Сообщений: 33
17.06.2012, 03:40 #4
как-то пугает 4-х кратный цикл)))
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 270
17.06.2012, 03:49  [ТС] #5
Я более чем уверен, что есть способ легче, но при тестировании работает. Да и знаний пока что не достаточно чтобы сделать по-другому.
0
Avazart
Эксперт С++
7423 / 5513 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
17.06.2012, 04:58 #6
Цитата Сообщение от Leonman Посмотреть сообщение
алгоритм по вставлению числа в массив
Такое нельзя реализовать непосредственно...

Используй std::vector либо другой контейнер, в противном случае придеться работать с динамическими массивами
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 270
17.06.2012, 06:31  [ТС] #7
С vector у меня совсем дела плохи, да и с динамическими не разобрался, даже матриц ещё не брал. Программирую только 2 месяца, да и то я программист самоучка. В моём возросте особо некуда пойти учиться.
Неужели нельзя вставку произвести используя только одномерный массив. Задание то само относить в раздел "одномерные массивы"
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
17.06.2012, 06:52 #8
Leonman, Никак. Разве что выделить больше и фальсифицировать конец массива. Изучайте динамику.
0
dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
17.06.2012, 10:40 #9
позвольте:
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
#include "stdafx.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (0,"Russian");
    const int n = 1000;
    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+1; i ++)
    {
        if (arr[i] <= b)
        {
            arrRezault[i] = arr[i];
        }
        else
        {
            if (!valueInserted)
            {
                valueInserted=true;
                arrRezault[i] = b;
                
            }
            arrRezault[i+1] = arr[i];
        }
    }
 
    return 0;
}
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 270
17.06.2012, 13:05  [ТС] #10
dima koz, Огромное спасибо! Всё работает. Только вопрос, почему когда я например вставляю число 5 в последовательность из 10 элементов {1,2,3,4,6,7,8,9,10,11}, то у меня последний элемент заменяется на -1?

Добавлено через 25 секунд
soon, Обезательно изучу
0
dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
17.06.2012, 15:21 #11
Цитата Сообщение от Leonman Посмотреть сообщение
Только вопрос, почему когда я например вставляю число 5 в последовательность из 10 элементов {1,2,3,4,6,7,8,9,10,11}, то у меня последний элемент заменяется на -1?
сорри, в 24 строке заменить надо на:
C++
1
 for (int i= 0; i<n; i ++)
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 270
18.06.2012, 15:11  [ТС] #12
dima koz, Тогда если я например вставляю число 11 в последовательность из 10 элементов {1,2,3,4,5,6,7,8,9,10}, то у меня последний элемент заменяется на 3?
0
dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
18.06.2012, 23:03 #13
Цитата Сообщение от Leonman Посмотреть сообщение
dima koz, Тогда если я например вставляю число 11 в последовательность из 10 элементов {1,2,3,4,5,6,7,8,9,10}, то у меня последний элемент заменяется на 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
#include "stdafx.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (0,"Russian");
    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 (arr[i] < b)
        {
            arrRezault[i] = arr[i];
            if (i+1 == n) arrRezault[i+1] = b;
        }
        else
        {
            if (!valueInserted)
            {
                valueInserted=true;
                arrRezault[i] = b;
            }
 
            arrRezault[i+1] = arr[i];
        }
    }
 
    return 0;
}
1
Avazart
Эксперт С++
7423 / 5513 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
19.06.2012, 00:35 #14
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
#include <iostream>
using namespace std;
//----------------------------------------------------------
void insert(int * &Array,int& size,int value,int pos)
{
 int* NewArray= new int[size+1]; 
 
 NewArray[pos]=value;  
 
 for(int i=0,k=0;i<size;k++)
  {
    if(k == pos) continue;
    NewArray[k]= Array[i]; 
    i++;
  } 
 
 delete[] Array; 
 Array= NewArray;
 size++;
}
//----------------------------------------------------------
void print(int A[],const int& size)
{
 cout<<"Значения элементов массива :"<<endl;
 for(int i=0;i<size;i++) cout<<A[i]<<" ";
 cout<<endl;
}
//----------------------------------------------------------
void input(int A[],const int& size)
{
 cout<<"Введите значения элементов массива"<<endl; 
 cin.sync();
 for(int i=0;i<size;i++) cin>>A[i];
}
//----------------------------------------------------------
int main()
{
int size;
cout<<"Введите начальный размер массив"<<endl; cin.sync();
cin>>size;
 
int *A = new int[size];
 
input(A,size);
print(A,size);
 
for(;;)
 { 
  int value,pos;
 
   cout<<"Введите значение вставляемого элемента ";  cin.sync();
   cin>>value;
   cout<<"Введите положение вставляемого элемента ";  cin.sync();
   cin>>pos;
  
   insert(A,size,value,pos);
   print(A,size);
 }
 
delete[] A;
return 0;
}//----------------------------------------------------------------
1
LittleGirl
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 5
19.06.2012, 00:54 #15
-1 получается потому, что цикл для заполнения итогового массива до i<n+1. Внутри цикла вычисляется значение arr[i], то есть на последнем шаге цикла имеем arr[n]. А по этому адресу лежит всякий мусор, в вашем случае там лежала -1. Это значение сравнилось с b=5, мы попали в if и получили arrRezault[n] = arr[n], т.е. последнее значение в итоговом массиве заменили на эту самую -1.
Если цикл сделать до i<n то 5 вставляется хорошо. Но вот если попробовать вставить, например, 15, то мы никогда не зайдем в else и не инициализируем последний элемент массива arrRezault, в итоге опять получим там всё что угодно.

Мой вариант:
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 "stdafx.h"
#include "locale.h"
#include "iostream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (0,"Russian");
    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 arr_rez[n+1]; 
 
    int i, ind=n;
    // Ищем индекс элемента, большего чем b
    for(i=0;i<n;i++)
        if (arr[i]>b) {ind=i; break;}
 
    // копируем всё до ind
    for(i=0;i<ind;i++)
        arr_rez[i]=arr[i];
 
    // вставляем b
    arr_rez[ind]=b;
 
    // копируем оставшееся
    for(i=ind+1;i<n+1;i++)
        arr_rez[i]=arr[i-1];
 
    return 0;
}
0
19.06.2012, 00:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2012, 00:54
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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