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

Удалить первичные вхождения с использованием указателей - C++

Восстановить пароль Регистрация
 
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
10.01.2013, 19:21     Удалить первичные вхождения с использованием указателей #1
Переделайте код пожалуйста, что бы в нем использовались указатели.
Удалить из массива все повторяющиеся эл-ты, оставив их первые вхождения. т.е в массиве должны остаться только различные эл-ты
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
#include <iostream>
 
using namespace std;
     int main()
{
    const int N=10;
    int N_used=N;
    int arr[N];
 setlocale(LC_ALL, "Russian");
            cout«"Исходный массив:\n";
        for (int i=0; i<N; i++)
        {
 arr[i]=rand()%10;
 cout«i+1«". "«arr[i]«endl;
        }
        for (int i=0; i<N_used; ++i){
        for(int j=i-1;j>=0;--j){
 if(arr[j]==arr[i]){
        memmove(arr+i,arr+i+1,sizeof(*arr)*(N_used-i));
 —N_used; —i;
      }
    }
  }
 cout«"Конечный массив:\n";
       for (int i=0; i<N_used; i++)
       cout«i+1«". "«arr[i]«endl;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
10.01.2013, 19:25
  #2

Не по теме:

Seriks Можно код по нормальному вставлять, а не из текстового файла.

Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
10.01.2013, 22:29  [ТС]     Удалить первичные вхождения с использованием указателей #3
но у меня не сохранилось в нормальном виде( только ткст(

Добавлено через 56 минут
help)

Добавлено через 1 час 55 минут
пожалуйста)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 22:40     Удалить первичные вхождения с использованием указателей #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
bool IsUniversal(char * str, char ch){
    for(;*str;++str)
        if(*str==ch)
            return false;
    return true;
}
int main(){
    char str[]="dfsssdfdfrfg";
     size_t size=strlen(str);
     char *pNewStr=new char[size+1];
     memset(pNewStr,0,size*sizeof(char));
     for(char *p=str,*pend=str+size, *pDest=pNewStr;p<pend;++p)
         if(IsUniversal(pNewStr,*p)){
             *(pDest++)=*p;
         }
 
    std::cout<<pNewStr<<std::endl;
    return 0;
}
Не проверял!
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
11.01.2013, 15:04  [ТС]     Удалить первичные вхождения с использованием указателей #5
Спасибо!!! код рабочий. А можете переделать, что бы массив чисел, а не букв выполняла программа?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
11.01.2013, 15:21     Удалить первичные вхождения с использованием указателей #6
Попробуйте так, я не проверял:
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
#include <iostream>
 
bool IsUniversal(int* str, int ch){
    for(;*str;++str)
        if(*str==ch)
            return false;
    return true;
}
int main(){
    int str[]={13,10,20,30,30,10,20,60,90,90,87,30,13,4,30,8};
    size_t size=sizeof(str)/sizeof(*str);
    int *pNewStr=new int[size];
    memset(pNewStr,0,size*sizeof(*str));
    for(int *p=str,*pend=str+size, *pDest=pNewStr;p<pend;++p,--size)
        if(IsUniversal(pNewStr,*p)){
            *(pDest++)=*p; ++size;
        }
    int *pRez=new int[size];
    memcpy(pRez,pNewStr,size*sizeof(*pNewStr));
    delete [] pNewStr;
    for(int *p=pRez,*pend=pRez+size;p<pend;++p)
        std::cout<<*p<<' ';
    std::cout<<std::endl;
    return 0;
}
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
11.01.2013, 15:28  [ТС]     Удалить первичные вхождения с использованием указателей #7
Большое спасибо, работает! но кода я совершенно не понимаю.. он выполнен не для visual studio ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
11.01.2013, 15:38     Удалить первичные вхождения с использованием указателей #8
Цитата Сообщение от Seriks Посмотреть сообщение
он выполнен не для visual studio ?
Должен работать в студии. Делался прямо в Notepad++
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
11.01.2013, 15:50  [ТС]     Удалить первичные вхождения с использованием указателей #9
Да, работает в вижуал.. Но препод мне не поверит( 1й курс, только начали учить с++) 4 задания с лабы я сделал. На последнем вот этом, переделать с помощью указателей у меня ступор.

Добавлено через 8 минут
Я конечно борзею, но не затруднит Вас переделать код на более элементарный уровень С++, 1й курс универа,visual studio? Буду очень признателен!
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
11.01.2013, 16:06     Удалить первичные вхождения с использованием указателей #10
Цитата Сообщение от Seriks Посмотреть сообщение
код на более элементарный уровень С++, 1й курс универа
Смотря что Вы называете элементарным...я же не в курсе чему Вас там учат. Сейчас Ваш код переделаю.

Добавлено через 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
#include <iostream>
#include <memory.h>
#include <ctime>
using namespace std;
int main(){
    const int N=10;
    int arr[N];
    int * pEndArr=arr+N;
    setlocale(LC_ALL, "Russian");
    cout<<"Исходный массив:\n";
    srand(time(NULL));
    for (int *pi=arr; pi<pEndArr; ++pi){
        *pi=rand()%10;
        cout<<pi-arr+1<<".\t"<<*pi<<endl;
    }
    for (int * pi=arr; pi<pEndArr; ++pi){//Уверены, что с нуля надо начинать?
        for(int * pj=pi-1;pj>=arr;--pj){
            if(*pj==*pi){
            memmove(pi,pi+1,sizeof(*arr)*(pEndArr-pi));
            --pEndArr; --pi;
            }
        }
    }
    cout<<"Конечный массив:\n";
    for (int * pi=arr; pi<pEndArr; ++pi)
        cout<<pi-arr+1<<".\t"<<*pi<<endl;
}
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
11.01.2013, 16:30  [ТС]     Удалить первичные вхождения с использованием указателей #11
Огромное спасибо!насчет 0 не уверен, но главное что работает..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 16:32     Удалить первичные вхождения с использованием указателей
Еще ссылки по теме:

C++ Заполнение массива с использованием указателей
C++ Динамический массив с использованием указателей
Программа с использованием указателей C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
11.01.2013, 16:32     Удалить первичные вхождения с использованием указателей #12
Цитата Сообщение от Seriks Посмотреть сообщение
насчет 0 не уверен, но главное что работает..
тогдa pi=arr+1
Yandex
Объявления
11.01.2013, 16:32     Удалить первичные вхождения с использованием указателей
Ответ Создать тему
Опции темы

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