ページ 11

配列の削除

Posted: 2018年10月04日(木) 17:44
by Lucy7512
質問して礼します。

大学で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

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

Re: 配列の削除

Posted: 2018年10月07日(日) 16:36
by lucy7512
Lucy7512 さんが書きました:
1年前
質問して礼します。

大学で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);


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

Re: 配列の削除

Posted: 2018年10月07日(日) 23:37
by box
最終的な実行結果は、
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
という形になるそうです。
コンピュータを使わずに手で行なうとすると、どういう手順を踏みますか?

Re: 配列の削除

Posted: 2018年10月08日(月) 22:16
by Lucy
返信ありがとうございます。

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

Re: 配列の削除

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

例えば、

コード:

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: 配列の削除

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

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

よく考えましょう。

Re: 配列の削除

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

Re: 配列の削除

Posted: 2018年10月10日(水) 04:42
by かずま
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文で適当な回数の代入を繰り返すのです。

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