身につくc言語-演習問題6回目 解答と解説-

問題1解答

ソースコード


#include<stdio.h>
int main(void)
{
	int num=1;
	int* ans;
	ans=&num;
	
	printf("ansの値は%dで、アドレスは%pです。\n",*ans,ans);
	return 0;
}

ans=&numとすることでansとnumの間に関係性を持たせることができます。

問題2解答

ソースコード


#include<stdio.h>
void koukan(int* a,int* b);
int main(void)
{
	int num1;
	int num2;
	printf("整数を二つ入力してください。\n");
	scanf("%d %d",&num1,&num2);
	
	koukan(&num1,&num2);
	
	printf("%d %d\n",num1,num2);
	return 0;
}
void koukan(int*a,int* b)
{
	int c;
	c=*a;
	*a=*b;
	*b=c;
}

ここで大切なのは、この要素はアドレスなのか、ポインタなのか、整数なのかをしっかりと理解することです。

 

問題3解答

ソースコード


#include<stdio.h>
void fnc(int* num,int* sum,double* avg);
int main(void)
{
	int num[5];
	int sum=0;
	double avg;
	int i;
	
	printf("整数を5つ入力してください。\n");
	for(i=0;i<5;i++)
	{
		scanf("%d",&num[i]);
	}
	fnc(num,&sum,&avg);
	
	printf("合計:%d\n平均:%lf\n",sum,avg);
	return 0;
}
void fnc(int* num,int* sum,double* avg)
{
	int i;
	for(i=0;i<5;i++)
	{
		*sum+=num[i];
	}
	*avg=*sum/5.0;
}

配列のアドレスを関数に渡すときは、配列の先頭要素をそのまま渡します。

 

fnc関数でnum[i]に*を付ける必要なありません。

 

これは配列の先頭要素を関数に渡しているので、その次に続く4つの要素は芋ずる式にわかるわけです。(int型だと4バイトなので先頭アドレスから4バイトずつずらすと配列の全要素がわかる)

 

基本的なことですが、*avgに代入するときは「*sum/5」としてはいけません。こうしてしまうと「int/int」となってしまいdouble型ではなくなります。

 

intをdoubleに代入するときは少なくともどちらかがdoubleである必要があります。(たとえば「(double)*sum/5」とか「(double)*sum/5.0」とか「*sum/5.0」とすれば答えはdouble型になります。)

 

問題+α解答

ソースコード


#include<stdio.h>
void fnc(int* num);
int main(void)
{
	int num[5];
	int i;
	printf("整数を5つ入力してください。\n");
	for(i=0;i<5;i++)
	{
		scanf("%d",&num[i]);
	}
	
	fnc(num);
	
	for(i=0;i<5;i++)
	{
		printf("%d ",num[i]);
	}
	putchar('\n');
	return 0;
}
void fnc(int* num)
{
	int i,j;
	int a;
	for(i=0;i<5;i++)
	{
		for(j=0;j<5-i;j++)
		{
			if(num[i]<num[i+j])
			{
				a=num[i];
				num[i]=num[i+j];
				num[i+j]=a;
			}
		}
	}
}

これはmain関数からfnc関数への配列の移動よりも、fnc関数内のソートの方が難しいのではないでしょうか。(ソートとは、指定の順番に並び替えをすること)

 

二重for文を使用して入れ替えます。

 

for文の詳しい内容はこちらの画像を見てください。

iが5回ループします。jは5回、4回、3回、2回、1回とだんだんループの回数が減っていきます。

 


a=num[i];
num[i]=num[i+j];
num[i+j]=a;

これについては、こちらを見てください。(num[i]の値が3でnum[i+j]の値が5としましょう。)

これは値がかぶってしまうのでだめです。

こっちはきちんと交換されています。(字の汚さは許してください…)

 

単純にnum[i]=num[i+j];num[i+j]=num[i]ということではだめだということです。