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

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

Войти
Регистрация
Восстановить пароль
 
jung
2 / 2 / 1
Регистрация: 25.11.2009
Сообщений: 40
#1

одномерный массив[0..n...n+m]. - C++

25.11.2009, 18:59. Просмотров 452. Ответов 8
Метки нет (Все метки)

Уважаемые программисты помогите разобраться с задачей: "В одномерном целочисленном массиве x[1]…x[n+m], рассматриваемом как соединение двух его отрезков: начала x[1]…x[n]длины n и конца x[n]… [n+m] длины m, переставить местами начало и конец, не используя дополнительных массивов."

Не могу понять почему мой примитивный код не работает, как нужно. Заранее благодарен.
Извините за кривизну кода и общую неграмотность.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int p,i,j;
 const int N=3;
 const int M=4;
 int a[N+M];
 int main(){
 
cout<<"\n\t Input integer numbers"<<"\t"<<N+M<<"\t Raz \n\t";
 for (int i=0;i<N+M;i++)
scanf("%d",&a[i]);
   for (i=0;i<N;i++){
 p=a[i];
         for (j=N;j<N+M;j++){
 a[j-N-1]=a[j];
 a[j]=p;
 }
 }
  for (i=0;i<N+M;i++)
printf("%d  ",a[i]);
getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2009, 18:59     одномерный массив[0..n...n+m].
Посмотрите здесь:

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) - C++
Помогите решить задачку: Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий...

Массив: найти номера столбцов с положительными элементами и записать их в одномерный массив - C++
ввести двумерный массив I . найти номера столбцов с положительными элементами и записать их в одномерный массив, отобразить его на экране. ...

Массив: Все элементы массива, кратные трем, записать в одномерный массив. - C++
Дан двумерный массив размером n x n? заполненный целыми числами. Все его элементы кратные трем, записать в одномерный массив.

Переписать произвольный одномерный массив в другой массив в обратном порядке - C++
Помогите написать прогу, вот задание. Переписать произвольный одномерный массив в другой массив в обратном порядке.

Создать одномерный массив, заполнить его случайными значениями, отсортировать массив по убыванию - C++
создать одномерный массив, заполнить его случайными значениями, отсортировать массив по убыванию. получилось вот что: #include...

Дан двумерный массив размерностью Н. сформировать одномерный массив из элементов заданного массива расположенных над главной диагональю. - C++
помогите решить=)Дан двумерный массив размерностью Н. сформировать одномерный массив из элементов заданного массива расположенных над ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
25.11.2009, 19:11     одномерный массив[0..n...n+m]. #2
цикл 13-19 перепеши так:
C++
1
2
3
4
5
6
for (i=0;i<N;i++)
{
 p=a[i];
 a[i]=a[M+i];
 a[M+i]=p;
 }
jung
2 / 2 / 1
Регистрация: 25.11.2009
Сообщений: 40
25.11.2009, 19:39  [ТС]     одномерный массив[0..n...n+m]. #3
Спасибо огромное, как это часто бывает все гениальное просто.
А как быть если N>M или N=M?
Допишу єти моменты и вывешу здесь.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
25.11.2009, 19:42     одномерный массив[0..n...n+m]. #4
Кто ж так форматирует-то... Грамотность надо повышать, а не извиняться.
Вот что сочинилось мне навскидку на основе твоего опуса:
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
#include <iostream>
using std::cin;
using std::cout;
 
const int N=3;
const int M=4;
int a[N+M];
 
int Min(int a, int b)
{
    return (a>b)?b:a;
}
 
int main()
{
    cout<<"\n\t Input "<<N+M<<" integer numbers \n";
    for (int i=0; i<N+M; i++)
        cin>>a[i];
 
    int offset = 0, len1 = N, len2 = M;
    while(offset<N+M-1)
    {
        int amt = Min(len1, len2);
        for(int i=offset; i<amt; ++i, ++offset)
        {
            int t = a[i];
            a[i] = a[i+len1];
            a[i+len1] = t;
        }
        if(len1==len2)
            break;
        int delta = len1 + len2 - 2*Min(len1, len2);
        if(len1<len2)
            len2 = delta;
        else
            len1=delta;
        }
    }
    
    for (i=0;i<N+M;i++)
        cout<<a[i]<<"  ";
    char c;
    cin>>c;
}
Обрати внимание, что ввод и вывод теперь делаются исключительно средствами С++. Ну и алгоритм перемещения другой, более очевидный и эффективный.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
25.11.2009, 20:07     одномерный массив[0..n...n+m]. #5
Цитата Сообщение от jung Посмотреть сообщение
А как быть если N>M или N=M?
Если N=M, то все так и остаеться, а если N>M, то в цикле условие надо поменять с i<N на i<M
C++
1
2
3
4
5
for (i=0;i<M;i++){
 p=a[i];
 a[i]=a[M+i];
 a[M+i]=p;
 }
