プログラムのことで

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

プログラムのことで

#1

投稿記事 by Sora » 16年前

だいぶ前に投稿させてもらったSoraです。
プログラムとにらめっこしてみたり、C言語のサイトを見てみたりしたのですが
やっぱり解らないというか、どうしたらできるのか解りません。
#include<stdio.h>    /*stdio.hをインクルードする*/
#include<string.h>   /*string.hをインクルードする*/
#include<ctype.h>    /*ctype.hをインクルードする*/ 

int main(){                                          /*メインクラス*/
	int cnt=0,max1=0,cnt2=0,i=0,swich=0,soe=0;       /*int型宣言*/
	char str[128],max[128],su[128];                  /*char型で宣言*/

	printf("数字を10回入力してください。\n");
	
	while(cnt2<10){
		i=0;
		printf("%d回目の入力をしてください。" , cnt2+1);
		/*scanf("%c" , su);*/
			while(1){
				swich = 0;
				scanf("%c" , &su);
				if(su == '\n'){
					su = '\0';
					swich = 2;
					break;
				}
				if(isdigit(su)==0){
					swich = 1;
					break;
				}
				i++;
			}
			if(swich == 1){
				printf("数値を入力しなおしてください\n");
				continue;
			}
			if(swich == 2 && i == 0){
				printf("未入力ですもう一度入力してください。\n");
				continue;
			}
			for(i=0;i<strlen(su);++i){
				if((su%2) != 0){
					if(su>max1){
						max1 = su;
					}
				}
			}
			cnt2++;
	}
	printf("一番大きい奇数は>%d" , max1);
	rewind(stdin);          /**/
	getchar();
}


2つのプログラムの後半なので、切る部分が適切でないかもしれませんが;
やりたいことは

・scanf関数を使用して、数字を10回入力し、最も大きな奇数を表示しなさい。
※未入力、半角数値以外の入力はエラーとし、もう一度入力できるようにする事。

です。
未入力半角数値以外という入力エラーがまじめに解りません;
どこをどのように改変すれば出来る様になるのか、がわかりません。
前もご指南いただいたのですが、改変する場所が違ったのか出来ませんでした。

よろしくお願いします。

Dixq (管理人)

Re:プログラムのことで

#2

投稿記事 by Dixq (管理人) » 16年前

とりあえず、キーボードから数値入力を読み取り、エラーが起きると再入力を促すサンプルを作ってみました。

#include <stdio.h>

/* キーボード入力された int 型データを引数に格納する */
/* 関数値 0:正常 1:異常 */
int GetInt(int *iVal){
	int iRet;
	if( scanf( "%d", iVal ) != 1 ) {//正常に格納されなかったら
		iRet = 1;
	} else {
		iRet = 0;
	}
	while( getchar() != '\n' );//改行まで読み飛ばす
	return iRet;
}

int main(void){
	int i;
    int iVal[5];
	for(i=0; i<5; i++){
		printf("%d個目の数値を入力して下さい-> ", i+1 );
		if( GetInt( &iVal ) == 0 ){
			printf( "[%d]を格納しました\n\n", iVal );
		} else {
			printf( "エラーです。再入力して下さい\n\n" );
			i--;
		}
	}
	printf( "\n**配列に格納された数の一覧**\n" );
	for(i=0; i<5; i++){
		printf("[%d]\n", iVal );
	}

    return 0;
}

実行結果(例)

1個目の数値を入力して下さい-> 1010
[1010]を格納しました

2個目の数値を入力して下さい-> 200s123
[200]を格納しました

3個目の数値を入力して下さい-> s2000
エラーです。再入力して下さい

3個目の数値を入力して下さい-> -2-2
[-2]を格納しました

4個目の数値を入力して下さい-> 2k2k
[2]を格納しました

5個目の数値を入力して下さい-> 100000000000000000000000000
[-469762048]を格納しました


**配列に格納された数の一覧**
[1010]
[200]
[-2]
[2]
[-469762048]

実行結果例で5回いろんな入力をしてみたので、その時々によって、どうなるのか確認して下さい。
一つ弱点なのが、オーバーフローしてしまう点ですが、そこまで条件わけ処理しろと書いてないので大丈夫かと。
これがわかれば課題は解けますかね?

Dixq (管理人)

Re:プログラムのことで

#3

投稿記事 by Dixq (管理人) » 16年前

入力された数値が奇数が偶数か判定するサンプルです。
#include <stdio.h>

int main(void) {
	int a;
	scanf( "%d", &a );
	if( a % 2 == 0 ){
		printf( "%dは偶数です\n", a );
	} else {
		printf( "%dは奇数です\n", a );
	}
    return 0;
}

実行結果

101
101は奇数です
 
2わったあまりが0なら偶数、1なら奇数であるとわかりますね。

答えこの辺においときます。 h ttp://dixq.net/code/kotae.html

Dixq (管理人)

Re:プログラムのことで

#4

投稿記事 by Dixq (管理人) » 16年前

そういえば、

	if( a % 2 == 0 ){
		printf( "%dは偶数です\n", a );
	} else {
		printf( "%dは奇数です\n", a );
	}

これじゃ負の数が計算できませんね

	if( a % 2 != 0 ){
		printf( "%dは奇数です\n", a );
	} else {
		printf( "%dは偶数です\n", a );
	}

に訂正します

non

Re:プログラムのことで

#5

投稿記事 by non » 16年前

とりあえず、添付されたプログラムでは最大値が出ないでしょうから
for(i=0;i<strlen(su);++i){
				if((su%2) != 0){
					if(su>max1){
						max1 = su;
					}
				}
			}
		この部分を
			if(max1<atoi(su) && atoi(su)%2)
				max1=atoi(su);
		このように変更したら動きます。

kazuoni

Re:プログラムのことで

#6

投稿記事 by kazuoni » 16年前

このスレのおかげでまた知らない関数・文知りましたw
continueは使えそうな気がしますが・・・
なんだか多用すると思わぬバグ引き起こしそうですね。。
あとコード全体がみづらくなりそうな・・・。

isdigitも全然知りませんでした^^;
勉強になります。

失礼しました

閉鎖

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