リハビリC

カテキョで英単語テストをやるときに問題作成がめんどいので自動化するソフトを作った。
以前Cの可変長配列で挫折してJava作ったんだが微妙に使いづらいのでCの固定長配列で作った。固定長だと楽だ…。
最近VSのオートコンプリートに頼りまくってるなぁ。引数の並びとかをかなり忘れてる罠。
そのうちC#の練習も兼ねてGUI版でも作ってみるかなぁ。


ちなみにソースコードはこんな感じ。無駄にメルセンヌツイスタを使ってみたり。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "ct1800.h" //単語ファイルはこっちで定義してある
#include "SFMT.c"

int myRand(int min, int max){
	int num = max - (min - 1), r;
	r = (gen_rand32()%num + (min-1));
	return r;
}

int main(void){

	FILE* out;
	int used[C_WNUM], num, min, max, maxnum; //C_WNUMは登録してある単語の総数
	char buf[BUFSIZ], command[BUFSIZ];

	for(min=max=0;!(min>0&&max>1&&max>min);){
		printf("出題範囲の番号を1〜%dの範囲で入力してください。\n始まり:",C_WNUM);
		fgets(buf,BUFSIZ,stdin);
		min = atoi(buf);
		printf("終わり");
		fgets(buf,BUFSIZ,stdin);
		max = atoi(buf);
		if(min>0&&max>1&&max>min){
			printf("出題範囲: %d - %d\n",min,max);
		}
	}

	for(maxnum=0;!(maxnum>0);){
		printf("問題数を1〜%dの範囲内で入力してください:",max-min+1);
		fgets(buf,BUFSIZ,stdin);
		maxnum = atoi(buf);
		if(maxnum>max-min+1)maxnum=max-min+1;
	}

	printf("出力ファイル名を入力してください(拡張子不要):");
	fgets(buf,BUFSIZ,stdin);
	if(buf[0]=='\n'||buf[0]=='\0')strcpy(buf,"out");
	for(int i=0;i<BUFSIZ;i++)buf[i]=(buf[i]=='\n')?'\0':buf[i];
	for(int i=0;i<C_WNUM;i++)used[i]=0;

	init_gen_rand((int)time(NULL));
	strcat(buf,".txt");
	out = fopen(buf,"w");

	if(out==NULL){
		printf("ファイルが正しく開けませんでした。終了します。");
		getchar();
		return EXIT_FAILURE;
	}
	
	fprintf(out,"単語テスト (%d%d)%-16s/%d\n\n",min,max,"",maxnum);

	printf("creating");
	for(int i=0,num=0;num<maxnum;){
		i = myRand(min,max);
		if(used[i]==0){
			used[i]=1;
			num++;
			fprintf(out,"(%-4d) %-16s(%-16s) (%d)\n",num,word[i],"",i+1);
			if(i%(maxnum/10)==0){
				int t;
				putchar('.');
				for(t=clock();(clock()-t)*20/CLOCKS_PER_SEC<1;);				
			}
		}
	}

	fclose(out); 

	printf("finished.");
	strcpy(command,"start /b ");
	strcat(command,buf);
	system(command);

	return EXIT_SUCCESS;
}