このプログラムを完璧に・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ますお

このプログラムを完璧に・・・

#1

投稿記事 by ますお » 12年前

課題で「ラーニングソフト」を作っているのですがこのプログラムにワードから持ってきたテキストデータを読み込んで正誤をさせるものを作りたいのですが改善点があれば教えていただきたいです。
こちらがそのプログラムになります↓
#include <stdio.h>

#include <stdlib.h>

#include <string.h>







int main(void)

{

FILE *fp; /* (1)ファイルポインタの宣言 */

char s[16][512];//16個の512(¥0含む)の長さの文字列を収納できる配列



/* (2)ファイルのオープン */

/* ここで、ファイルポインタを取得する */

if ((fp = fopen("smpl.txt", "r")) == NULL) {//読み取り用にファイルを開く

printf("file open error!!\n");

exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */

}



int i = 0;

/* (4)ファイルの読み(書き)*/ //fgets()一行ずつ文字列を読み込み配列に収納 ¥n(改行)含む

while (fgets(s, 512, fp) != NULL && i < 15) {

/* ここではfgets()により1行単位で読み出し */

int mojisuu = strlen( s );//読み取った文字列が何文字あるか

s[mojisuu-1] = '\0';//最後の文字が¥nになっているため¥0を¥の位置に挿入 




/*デバッグ用**************************************/

/*mojisuu = strlen( s );



/*printf("<%d>\n",mojisuu); デバッグ用 ループが回っているか確認

printf("<%s>\n",s);*/

/**********************************************/




i++;//sの次の文字列保存場所にインデックスを移動

}



int mondaisuu = 0;//何問目か記録

char kaitou[512];//回答を保存する文字列 問題の旅に上書き




while(mondaisuu < 15){//問題数の分ループ

printf("%d問目文字列を入力してください\n",mondaisuu+1);

scanf("%s",kaitou);

if(!strcmp(s[mondaisuu],kaitou)){//int strcmp(char[] a,char b[])文字列a bが一致していれば0を返す 0の時実行したいので ! で反転

printf("正解\n\n");

mondaisuu++;

continue;//ループの最初に戻る

}

printf("不正解\n\n");//正解したら戻るため、実行されない

}



for(/*Cはforないで変数初期化できへんかった*/int j = 0;j < 16;j++){//読み取り保存した文字列をすべて出力

printf("%s",s[j]);

}




fclose(fp); /* (5)ファイルのクローズ */

scanf("%d",&s[1]);

return 0;

}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムを完璧に・・・

#2

投稿記事 by softya(ソフト屋) » 12年前

コードタグをご利用ください。コードが読みやすくなります。
http://dixq.net/board/board.html#k10
ますお さんが書きました:課題で「ラーニングソフト」を作っているのですがこのプログラムにワードから持ってきたテキストデータを読み込んで正誤をさせるものを作りたいのですが改善点があれば教えていただきたいです。
こちらがそのプログラムになります↓

コード:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>







int main(void)

{

	FILE *fp;	/* (1)ファイルポインタの宣言 */

	char s[16][512];//16個の512(¥0含む)の長さの文字列を収納できる配列

	

	/* (2)ファイルのオープン */

	/*  ここで、ファイルポインタを取得する */

	if ((fp = fopen("smpl.txt", "r")) == NULL) {//読み取り用にファイルを開く

		printf("file open error!!\n");

		exit(EXIT_FAILURE);	/* (3)エラーの場合は通常、異常終了する */

	}

	

	int i = 0;

	/* (4)ファイルの読み(書き)*/ //fgets()一行ずつ文字列を読み込み配列に収納 ¥n(改行)含む

	while (fgets(s[i], 512, fp) != NULL && i < 15) {

		/* ここではfgets()により1行単位で読み出し */

		int mojisuu = strlen( s[i] );//読み取った文字列が何文字あるか

		s[i][mojisuu-1] = '\0';//最後の文字が¥nになっているため¥0を¥の位置に挿入 




		/*デバッグ用**************************************/

		/*mojisuu = strlen( s[i] );

		

		/*printf("<%d>\n",mojisuu); デバッグ用 ループが回っているか確認

		printf("<%s>\n",s[i]);*/

		/**********************************************/




		i++;//sの次の文字列保存場所にインデックスを移動

	}

	

	int mondaisuu = 0;//何問目か記録

	char kaitou[512];//回答を保存する文字列 問題の旅に上書き




	while(mondaisuu < 15){//問題数の分ループ

		printf("%d問目文字列を入力してください\n",mondaisuu+1);

		scanf("%s",kaitou);

		if(!strcmp(s[mondaisuu],kaitou)){//int strcmp(char[] a,char b[])文字列a bが一致していれば0を返す 0の時実行したいので ! で反転

			printf("正解\n\n");

			mondaisuu++;

			continue;//ループの最初に戻る

		}

		printf("不正解\n\n");//正解したら戻るため、実行されない

	}

	

	for(/*Cはforないで変数初期化できへんかった*/int j = 0;j < 16;j++){//読み取り保存した文字列をすべて出力

		printf("%s",s[j]);

	}




	fclose(fp);	/* (5)ファイルのクローズ */

	scanf("%d",&s[1]);

	return 0;

}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムを完璧に・・・

#3

投稿記事 by softya(ソフト屋) » 12年前

C++かC99コンパイラでないとコンパイルが通りませんが問題はないと思います。
ただ、continueはやめて、ifの不正解側の流れをelseで作ったほうが分かりやすくなります。。
課題ではないなら問題不正解の時に不親切ですかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る