
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);
}
No.2ベストアンサー
- 回答日時:
★質問者さんへ。
>ちなみにここまで出来ました。
>下にある途中の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;
}
↑
で良いでしょう。
・それでは。また。
No.3
- 回答日時:
***** はじめまして *****
>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];
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
市松模様
-
VB.NET DLL 参照型String読込み
-
C#の配列について教えてください
-
signal関数の使い方
-
if と配列の組み合わせ
-
メルセンヌ・ツイスタの乱数生...
-
四捨五入方法
-
質問です 下記のコードを分かり...
-
構造体の勉強中です 合計点の高...
-
比較回数と交換回数表示について
-
c/c++でのファイルの上書き保存...
-
【C++】関数ポインタの使い方
-
「void ( *signal(int sig, voi...
-
C言語でDxlibを使って3x3の奇数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報