(1) 変数 a と b の値を,入れ替える関数を作成せよ.
回答例
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void main()
{
int a,b;
printf("aの値は:");
scanf("%d", &a);
printf("bの値は:");
scanf("%d", &b);
printf("入れ替え前:a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("入れ替え後:a=%d, b=%d\n", a, b);
}
関数swapには、値そのものではなく、アドレスを渡す点に注意。
(2) 配列の要素の和を求める関数を作成せよ.
回答例
#include <stdio.h>
int goukei(int *ary, int no)
{
int i;
int sum=0;
for(i=0; i<no; i++) {
sum += ary[i];
}
return sum;
}
void main()
{
int num = 10;
int ary[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum;
sum = goukei(ary, num);
printf("合計は %d です\n", sum);
}
関数“goukei”の1番目の引数はアドレスなので、配列名(=アドレス)をそのまま渡せばよい。(&aryではない)
(3)ある文字列を入力したとき,文字数を数える関数を利用して,文字を逆に並べる関数を作成せよ.
回答例1(文字列を関数に渡す+文字を入れ替える関数)
#include <stdio.h>
/* 2つの文字を交換する関数 */
void swap_char(char*a, char*b)
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void reverse(char* str)
{
int i;
int mojisu=0;
/*文字数のカウント*/
while(str[mojisu] != '\0') {
mojisu++;
}
/*文字列のi番目(前から順に)と、mojisu-i-1番目(後ろから順に)を入れ替える*/
for(i=0; i<mojisu/2; i++){
swap_char(&str[i], &str[mojisu-i-1]);
}
}
void main()
{
char str[128];
int i;
printf("文字列を入力してください:");
scanf("%s", str);
printf("入力された文字列は、%sです。\n",str);
reverse(str);
printf("出力された文字列は、%sです。", str);
}
回答例2(文字数のカウントをさらに関数にする)
#include <stdio.h>
void swap_char(char*a, char*b)
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int moji_nagasa(char *str)
{
int i;
for(i =0; str[i] != '\0'; i++);
return i;
}
void reverse(char* str)
{
int i;
int mojisu;
mojisu = moji_nagasa(str);
for(i=0; i<mojisu/2; i++){
swap_char(&str[i], &str[mojisu-i-1]);
}
}
void main()
{
char str[128];
int i;
printf("文字列を入力してください:");
scanf("%s", str);
printf("入力された文字列は、%sです。\n",str);
printf("文字数は%dです\n", moji_nagasa(str));
reverse(str);
printf("出力された文字列は、%sです。", str);
}