Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Получить новый массив без повторений 
V
    Опции темы
anad
Дата 11.10.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



 [C]Заданы два одномерных упорядоченных массива а и b. Получить новый массив, состоящий из чисел массивов а и b без повторений, упорядоченный по возрастанию.(без процедур и функций)
PM MAIL   Вверх
Dov
Дата 12.10.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Код
#include <stdio.h>

int main( )
{    
    int ar1[]          = {1, 2, 5, 6, 8, 11, 11, 11, 11, 11, 12, 14, 15};
    int ar2[]          = {1, 1, 2, 3, 4, 7, 11, 11, 11, 11, 20};
    
    const int sizeAr1  = sizeof(ar1) / sizeof(int);
    const int sizeAr2  = sizeof(ar2) / sizeof(int);
    
    int ar3[sizeAr1 + sizeAr2];                 
    
    int i, i1 = 0, i2 = 0, i3 = 0;    

    while(i3 < sizeAr1 + sizeAr2 && i1 < sizeAr1 || i2 < sizeAr2)
    {
        ar3[i3++] = ar1[i1] < ar2[i2] || i2 >= sizeAr2 ? ar1[i1++] : ar2[i2++];
        
        while(ar3[i3 - 1] == ar1[i1] || ar3[i3 - 1] == ar2[i2])
            ar3[i3 - 1] == ar1[i1] ? i1++ : i2++;
    }
    
    puts("first array:");
    for(i = 0; i < sizeAr1; i++)
        printf("%d ", ar1[i]);
    
    puts("\n\nsecond array:");
    for(i = 0; i < sizeAr2; i++)
        printf("%d ", ar2[i]);

    puts("\n\nmerged array:");
    for(i = 0; i < i3; i++)
        printf("%d ", ar3[i]);

    putchar('\n');

    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
anad
Дата 13.10.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Вообще ничего не высвечивается на экране...?
PM MAIL   Вверх
Dov
Дата 13.10.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(anad @  13.10.2006,  22:00 Найти цитируемый пост)
Вообще ничего не высвечивается на экране...?

Так ты компьютер включи.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
anad
Дата 13.10.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Вот это хорошее решение задачи, но мне надо без функций и процедур. (я наверное "достала" уже всех )
Код

#include<stdio.h>
#include<conio.h>
#define ARRAY_LENGTH 10 //длина массива
void InputArray(int* Arr,int n)//функция ввода
{
    for(int i=0;i<n;i++)
        scanf("%d",&Arr[i]);
}
void PrintArray(int* Arr,int n)//функция печати
{
    for(int i=0;i<n-1;i++)
        printf("%d ",Arr[i]);
    printf("%d\n",Arr[n-1]);
}
void SortArray(int* Arr,int n)//функция сортировки
{
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            if(Arr[j]<Arr[i])
            {
                Arr[i]=Arr[j]+Arr[i];
                Arr[j]=Arr[i]-Arr[j];
                Arr[i]=Arr[i]-Arr[j];
            }
}
int CreateArray(int* ArrC,int* ArrA,int* ArrB,int n)//функция создания массива неповтор.  чисел
{
    int res,i,j;
    res=0;//текущий индекс результ. массива и результат(кол-во элементов)
    i=0;//текущий индекс массива A
    j=0;//текущий индекс массива B
    while(i<n&&j<n)//пока не прошли один из массивов
    {
        if(ArrA[i]<ArrB[j])//если элемент массива A меньше
        {
            ArrC[res]=ArrA[i];//записываем в рез. массив
            i++;//увеличиваем индекс массива A
        }
        else
        {
            ArrC[res]=ArrB[j];//записываем в рез. массив
            j++;//увеличиваем индекс массива B
        }
        //далее продвигаем индексы в массивах до элементов > чем текущий в рез. массиве
        while(i<n&&ArrA[i]==ArrC[res])
            i++;
        while(j<n&&ArrB[j]==ArrC[res])
            j++;
        res++;//увеличение индекса рез. массива
    }
    //к этой строке один из массивов закончен, осталось дописать элементы из одного
    while(i<n)//для массива A
    {
        ArrC[res]=ArrA[i];//записываем элемент в рез. массив
        i++;//увеличиваем индекс массива A
        while(ArrA[i]==ArrC[res])//продвигаем индекс до большего элемента
            i++;
        res++;//увеличение индекса рез. массива
    }
    while(j<n)
    {
        ArrC[res]=ArrB[j];//записываем элемент в рез. массив
        j++;//увеличиваем индекс массива A
        while(ArrB[j]==ArrC[res])//продвигаем индекс до большего элемента
            j++;
        res++;//увеличение индекса рез. массива
    }
    return res;//возвращаем кол-во элементов результирующего массива
}
int main()
{
    int ArrA[ARRAY_LENGTH],ArrB[ARRAY_LENGTH],ArrC[ARRAY_LENGTH*2];
    int ArrResSize;
    printf("Please enter an array A:\n");
    InputArray(ArrA,ARRAY_LENGTH);
    printf("Please enter an array B:\n");
    InputArray(ArrB,ARRAY_LENGTH);
    SortArray(ArrA,ARRAY_LENGTH);
    SortArray(ArrB,ARRAY_LENGTH);
    printf("The A array:\n");
    PrintArray(ArrA,ARRAY_LENGTH);
    printf("The B array:\n");
    PrintArray(ArrB,ARRAY_LENGTH);
    ArrResSize=CreateArray(ArrC,ArrA,ArrB,ARRAY_LENGTH);
    printf("Result array:\n");
    PrintArray(ArrC,ArrResSize);
    getch();
    return 0;
}



Это сообщение отредактировал(а) alexeis1 - 14.10.2006, 01:44
PM MAIL   Вверх
Dov
Дата 14.10.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(anad @  13.10.2006,  23:44 Найти цитируемый пост)
я наверное "достала" уже всех

Да ну, что ты, anad, выдумываешь, работа у нас такая и никого ты не "достала", не переживай.
Просто мы не всегда успеваем угнаться за твоими мыслями. 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
anad
Дата 14.10.2006, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Предыдущее решение, которое я написала перед этим, мне надо написать без функций и процедур.(его же)
PM MAIL   Вверх
Oleg_Ci
Дата 14.10.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Это на С
Код

#include <stdio.h>
#include <stdlib.h>
#define len1 10 // количество элементов в первом массиве
#define len2 6 // количество элементов во втором массиве
#define len3 len1+len2 // ... в третьем массиве

//___________ MAIN ____________
int main(int argc, char *argv[] )
{
    int array1[len1], // превый массив
        array2[len2], // второй массив
        array3[len3], // масив - результат
        i, j, n, num; // разные переменные

    //заполняем два массива
    printf("Please enter an array 1:\n");
    for ( i=0; i<len1; i++ ) scanf("%d",&array1[i]);
    printf("Please enter an array 2:\n");
    for ( i=0; i<len2; i++ ) scanf("%d",&array2[i]);
    
    //сортируем первый массив
    for ( i=0; i<len1; i++ )
        for ( j=0; j<len1; j++ )
            if ( array1[j] < array1[i] ){
                n = array1[j];
                array1[j] = array1[i];
                array1[i] = n;
            }
    //сортируем второй массив
    for ( i=0; i<len2; i++ )
        for ( j=0; j<len2; j++ )
            if ( array2[j] < array2[i] ){
                n = array2[j];
                array2[j] = array2[i];
                array2[i] = n;
            }
    // объединяем два массива в один (третий)
    for ( i=0, j=0, n=0; n<len3; ){
        if ( array1[i] < array2[j] && j<len2 )   num = array2[j++];
        else if ( i<len1 )    num = array1[i++];
        else break;
        if ( !n ) array3[n++] = num;
        else if ( array3[n-1] != num )    array3[n++] = num;
    }

    // выводим первый массив
    printf("\n\nThe 1 array:\n");
    for ( i=0; i<len1; i++ )
        printf("%d  ", array1[i]);
    // выводим второй массив
    printf("\n\nThe 2 array:\n");
    for ( i=0; i<len2; i++ )
        printf("%d  ", array2[i]);
    // выводим результирующий массив
    printf("\n\nThe 3 array:\n");
    for ( i=0; i<n; i++ )
        printf("%d  ", array3[i]);

    printf("\n\n");
    system("pause");
    return 0;
}
Это на С++ (+STL)
Код

#include<iostream>
#include<stdlib.h>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{    
    set<int> array3;
    vector<int> array1, array2;
    int j, num;
    // Ввод значений 1) количество чисел в массиве.  2) сами числа
    for ( int i=1; i<=2; i++ ){
        cout << "Please enter LENGT an array " << i << " > ";// вводим количество чисел для массива
        for ( cin >> j; j != 0; j-- ){
            cout << "Number " << j << " > "; 
            cin >> num;  // вводим число
            if ( i == 1 ) array1.push_back( num ); // записываем в массив
            else array2.push_back( num );
        }
    }
    // Создаём третий массив и выводим его на консоль
    cout << "\n\nArray resultat : \n\n";
    copy( array1.begin(), array1.end(), inserter( array3, array3.begin() ));
    copy( array2.begin(), array2.end(), inserter( array3, array3.begin() ));
    copy( array3.begin(), array3.end(), ostream_iterator<int>( cout, " " ));
    cout << "\n\n";
    system("pause");
    return 0;
};