jung
2 / 2 / 1
Регистрация: 25.11.2009
Сообщений: 40
26.11.2009, 12:56  [ТС]     одномерный массив[0..n...n+m]. #6
Nick Alte, спасибо за помощ, но ваш алгоритм выше того уровня на котором я сейчас программирую, для меня это почти технологии пришельцев , я только месяц занимаюсь программированием и так мыслить самостоятельно я еще не могу, я работаю на более примитивном уровне, хотя Ваш алгоритм мне понятен. К сожалению Ваш алгоритм не работает в случаях N<M и N>M.
manfeese, Ваш алгоритм тоже не работает если N<M и N>M. С точки зрения логики все должно работать, но алгоритм это дело тонкое.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
26.11.2009, 19:33     одномерный массив[0..n...n+m]. #7
В таком случае вот так!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (N<M)
{
   for (int i = 0; i<N,i++) 
   {
     p = A[0];
     for (int j = 0; j<(N+M-1),j++) A[j]=A[j+1];
     A[N+M-1]=p;
   }
}
else
{
   for (int i = 0; i<M,i++) 
   {
     p = A[N+M-1];
     for (int j = N+M-1; j>0,j--) A[j]=A[j-1];
     A[0]=p;
   }
}
jung
2 / 2 / 1
Регистрация: 25.11.2009
Сообщений: 40
27.11.2009, 13:30  [ТС]     одномерный массив[0..n...n+m]. #8
manfeese,мое почтение, код работает идеально. Я немного доделал программу и вот результат:
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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int i,j,p,N,M;
int *A;
  int main(){
        cout<<"\n\n\tInput N=";
  cin>>N;
        cout<<"\n\tInput M=";
  cin>>M;
  A=new int[N+M];
        cout<<"\n\t Input integer numbers of Array,size of Array is"<<"\t"<<N+M<<"\n\t";
        for (int i=0;i<N+M;i++)
        scanf("%d",&A[i]);
   if (N<M){
   for (int i=0;i<N;i++){
     p = A[0];
     for (int j=0;j<(N+M-1);j++) A[j]=A[j+1];
     A[N+M-1]=p;
     }
  }
else{
   for (int i=0;i<M;i++){
     p=A[N+M-1];
     for (int j=N+M-1;j>0;j--)
     A[j]=A[j-1];
     A[0]=p;
     }
  }
    for (i=0;i<N+M;i++)
        printf("\t%d ",A[i]);
        getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2009, 19:52     одномерный массив[0..n...n+m].
Еще ссылки по теме:

Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах) - C++
Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах. Обьясните что делать?

Одномерный массив. Создать массив Х суммы среднеарифметического элементов массива А с каждым элементом массива А - C++
Дан массив А.Создать массив Х суммы среднеарифметического элементов массива А с каждым элементом массива А.

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...

Одномерный массив. - C++
Здраствуйте уважаемые програмисты помогите с решением задач... Составить программу для подсчёта суммы и количества элементов линейной...


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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
30.11.2009, 19:52     одномерный массив[0..n...n+m]. #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
43
#include <iostream>
using std::cin;
using std::cout;
 
const int N=3;
const int M=4;
int a[N+M];
 
int Min(int a, int b)
{
    return (a>b)?b:a;
}
 
int main()
{
    cout<<"\n\t Input "<<N+M<<" integer numbers \n";
    for (int i=0; i<N+M; i++)
        cin>>a[i];
 
    int offset = 0, len1 = N, len2 = M;
    while(offset<N+M-1)
    {
        int amt = Min(len1, len2);
        for(int i=0; i<amt; ++i, ++offset)
        {
            int t = a[offset];
            a[offset] = a[offset+len1];
            a[offset+len1] = t;
        }
        if(len1==len2)
            break;
        int delta = len1 + len2 - 2*Min(len1, len2);
        if(len1<len2)
            len2 = delta;
        else
            len1=delta;
    }
 
    for (int i=0; i<N+M; i++)
        cout<<a[i]<<"  ";
    char c;
    cin>>c;
}
Yandex
Объявления
30.11.2009, 19:52     одномерный массив[0..n...n+m].
Ответ Создать тему
Опции темы

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