よろしければ

にょんた
記事: 5
登録日時: 11年前

よろしければ

投稿記事 by にょんた » 11年前

#include
int main(){
int y=0;
int c;
int m=0;
int g;

printf("西暦を入力してください\n");

while((c=getchar()) !='\n'){
if(c>='0' && c=1900 && y='0' && g=1 && m<=12){
printf("%d\n",m);
}

return 0;
}






この問題でいまこの中にあるものだけで、文字コードから年号を入力するプログラムをつくってるのですが数字意外の文字が入力されたらまた最初の入力に戻る繰り返し分にし、Enterが入力されたらgetcharをやめて全て数字だったときに1900〜2100の範囲内にはいっていなければ最初の入力に戻る繰り返し文をつくっています(T . T)

また空白空白1900空白空白Enterとかであればokで
空白1空白9空白0空白0Enterなどのいくつも数字がバラける場合は入力に戻るプログラミングを作りたいのですがどなたか教えていただけないですか(T . T)

アバター
みけCAT
記事: 6734
登録日時: 14年前

RE: よろしければ

投稿記事 by みけCAT » 11年前

せんちゃ さんが書きました:末端までいけばEOFを返す仕様ですが、残念ながら標準入力では返されてなかったのでびっくりです。
IdeoneではちゃんとEOFが返されるようです。
https://ideone.com/jklGNJ
使用しているコンパイラ・環境は何ですか?

アバター
せんちゃ
記事: 50
登録日時: 14年前

RE: よろしければ

投稿記事 by せんちゃ » 11年前

みけCAT さんが書きました:
せんちゃ さんが書きました:
みけCAT さんが書きました: そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
標準入力から1文字取り出すのでキーボードの入力を受け付けると解釈しています。
やっていることはstdin指定のgetcをdefineで定義したものです。
「(標準入力をリダイレクトしていなければ)キーボードの入力を受け付ける」というのは正しいと言っていいと思います。
「コンソールに出力するためのもの」なんていう話は聞いたことがありません。
失礼しました、こちらの調査が足りてなかったです。

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: よろしければ

投稿記事 by みけCAT » 11年前

にょんた さんが書きました:statusつかわないで変数をおいて計算で書く方法ってありますか?^ ^
「計算で書く」とはどういうことですか?
statusを使いたくないのなら、例えばzyoutaiという「変数をおけば」いいと思います。

にょんた
記事: 5
登録日時: 11年前

Re: よろしければ

投稿記事 by にょんた » 11年前

変数の初期値を0として比較の動作をループさせることってできますか?^ ^

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: よろしければ

投稿記事 by みけCAT » 11年前

にょんた さんが書きました:変数の初期値を0として比較の動作をループさせることってできますか?^ ^
多分できると思いますが、具体的に何をしたいのかがよくわかりません。

にょんた
記事: 5
登録日時: 11年前

Re: よろしければ

投稿記事 by にょんた » 11年前

いまいちstatusの部分がわからなくて(T . T)

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: よろしければ

投稿記事 by みけCAT » 11年前

にょんた さんが書きました:いまいちstatusの部分がわからなくて(T . T)
とりあえず、構文解析の状態を変数に保持しない形で書き直してみました。

CODE:

	while(1) {
		/* 最初の空白を読み飛ばす */
		while((c=getchar())==' ' || c=='\t');
		if(c=='\n')continue; /* 空白しかなければ入力をやり直す */
		if(c==EOF)break; /* 入力の終わりなら抜ける */

		/* 数値を読み込む */
		if(c>='0' && c='0' && c=y*10+(c-'0')) {
					/* オーバーフローの簡易検出 */
					isValidNumber=0;
				}
				y=y*10+(c-'0');
			}
			if(!isValidNumber) {
				/* 有効な整数ではなかったので、入力をやり直す */
				if(c!='\n' && c!=EOF) {
					while((c=getchar())!='\n' && c!=EOF); /* この行の最後まで読み飛ばす */
				}
				continue;
			}
		} else {
			/* 数字ではない不正な文字なので、入力をやり直す */
			while((c=getchar())!='\n' && c!=EOF); /* この行の最後まで読み飛ばす */
			continue;
		}

		/* 数値の後の空白を読み込む */
		if(c!='\n' && c!=EOF) {
			int isValidInput=1;
			/* 不正な(空白ではない)文字が無いかチェックする */
			if(c!=' ' && c!='\t')isValidInput=0;
			while((c=getchar())!='\n' && c!=EOF) {
				if(c!=' ' && c!='\t')isValidInput=0;
			}
			if(!isValidInput)continue; /* 不正な文字があったので、入力をやり直す */
		}
		/* 入力された整数が範囲内なら、ループを抜ける */
		if(y>=1900 && y<=2100) {
			break;
		}
	}

にょんた
記事: 5
登録日時: 11年前

Re: よろしければ

投稿記事 by にょんた » 11年前

みなさん昨日はありがとうございました!
助かりました!(T . T)


なんかシンプルにかくとwhile文を4つでかけるらしくて
一つ目→スペースがまず0個以上あるか

2つ目→数字が0個以上あるか

3つ目→数字のあとにスペースが0個以上あるか

4つ目→スペースのあと文字とか数字なのかEnterなのか


最後にif文1つだけで1900から2100の範囲内だったら出力でできるらしいのですがどなたかわかりますか?

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: よろしければ

投稿記事 by みけCAT » 11年前

にょんた さんが書きました:なんかシンプルにかくとwhile文を4つでかけるらしくて
一つ目→スペースがまず0個以上あるか

2つ目→数字が0個以上あるか

3つ目→数字のあとにスペースが0個以上あるか

4つ目→スペースのあと文字とか数字なのかEnterなのか


最後にif文1つだけで1900から2100の範囲内だったら出力でできるらしいのですがどなたかわかりますか?
こんな感じでしょうか?

CODE:

	while((c=getchar())==' ' || (ungetc(c,stdin),0));
	while(c=getchar(),c>='0' && c=0&&(y=((y*10)/10==y?(y*10+c-'0'>=y?y*10+c-'0':-1):-1)),1):(ungetc(c,stdin),0));
	while((c=getchar())==' ' || (ungetc(c,stdin),0));
	while((c=getchar())=='\n'?0:((y=-1),c!=EOF));
	if(y>=1900 && y<=2100)printf("%d\n",y);

にょんた
記事: 5
登録日時: 11年前

Re: よろしければ

投稿記事 by にょんた » 11年前

ungetcとかつかわないでもかけますか?(T . T)

まだgetcharとかしかしらなくて(T . T)