07年度-C言語講座

第5回

本日のお題

  • 構造体
  • 自作ヘッダー
  • 文字列の取扱い

演習問題

演習問題解答例

.hファイル

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>

#define NUM 50
#define sqr(n) ((n)*(n))

typedef struct{
	double fuel;
	int x;
	int y;
} car;

.cppファイル

#include "std.h" //ヘッダーのインクルード
void inform(car a); //現在位置及び燃料表示用関数
int move(car *a, int dx, int dy,double efy); //移動処理関数
int main() {

	car a = {0,0,0};			//初期化
	double efy;			//リッター当たりの走行量
	puts("燃料の量と、リッター当たりの走行量を決めてください。");
	printf("燃料の量:");
	scanf("%lf",&a.fuel);
	printf("走行量:");
	scanf("%lf",&efy);
	while(1)
	{
		char slt[NUM];
		char y[] = "yes";
		char n[] = "no";
		int dx,dy,i = 0;
		inform(a);
		printf("移動しますか?移動するならYesを、しないならNoを入力してください。\n");
		scanf("%s",slt);
		while(slt[i] != '\0')			//小文字に変換する
		{
			slt[i] = tolower(slt[i]);
			i++;
		}
		if(strncmp(slt , n , 2) == 0)		//yesならmove関数、noなら終了、それ以外なら続ける
			break;
		else if (strncmp(slt , y , 3) == 0)
		{
			printf("X方向の移動距離:");
			scanf("%d",&dx);
			printf("Y方向の移動距離:");
			scanf("%d",&dy);
			if(move(&a, dx, dy,efy) != 1)	//1が返ってこなければ移動失敗。
			{
				printf("移動できませんでした。\n");
				break;
			}
		}
		else
			printf("入力が正しくありません。\n");
	}
	_getch();
	return 0;

}
/*現在位置及び燃料表示用関数*/
void inform(car a)
{

	printf("現在位置:(%d,%d)\n",a.x,a.y);
	printf("燃料残量:%.2fリットル\n",a.fuel);

}
/*移動処理用関数*/
int move(car *a,int dx,int dy,double efy)
{

	double dis = sqrt((double)sqr(dx) +(double)sqr(dy));	//まず移動距離を算出

	if(dis > a->fuel*efy)				//もし燃料不足なら
		return 0;				         //0を返す
	a->x += dx;				         //それ以外なら、各々の成分に加え、
	a->y += dy;
	a->fuel -= dis/efy;
	return 1;	                                             //1を返す

}

戯言

多分半数以上がわからなかったであろう、演習問題の模範解答。
何をやっているのかはコメントを見ればすぐに理解できるので、
できなかった人はしっかり見て理解しておいてください。


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-21 (木) 11:25:35 (1618d)