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.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];
}
}
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;
}
↑
で良いでしょう。
・それでは。また。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
比較回数と交換回数表示について
-
C言語で三目並べをするプログラ...
-
if と配列の組み合わせ
-
商と剰余を同時に求める(C言語)
-
C言語での奇数の和
-
ラップ関数とはどんなものですか?
-
Arduinoのプログラムにエラーが...
-
C言語
-
並列プログラミングのπ計算につ...
-
C言語 エラーの原因がわからな...
-
インライン展開されているか確...
-
GlobalAllocの変数を関数に引き...
-
HANDLEて何ですか?
-
read関数をノンブロッキングで...
-
C++でvectorにテキストファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報