C言語について

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

C言語について

#1

投稿記事 by momo » 12年前

C言語について

①「以下の操作を繰り返し、0が入力されると終了するプログラムを作成する。

8桁以内の整数値を読み込み、これが正数なら下位桁から、負数なら上位桁から1桁づつ切り出し、1行に8個の数を表示する。」

下記のソースをもっと簡単にしたいのですがどうすればいいですか?

コード:

#include <stdio.h>
 
int main(void){
 int x;
 int hu_or_sei;
 int temp;
 char kekka[8];
 char i;
 
while(1){
 printf("input X: ");
 scanf("%d",&x);
 if(x==0)break;
 
if(x/100000000 != 0){
 printf("over 8 KETA!!!\n");
 }
 
if(x>0){
 hu_or_sei=1;
 }
 else{
 hu_or_sei=0;
 x*=-1;
 }

 temp=10000000;
 for(i=0;i<8;i++){
 kekka[i]=x/temp;
 x-=(x/temp)*temp;
 temp/=10;
 }
 
if(hu_or_sei==1){
 for(i=0;i<8;i++){
 printf("%d ",kekka[7-i]);
 }
 printf("+\n");
 }
 else{
 for(i=0;i<8;i++){
 printf("%d ",kekka[i]);
 }
 printf("- \n");
 }
 }
 return 0;
 }
 

ふりかけ

Re: C言語について

#2

投稿記事 by ふりかけ » 12年前

c++の勉強をしているものです。cには当てはまらないかもしれないけど。
ひとケタずつ配列に代入している部分で、tempを使わずに

{
kekka = x % 10; //10で割った余りは1の位の数ですよね
x /= 10; //ひとケタ詰める 1の位が消える
}

という風にしてはどうでしょう? 配列に入る数は逆の順番になりますが。
ホントに簡単なのは、入力された数字をそのまま文字列にとりこんじゃう関数を使うことです、cにあるのか分かりませんが。
stringstream でできます。検索して、すごく簡単になると思います。

nazu

Re: C言語について

#3

投稿記事 by nazu » 12年前

コードを簡単にする前に、いくつか気になる点を。

1.ユーザーが9桁以上入力した場合に処理が続行されています。
 ここの対応はしなくていいのでしょうか。

2.整数値の切り出しが上位部からのみ行われていて、仕様と異なっています。

3.正の数の場合は左寄せで表示され、負の数の場合は右寄せで表示されていますが、統一をしなくて良いか。

4.インデントをしっかりしてほしいです。

non
記事: 1097
登録日時: 13年前

Re: C言語について

#4

投稿記事 by non » 12年前

ふりかけ さんが書きました:ホントに簡単なのは、入力された数字をそのまま文字列にとりこんじゃう関数を使うことです、cにあるのか分かりませんが。
stringstream でできます。検索して、すごく簡単になると思います。
sprintf(kekka,"%08d",x);
を使うことはできます。ただし、配列は9文字分確保しておくこと。
それから、文字なので、出力を%cにするか、0x30を引くこと。

でも、簡単にするとは短くすればすればよいのでしょうか?
アルゴリズムが分かりやすい方がいいと思います。
最初のプログラムで特に問題はないと思いますよ。

強いて言えば、
ふりかけさんが書かれているように下の桁から取り出す方が処理が
若干早いかもしれません。
non

hss12
記事: 40
登録日時: 12年前

Re: C言語について

#5

投稿記事 by hss12 » 12年前

回答ではないですが趣向を変えて。
エラー処理が汚くてすみません。

コード:

#include <stdio.h>
#include<string.h>
#include <ctype.h>

int main(void){
	char x[100];
	unsigned int i;

	while(1) {
		printf("input X: ");
		scanf("%s", x);
		
		if (x[0] == '0') break;
		if (x[0] == '-' && (strlen(x) > 9)) return -1;
		if (x[0] != '-' && (strlen(x) > 8)) return -1;
		
		if (x[0] == '-') {
			for (i = 1; i < strlen(x); i++){
				if (isdigit(x[i]) == 0) return -1;
				printf("%c ", x[i]);
			}
		} else {
			i = strlen(x);
			while (i-- > 0) {
				if (isdigit(x[i]) == 0) return -1;
				printf("%c ", x[i]);
			}
		}
		puts("");
	}
	return 0;
}

閉鎖

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