課題で「ラーニングソフト」を作っているのですがこのプログラムにワードから持ってきたテキストデータを読み込んで正誤をさせるものを作りたいのですが改善点があれば教えていただきたいです。
こちらがそのプログラムになります↓
#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: このプログラムを完璧に・・・
コードタグをご利用ください。コードが読みやすくなります。
http://dixq.net/board/board.html#k10
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: このプログラムを完璧に・・・
C++かC99コンパイラでないとコンパイルが通りませんが問題はないと思います。
ただ、continueはやめて、ifの不正解側の流れをelseで作ったほうが分かりやすくなります。。
課題ではないなら問題不正解の時に不親切ですかね。
ただ、continueはやめて、ifの不正解側の流れをelseで作ったほうが分かりやすくなります。。
課題ではないなら問題不正解の時に不親切ですかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。