第12回演習:解答例


問1 キーボードから文字列(100文字以下とする)を入力すると,入力された文字数を画面に表示するプログラムを作成せよ.


#include <stdio.h>

void main()
{
	char str[101];
	int i;

	printf("文字列を入力してください:");
	scanf("%s", str);

	i = 0;
	while(str[i]!='¥0'){
		i++;
	}

	printf("入力された文字数は%dです.¥n", i);

}

問2 下のソースコードを参考に,ファイルminidata.txt(右クリック-->[対象をファイルに保存] )から実数データ10個を読み取り配列dataに格納し,配列と要素数を引数として受け取り最大値を返す関数get_maxを作成し,


#include <stdio.h>

float get_max(float *p, int n)
{
	int i;
	float max=*p;
	
	for(i=0;i<n;i++){
		if(max < *(p+i)){
			max = *(p+i);
		}
	}
	
	return max;
}

void main()
{
	float data[10];
	FILE *fp;
	int i;
	
	fp = fopen("minidata.txt", "r");
	if(fp == NULL){
		printf("ファイルを開けませんでした.¥n");
		return;
	}
	
	for(i=0;i<10;i++){
		fscanf(fp, "%f", &data[i]);
	}
	
	fclose(fp);
	
	printf("最大値は%f ¥n", get_max(data, 10));
}

問3 三つの自然数をa,b,cを三辺の長さとする三角形を画面に表示したい.以下の手順にしたがってプログラムを作成せよ.

(1)三つの自然数をキーボードから入力し配列nに格納する部分(自然数かどうかの確認不要)を作成しなさい.

(2)一般にどの二つの辺の長さの和も他の一つの辺の長さより大きければ三角形が存在する.
三つの自然数を関数に渡すと三角形が存在するかどうか確認し,存在する場合「1」,存在しない場合「0」を戻り値とする関数の定義部分を答えなさい.

(3)三角形が存在する場合((2)の関数の結果を用いて確認),三つの頂点のうち一つを原点(0,0)としたとき,他の二つの頂点の座標を求め構造体の配列に格納するプログラムの部分を答えよ.

(4)座標(x1,y1)からの座標(x2,y2)へ直線を引くとline(x1,y1,x2,y2)関数を用いて三角形を描画したい.グラフィックからの初期化等を考えなくて良いとすると, (3)で求まった座標の格納された構造体から三角形を描画するプログラムの部分を答えよ.


#include <stdio.h>
#include <math.h>
struct point {
	int x;
	int y;
};

/* (2) */
int triangle(int *p)
{
	if((*p < *(p+1)+*(p+2)) && (*(p+1) < *(p+2)+*p) && (*(p+2) < *p+*(p+1))){
		return 1;
	} else {
		return 0;
	}
}

void main()
{
	int n[3], i;
	float s;
	struct point apex[3];
	
	/* (1) */
	printf("a=");
	scanf("%d", &n[0]);
	printf("b=");
	scanf("%d", &n[1]);
	printf("c=");
	scanf("%d", &n[2]);
	
	/* (3) */
	if(triangle(n) == 1){
		s = (n[0]+n[1]+n[2])/2;
		apex[0].x = 0;
		apex[0].y = 0;
		apex[1].x = n[0];
		apex[1].y = 0;
		apex[2].x = (n[0]*n[0]+n[2]*n[2]-n[1]*n[1])/2/n[0];
		apex[2].y = sqrt(s*(s-n[0])*(s-n[1])*(s-n[2]))/n[0]*2;
	} else {
		printf("三角形が存在しません.¥n");
	}
	
	/* (4) */
	line(apex[0].x, apex[0].y, apex[1].x, apex[1].y, 10);
	line(apex[1].x, apex[1].y, apex[2].x, apex[2].y, 10);
	line(apex[2].x, apex[2].y, apex[0].x, apex[0].y, 10);
}