配列の削除

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Lucy7512

配列の削除

#1

投稿記事 by Lucy7512 » 10ヶ月前

質問して礼します。

大学でC言語の勉強を進めています。
その中で、配列の削除というのをやっておりわからないところがあり、質問させてもらいました。

問題 
0~99までの乱数を発生させ、10個の配列に入力する。その後、0~9までの数値を入力した値に相当する配列を削除し、削除した配列を詰める事。

問題は以上の通りです。
自分でやってみると、
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
int a[10];
int i,j,ri,n,k,value;
srand((unsigned int)time(NULL));

for(i=0;i<10;i++){
ri=rand()%100;
printf("a[%d]=%2d",i,ri);
if(i==4 || i==9) { printf("\n");}
else {printf(",");}
}

printf("\n");
printf("n=");scanf("%d",&n);


実行結果
a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=11,a[6]=63,a[7]=72,a[8]=33,a[9]= 5

n=5

というところまでしか、できませんでした。
この後の続きがわからないので教えてもらえると助かります。

lucy7512

Re: 配列の削除

#2

投稿記事 by lucy7512 » 10ヶ月前

Lucy7512 さんが書きました:
10ヶ月前
質問して礼します。

大学でC言語の勉強を進めています。
その中で、配列の削除というのをやっておりわからないところがあり、質問させてもらいました。

問題 
0~99までの乱数を発生させ、10個の配列に入力する。その後、0~9までの数値を入力した値に相当する配列を削除し、削除した配列を詰める事。

問題は以上の通りです。

最終的な実行結果は、
a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=11,a[6]=63,a[7]=72,a[8]=33,a[9]= 5

n=5
a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=63,a[6]=72,a[7]=33,a[8]=5
という形になるそうです。

自分でやってみると、
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
int a[10];
int i,j,ri,n,k,value;
srand((unsigned int)time(NULL));

for(i=0;i<10;i++){
ri=rand()%100;
printf("a[%d]=%2d",i,ri);
if(i==4 || i==9) { printf("\n");}
else {printf(",");}
}

printf("\n");
printf("n=");scanf("%d",&n);


というところまでしか、できませんでした。
この後の続きがわからないので教えてもらえると助かります。

box
記事: 1737
登録日時: 8年前

Re: 配列の削除

#3

投稿記事 by box » 10ヶ月前

最終的な実行結果は、
a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=11,a[6]=63,a[7]=72,a[8]=33,a[9]= 5

n=5
a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=63,a[6]=72,a[7]=33,a[8]=5
という形になるそうです。
コンピュータを使わずに手で行なうとすると、どういう手順を踏みますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Lucy
記事: 1
登録日時: 10ヶ月前

Re: 配列の削除

#4

投稿記事 by Lucy » 10ヶ月前

返信ありがとうございます。

フローチャートでやれという事でしょうか?

かずま

Re: 配列の削除

#5

投稿記事 by かずま » 10ヶ月前

Lucy さんが書きました:
10ヶ月前
フローチャートでやれという事でしょうか?
コンピュータを使わず、プログラムも書かず、
自分の頭で考えて、期待される結果を書いてみてください、
ということです。

例えば、

コード:

a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=11,a[6]=63,a[7]=72,a[8]=33,a[9]= 5

n=8
この場合、どういう結果になりますか?

コード:

a[0]=42,a[1]=31,a[2]=45,a[3]=23,a[4]=55
a[5]=11,a[6]=63,a[7]=72,a[8]=33,a[9]= 5

n=3
この場合、どういう結果になりますか?

その結果を得るために、どのように考えましたか?

かずま

Re: 配列の削除

#6

投稿記事 by かずま » 10ヶ月前

Lucy7512 さんが書きました:
10ヶ月前
0~99までの乱数を発生させ、10個の配列に入力する。
配列は 1個しかありません。a という名前の変数 1個です。
その配列の要素は 10個あります。a[0], a[1], ... a[9] です。
次のように書かないと不正確です。
「0~99までの乱数を発生させ、要素が10個の配列に入力する。」
または
「0~99までの乱数を 10個発生させ、配列に入力する。」

プログラムを見ると、発生した乱数は ri に代入しているだけで、
配列には入力していません。
では、なぜ配列の中身が表示されているのかというと
ri を表示しているからです。

よく考えましょう。

Lucy7512

Re: 配列の削除

#7

投稿記事 by Lucy7512 » 10ヶ月前

返信ありがとうございます。
結果は理解しています。
"n"に入力した数によって下記がどう働くかも分かります。
今理解してないのは、どうすれば消せて、どうすれば詰めれるかというところです。
もう少しヒントをもらえると助かります。

かずま

Re: 配列の削除

#8

投稿記事 by かずま » 10ヶ月前

n が 5 のとき、
a[0]~a[4] の値は変化しません。
a[5] の値が元の a[6] の値になり、
a[6] の値が元の a[7] の値になり、
a[7] の値が元の a[8] の値になり、
a[8] の値が元の a[9] の値になっています。

a[5] の値を a[6] の値にするためには
a[5] = a[6]; という代入を実行すればよいのです。
これで、a[5] の元の値は消せました。
a[6] の値を a[5] に詰めることもできました。

でも、プログラム中に a[5] = a[6]; と書いてはいけません。
そう書いてしまうと、n が 8 のとき困るでしょう。

だから、n とか i とかの変数を使って、
for文で適当な回数の代入を繰り返すのです。

フォーラムルールに従って、コードタグを使って
プログラムを貼り付けてください。

返信

“C言語何でも質問掲示板” へ戻る