よろしければ

にょんた
記事: 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)

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

Re: よろしければ

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

あぁ、すいません。日記か掲示板って書いたのが悪かったですね。
本当は掲示板に書くのがベストなのですよね。
僕の責任です。
まずはコードタグを使うと良いですよ。

CODE:

#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;
}
最後に編集したユーザー せんちゃ on 2014年4月23日(水) 23:03 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前

Re: よろしければ

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

こういうのは、質問掲示板でどうぞ。
本当に日記、単なる報告、雑談などが日記の役割だと思います。

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

Re: よろしければ

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

「いまこの中にあるものだけ」という縛りの内容がよくわからないですが、
とりあえず西暦の入力部分を実装してみました。
月も同様にできるはずです。

CODE:

	while(1) {
		int status=0; /* 0:数字の前 1:数字 2:数字の後 3:不正 */
		y=0;
		while((c=getchar())!='\n' && c!=EOF) {
			if(c==' ' || c=='\t') {
				/* 空白 */
				if(status==1)status=2;
			} else if(c>='0' && cy*10+(c-'0'))status=3; /* オーバーフローの簡易検出 */
					y=y*10+(c-'0');
				}
			} else {
				/* その他の文字 */
				status=3;
			}
		}
		if(status==1 || status==2) {
			/* 有効な数値が入力されたら */
			if(y>=1900 && y<=2100)break; /* 数値が範囲内ならループを抜ける */
		}
	}
最後に編集したユーザー みけCAT on 2014年4月23日(水) 23:09 [ 編集 1 回目 ]
理由: EOFも検出するようにしました。

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

RE: よろしければ

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

にょんた さんが書きました: 空白空白1900空白空白Enterとかであればokで
空白1空白9空白0空白0Enterなどのいくつも数字がバラける場合は入力に戻るプログラミングを作りたいのですがどなたか教えていただけないですか(T . T)
条件的にはまず空白(タブ含める?)か数値(0位上9以下)の文字コードであれば戻らない、そうでなければ戻る
というように考えてみるとこの手のコードは良いと思います。
まずgetcharはキーボード入力をコンソールに出力するためのものです。
入力された文字コードを1文字ずつ取り出します。

なので西暦を入力してもらった後に入力文字を1文字ずつ確認して空白なら無視、数字ならやりたい処理を、それ意外なら再度入力し直し
というシーケンスを作ってみるといいと思います。
あとgetcharは何もないときはEOFを返すので'\n'ではなくEOFで見ると良いかもしれません

すいません、今試してみたらなぜかEOFを返してなかったので\nのほうが良さそうですね。。。
(ファイルの終端を読み取った時にEOF返すって関数辞典に書いてあったのにぃぃーー!!)
最後に編集したユーザー せんちゃ on 2014年4月23日(水) 23:36 [ 編集 1 回目 ]

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

みなさん

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

ご親切にありがとうございます(T . T)


statusというのがよくわからないのですがどの様なとき使うのですか?(T . T)

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

RE: よろしければ

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

せんちゃ さんが書きました:まずgetcharはキーボード入力をコンソールに出力するためのものです。
そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
せんちゃ さんが書きました:あとgetcharは何もないときはEOFを返すので'\n'ではなくEOFで見ると良いかもしれません
「何もないとき」とはどのような時ですか?
今回の場合、(特殊な端末を利用しているのでなければ?)EOFかどうか見るだけでは自然な動作にならないと思います。
にょんた さんが書きました:statusというのがよくわからないのですがどの様なとき使うのですか?(T . T)
基本的には、その名の通りステータスを表すのに使うのがいいと思います。
この場合、今解析したい文字列のどの部分に相当する入力まで読み込んだか、という情報を保持しています。

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

Re: よろしければ

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

statusつかわないで変数をおいて計算で書く方法ってありますか?^ ^

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

RE: よろしければ

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

みけCAT さんが書きました: そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
標準入力から1文字取り出すのでキーボードの入力を受け付けると解釈しています。
やっていることはstdin指定のgetcをdefineで定義したものです。
みけCAT さんが書きました: 「何もないとき」とはどのような時ですか?
今回の場合、(特殊な端末を利用しているのでなければ?)EOFかどうか見るだけでは自然な動作にならないと思います。
入力の末端までいったときのことです。
末端までいけばEOFを返す仕様ですが、残念ながら標準入力では返されてなかったのでびっくりです。

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

RE: よろしければ

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

せんちゃ さんが書きました:すいません、今試してみたらなぜかEOFを返してなかったので\nのほうが良さそうですね。。。
(ファイルの終端を読み取った時にEOF返すって関数辞典に書いてあったのにぃぃーー!!)
ファイルの終端はファイルの終端です。
標準入力がキーボードである場合、例えば、
WindowsならCtrl+Z、LinuxやMacならCtrl+Dなどで入力の終了を通知すると、EOFが読み込まれるだろうと思います。

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

RE: よろしければ

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

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