問題1解答
ソースコード
#include<stdio.h>
int main(void)
{
int num=1;
int* ans;
ans=#
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]ということではだめだということです。