PM MAIL   Вверх
Oleg_Ci
Дата 14.10.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Это сишная, вроде попроще smile 
Код

#include <stdio.h>
#include <stdlib.h>
#define len1 10 // количество элементов в первом массиве
#define len2 6 // количество элементов во втором массиве
#define len3 len1+len2 // ... в третьем массиве

int main(int argc, char *argv[] )
{
    int array1[len1], // превый массив
        array2[len2], // второй массив
        array3[len3], // масив - результат
        i, j, n=len3, num; // разные переменные

    //заполняем два массива
    printf("Please enter an array 1:\n");
    for ( i=0; i<len1; i++ ) scanf("%d",&array1[i]);
    printf("Please enter an array 2:\n");
    for ( i=0; i<len2; i++ ) scanf("%d",&array2[i]);
    
    // объединяем два массива в один (третий)
    for ( i=0; i<len3; i++ )  array3[i] = i<len1 ? array1[i] : array2[i-len1];

    //сортируем массив
    for ( i=0; i<n; i++ )
        for ( j=0; j<n; j++ )
            if ( array3[j] == array3[i] && j != i ){
                array3[j] = array3[--n]; 
                i=0; break;
            }
                 else if ( array3[j] < array3[i] ){
                     num = array3[j];
                     array3[j] = array3[i];
                     array3[i] = num;
                 }

    // выводим результирующий массив
    printf("\n\nThe 3 array:\n");
    for ( i=0; i<n; i++ )
        printf("%d  ", array3[i]);

    printf("\n\n");
    system("pause");
    return 0;
}

PM MAIL   Вверх
anad
Дата 14.10.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



В объединении массивов не понятно что означает: "?" и ":" 
PM MAIL   Вверх
Kuvaldis
Дата 15.10.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



anad, 
Цитата

В объединении массивов не понятно что означает: "?" и ":" 

Тернарный оператор С.
Синтаксис    (выр.1) ? (выр2) : (выр3)
Работа: если истинно выр.1, то выполняется выр.2 иначе выполняется выр.3

В данном конкретном случае
Код

array3[i] = i<len1 ? array1[i] : array2[i-len1];

равносильно

Код

if ( i<len1) 
    array3[i] = array1[i] ;
else
   array3[i] =  array2[i - len1];



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Rockie
Дата 16.10.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Dov,  smile  smile 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.