アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語で整数データの配列から同じ値のデータを削除する関数 int remove_same_data(int a[],int size)を作成する。
但し、この関数は重複したデータを削除して残った個数(整数)を関数の戻り値として返すものとする。

ちなみにここまで出来ました。
下にある途中の1,2,3ができればこのプログラミングができると思うんですが…
分かる方は知恵を貸してください。よろしくお願いします。

#include<stdio.h>
void swap_array(int a[], int size, int i)
{
int t;
if(i>=0 && i<size-1){
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
}

void mysort(int a[], int size)
{
int i,j;
for(j=size-1;j>0;j--){
for(i=0;i<j;i++){
if(a[i]>a[i+1])
swap_array(a,size,i);
}
}
}

int remove_same_data(int a[], int size)
{
1.sort
2.重複部分を削除する
3.残ったデータの個数を返す
}
int main()
{
int a[]={3,5,2,3,4,2,3,3,6,6,1,2,2,3,5,8,2,9}, size=18;
int i,newsize;

newsize = remove_same_data(a, 18);


for(i=0;i<newsize;i++){
printf(" %d ", a[i]);
}

return(0);
}



1はこれを使えば出来るらしいのですがよく分かりません。
void swap_array(int a[], int size, int i)
{
int t;
if(i>=0 && i<size-1){
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
}

void mysort(int a[], int size)
{
int i,j;
for(j=size-1;j>0;j--){
for(i=0;i<j;i++){
if(a[i]>a[i+1])
swap_array(a,size,i);
}
}
}



2はこれを使えばできるらしいのですがなかなかできません。
#include<stdio.h>
int main()
{
int a[8]={1,3,3,4,4,5,6,6},size=8;

//ソート済みデータの重複の削除
int i,j,p;
p=a[0];//前のデータの記憶
j=0;//削除するデータ数を数える
for(i=1;i<size;i++){
if(p==a[i]){
j=j+1;
}
else{
a[i-j]=a[i];//削除するデータ数分前へ
p=a[i];
}
}


//配列の表示
for(i=0;i<size-j;i++){
printf("%3d ", a[i]);//ここで1,3,4,5,6と表示される
}
return(0);
}

A 回答 (4件)

★質問者さんへ。


>ちなみにここまで出来ました。
>下にある途中の1,2,3ができればこのプログラミングができると思うんですが…
>分かる方は知恵を貸してください。よろしくお願いします。
 ↑
 swap_array()…正しい
 mysort()…正しい
 remove_same_data()…1.2.3 の通りに処理を記述すればよいだけです。
 処理手順は
>2はこれを使えばできるらしいのですがなかなかできません。
 ↑
 これで良いと思います。
・よってもう正しく重複データを削除できると思います。
 何をアドバイスすればよいのでしょうか?
 私も『補足要求』しますね。
・ちなみに remove_same_data() 関数は 1.2.3 の手順どおりに
 int remove_same_data( int a[], int size )
 {
  int i, j, p;
  
  // ソート
  mysort( a, size );
  
  //ソート済みデータの重複の削除
  p = a[0]; //前のデータの記憶
  j = 0; //削除するデータ数を数える
  for ( i = 1 ; i < size ; i++ ){
   if( p == a[i] ){
    j = j + 1;
   }
   else{
    a[ i - j ] = a[ i ];//削除するデータ数分前へ
    p = a[ i ];
   }
  }
  return size - j;
 }
 ↑
 で良いでしょう。
・それでは。また。
    • good
    • 1

下の回答者です。


すみません。自分の勘違いでしたね。
このプログラムで正解です。 申し訳ありませんでした。
    • good
    • 0

***** はじめまして *****



>2はこれを使えばできるらしいのですがなかなかできません。

少々細かいところでミスをされているようです。
おそらく実験?的に用意した配列{1,3,3,4,4,5,6,6}を元に実行した結果、1,3,4,5,4と標示されるのではないでしょうか?

重要なのは最後に重複して発見された数字の処理です。このプログラムでは次の値が重複でないときに初めて的確な位置に挿入されるため、最後に重複した文字は正しい位置に挿入されません。
よって示されたプログラムを少々変更する必要があります。

***** 提示していただいたプログラム *****
for(i=1;i<size;i++){
if(p==a[i]){
j=j+1;
}
else{
a[i-j]=a[i];//削除するデータ数分前へ
p=a[i];
}
}



***** 修正したプログラム ***** (見やすくするため、全角のスペースを入力します)
for(i=1; i<size; i++){
  if(p==a[i]){
     j=j+1;
     if(i == (size - 1))
       a[i-j]=a[i];
  }
  else{
  a[i-j]=a[i];//削除するデータ数分前へ
  p=a[i];
  }
}
    • good
    • 0

もう出来ておるようにお見受けしますが。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!