第6回:関数(2) 演習の解答

 


演習問題

(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);

			
}

関数goukei1番目の引数はアドレスなので、配列名(=アドレス)をそのまま渡せばよい。(&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);
}