第5回演習:解答例


演習課題

(1)文字型配列 str1 に、"ABCDEFGHIJKLMNOPQRSTUVWXYZ" という文字列が格納されている。

ポインタを2つ用いて、文字型配列 str2 に、この文字列を逆順に格納するようなプログラムを作成せよ。


#include <stdio.h>
 
void main()
{
	char str1[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	char str2[27];
	char *p1, *p2;
	int i;

	p1 = &str1[0];
	p2 = &str2[0];

	for(i=0;i<26;i++){
		*(p2+25-i) = *(p1+i);
	}

	*(p2+26) = '\0';

	printf("str2の文字列は %s です.¥n", str2);
}

(2)大きさ10の整数配列を下図のように初期設定しなさい。

この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入し、配列の中身と、何個格納したかを画面表示するプログラムをポインタを用いて作成せよ。


#include <stdio.h>
 
void main()
{
	int data1[10] = { 6, 15, 7, 8, 9, 18, 66, 89, 35, 84 };
	int data2[10], i, count;
	int *p1, *p2;

	count = 0;
	p1 = data1;             
	p2 = data2;             
	for ( i = 0; i < 10; i++ ) {
		if ( ( ( *p1 )%2 ) == 1 ) {    
			*p2 = *p1;             
			printf( "%d¥n", *p2 );
			p2++;                  
			count;
		}
		p1++;	
	}
	printf( "格納個数 = %d¥n", count );

}

(3)円の半径を渡すと,面積を戻す関数を作成して,面積の値を表示するプログラムを作成せよ.


#include <stdio.h>
 
float menseki(float r)
{
	return 3.14*r*r;
}
 
void main()
{
	float r;
	
	printf("r=");scanf("%f",&r);
	
	printf("円の面積=%f¥n",menseki(r));
}

(4)整数型の2つの数値の最小値を返す関数を作成し,キーボードから入力した整数の最小値を表示せよ.


#include <stdio.h>

int comparison(int a,int b){
	
	if(a<b){
		return a;
	}else{
		return b;
	}
}

void main()
{
	int a,b;


	printf("2個の整数を入力してください¥n");
	printf("a:");
	scanf("%d",&a);
	printf("b:");
	scanf("%d",&b);

	if(a==b){
		printf("同じ値です¥n");
	}else{
		printf("最小値は%dです¥n",comparison(a,b));
	}
}


(5)実数xの値を入力し,y=5x5-12x4+3x+1を求めるプログラムを作成せよ.
ただし,xn(nは自然数)の値は,関数を自ら定義して計算すること(pow関数使用不可).


#include <stdio.h>
 
float power(float x, int n)
{
	int i;
	float y=1.0;
	
	for(i=0;i<n;i++)
		y *= x;
	
	return y;
}
 
float func(float x)
{
	float y;
	
	y = 5*power(x,5)-12*power(x,4)+3*power(x,1)+1;
	
	return y;
}
 
void main()
{
	float x;
	
	printf("実数xを入力してください:"); scanf("%f", &x);
	
	printf("関数y=5x^5-12x^4+3x+1の答: %0.3f¥n",func(x));
	
}

(6)大きさ10の整数配列 { 5, 3, 8, 6, 4, 9, 2, 7, 0, 1 } をポインタを用いて大きい順に並べ替えて表示せよ.


#include <stdio.h>
void main()
{
	int a[10] = { 5, 3, 8, 6, 4, 9, 2, 7, 0, 1,};
	int *p;
	int i,j,tmp;

	p = a;

	printf("表示¥n");
		for(i=0;i<9;i++){
			printf("%d ",a[i]);
		}
		printf("¥n");

	printf("大きい順に並び替えます¥n");

	for(i=0;i<9;i++){
		for(j=i+1;j<9;j++){
			if(*(p+i)<*(p+j)){
				tmp = *(p+i);
				*(p+i) = *(p+j);
				*(p+j) = tmp;
			}
		}
	}

		printf("表示¥n");
		for(i=0;i<9;i++){
			printf("%d ",a[i]);
		}
		printf("¥n");
}