• ベストアンサー

printfやsprintfで、0に符号 (+) をつけない方法

Perlの問題ではないのかなとも思うのですが、 my @num1 = (1, 0, 2, 0); my @num2 = (0, -3, 0, 2); foreach my $num1 (@num1) { my $num2 = shift @num2; printf "%+d%+d\n", $num1, $num2; } などと%+dとすると、0の場合に+0となってしまいます。これを単純に0とするシンプルなやり方はないでしょうか?この場合は foreach my $num1 (@num1) { my $num2 = shift @num2; if ($num1) { printf "%+d%+d\n", $num1, $num2 } else { printf "0%+d\n", $num2 } } とすることで満足する結果となりますが、複数の数値部分で+0となるのを回避したい場合など、このようなif文でやると変に複雑なスクリプトになると思うのですが、そうするしかないでしょうか?

  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

my $format = ($num1>0 ? "%+d":"%d").($num2>0 ? "%+d":"%d")."\n"; printf $format, $num1, $num2; とするとか あるいは、sprintfして、s/\+0/0/g するとか

kapura
質問者

お礼

三項演算子をこんな風に使うといいんですね。0とそれ以外というイメージでばかり考えていて、0の場合と負数の場合に%dにするというのは、なるほどと思いました。 上の例では$num2の方は常に%+dでいいので、正確には my $format = ($num1>0 ? "%+d" : "%d") . "%+d\n"; あるいは my $format = ($num1 ? "%+d" : "%d") . "%+d\n"; でしょうか。sprintして、その中の+0のところを置換するというのも、この部分が加わるだけでシンプルでいいですね。 上の例では s/^\+0/0/ な感じかな。勉強になりました。ありがとうございます。

その他の回答 (1)

  • tyunji
  • ベストアンサー率19% (68/349)
回答No.1

表示部分だけサブルーチンにしてしまえば、見た目は複雑にならないと思います。

kapura
質問者

お礼

確かに複雑にならなかったとしても、表示部分を明確にした方が、後で読みやすくていいと思いました。 引数が+0だったら0を返すような関数を自作して使うのもいいかもしれないですね。 ありがとうございます。

関連するQ&A

  • ifと不等記号( < & > )のみを使って、最大数と最小数を求める (* 超初心者です)

    宿題でifと不等記号( < と>)のみを使って、3つの入力された整数の中から最大数と最小数を求めるプログラムを作っているのですが、コンパイルには成功してもいざ実行すると、恐らくエラーが起きていて、数字を入力しても何も出来ません。 下記の文字列はそのifの所のみを貼ったものですが、何が間違っているのでしょうか? ちなみにelseとかは使えません m(_ _)m 純粋にifと不等記号のみしか使ってはダメみたいです。 if( num1 > num2 > num3 ) { printf( "Smallest is %d\n", num3 ); printf( "Largest is %d", num1 ); } /* end if */ if( num1 > num3 > num2 ) { printf( "Smallest is %d\n", num2 ); printf( "Largest is %d", num1 ); } /* end if */ if( num2 > num1 > num3 ) { printf( "Smallest is %d\n", num3 ); printf( "Largest is %d", num2 ); } /* end if */ if( num2 > num3 > num1 ) { printf ( "Smallest is %d\n", num1 ); printf ( "Largest is %d", num2 ); } /* end if */ if( num3 > num1 > num2 ) { printf ( "Smallest is %d\n", num2 ); printf ( "Largest is %d", num3 ); } /* end if */ if( num3 > num2 > num1 ) { printf ( "Smallest is %d\n", num1 ); printf ( "Largest is %d", num3 ); } /* end if */

  • モジュール分割とユーザ関数

    c言語初心者です。 ユーザー関数を作って、下記のプログラムをどのようにモジュール分割すればいいと思いますか。教えてください。 //n進数の四則演算 #include <stdio.h> void main() { int ch; /* 入力文字ワーク */ int ntype = 0; /* n進数 */ int num1 = 0; /* 数値1 */ int op; /* 演算子 */ int num2 = 0; /* 数値2 */ int ans; /* 演算結果 */ printf("\nInput n(numeral type 2-16)\n"); while ((ch = getchar()) != '\n') { if (ch >= '0' && ch <= '9') { ntype = ntype * 10 + ch - '0'; } else { printf("Numeral type incorrect! 01\n"); return; } } if (ntype < 2 || ntype > 16) { printf("Numeral type incorrect! 02\n"); return; } printf("\nInput numeral1\n"); if ((ch = getchar()) == '\n') { printf("Numeral1 incorrect!\n"); return; } while (ch != '\n') { if (ntype <= 10) { if (ch >= '0' && ch <= '9' - (10 - ntype)) { num1 = num1 * ntype + ch - '0'; } else { printf("Numeral1 incorrect! 03\n"); return; } } else { if (ch >= '0' && ch <= '9') { num1 = num1 * ntype + ch - '0'; } else { if (ch >= 'a' && ch <= 'f' - (16 - ntype)) { num1 = num1 * ntype + ch - 'a' + 10; } else { printf("Numeral1 incorrect 04!\n"); return; } } } ch = getchar(); } printf("\nInput operator\n"); op = getchar(); if (op != '+' && op != '-' && op != '*' && op !='/') { printf("Operator incorrect! 05\n"); return; } if (getchar() != '\n') { printf("Operator incorrect! 06\n"); return; } printf("\nInput numeral2\n"); if ((ch = getchar()) == '\n') { printf("Numeral2 incorrect! 07\n"); return; } while (ch != '\n') { if (ntype <= 10) { if (ch >= '0' && ch <= '9' - (10 - ntype)) { num2 = num2 * ntype + ch - '0'; } else { printf("Numeral2 incorrect! 08\n"); return; } } else { if (ch >= '0' && ch <= '9') { num2 = num2 * ntype + ch - '0'; } else { if (ch >= 'a' && ch <= 'f' - (16 - ntype)) { num2 = num2 * ntype + ch - 'a' + 10; } else { printf("Numeral2 incorrect! 09\n"); return; } } } ch = getchar(); } switch (op) { case '+': ans = num1 + num2; break; case '-': ans = num1 - num2; break; case '*': ans = num1 * num2; break; case '/': if (num2 == 0) { printf("\nCan't divide by 0\n"); return; } ans = num1 / num2; } printf("\nThe answer is %d\n", ans); }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • 四則演算のプログラム

    自力で解きたかったのですが、二時間考えても、とけないので 投稿させていただきます。どこを直せばよいのでしょうか 実行するときは%プログラム名 + 5 12 と入力して実行したいです。加えて参照にしている部分の %の扱いについても教えていただけると幸いです。 #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ char kigou; double num1,num2; kigou=atof(argv[1]); num1=atof(argv[2]); num2=atof(argv[3]); if(kigou=='+'){ printf("%f+%f=%f\n",num1,num2,num1+num2); } else if(kigou=='-'){ printf("%f-%f=%f\n",num1,num2,num1-num2); } else if(kigou=='x'){ printf("%f*%f=%f\n",num1,num2,num1*num2); } else if(kigou=='/'){ printf("%f/%f=%f\n",num1,num2,num1/num2); } /* else if(kigou=='%'){ printf("%f%%f=%f\n",num1,num2,num1%num2); }*/ else{ printf("Please input +,-,x,%%.\n");} }

  • printfでの計算結果がおかしくなります。

    #include <stdio.h> main() { int first_num, second_num, third_num; /* 入力される3整数 */ int answer; /* 掛け算の答え */ printf("Input Integer Number 1 > "); scanf("%d", &first_num); printf("Input Integer Number 2 > "); scanf("%d", &second_num); printf("Input Integer Number 3 > "); scanf("%d", &third_num); answer = first_num * second_num * third_num; printf("%d * %d * %d= %d\n", first_num, second_num, third_num, answer); exit(0); } というプログラムを作りコンパイルして、いざ実行して 以下の計算をさせると。 10000×10000×10000=-727379968 という計算結果になってしまいます。 なんども確認したのですが、間違っているところはないと思います。

  • 数当てゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int num; int no; int max=11; int limit=0; srand(time(NULL)); /*乱数の値を初期化*/ no = rand() %1000; do{ printf("あと入力回数は%d回です。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>=1000 || num<=-1000) { printf("-999以上999以下の整数を入力してください。\n"); return -1; } if(num>no) { printf("\a大きいです。\n"); } else if(num<no) { printf("\a小さいです。\n"); } }while(no!=num && limit<max); if(no==num) { printf("正解です。\n"); printf("%d回で当たりました。\n",limit); } else { printf("残念です。当たりませんでした。\n"); printf("正解は%dでした。\n",no); } return 0; } これは、0以上999以下の整数を入力させて11回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 「0以上999以下」→「-999以上999以下」に変更するにはどうすれば よいかです。 一部、「-999以上999以下」の値を入力してくださいとなっていますが 結局わからずにそのままになっているためです。 よろしくお願いいたします。

  • if-else文および標準演算子(*/+-%)の入力方法

    度々失礼します。 C言語超初心者のものです。QNo.3392139(回答してくださった皆さんありがとうございます。)でも質問させていただきましたが、詳細が足りないようなので、 ここで再度質問をさせていただきます。 プログラミング内容 (1)Enter first integer: 17 [好きな数値選択] (2)Enter operator:(*/+-%) [好きな演算子選択] (3)Enter second integer:5 [好きな数値選択] というように数字・標準演算子・数字の順でキーボードから入力し、 (4)17 / 5 = 3 を(1)~(4)までDOS画面?上に表示させるものです。 そして、if-else文を作成して、以下のようにプログラムを組んでみたのですが(標準演算子は”/”を選択するようにしています)、 else文のところで”parse erro before 'else' ”というエラーが出てしまいます。このエラーがなくなれば、プログラムはうまく起動すると思うのですが・・・。 どこが悪いのでしょうか? まあ、超初心者なので、使える言語はint、float、char、そして関数はscanf、if-else文、位です。 int main() { int num1, num2, num4, num5, num6; char chr; printf("Enter the first integer: "); scanf("%d",&num1); scanf("%c",&num5); printf("Enter an operator (* / + - %): "); scanf("%c",&chr); scanf("%c",&num6); printf("Enter the second integer: "); scanf("%d",&num2); if(chr == '/') num4 = num1 / num2; printf("%d / %d = %d\n", num1, num2, num4); else printf("Can not\n"); system("pause"); return 0; } 大変皆さんお忙しいとは思いますが、出来たらお願いします。 査閲ありがとうございます。

  • printfが!

    int main(void){ .... while(!(i==EOF)){ num=0; while((i=fgetc(stream))!='\n'){ if(i==EOF) break; str[num]=i; num++; } kannsuu1(); kannsuu2(); } return 0; void kannsuu1(void){ printf("出力されない"); for(i=0;str[i]!=NULL;i=i+2){ printf("%c%c",str[i],str[i+1]);/*これも出力されない*/ } } void kannsuu2(void){ .... } 簡単に上記のように記述したプログラムがあるのですが、コンパイラの警告はまったくかかりませんでしたが、関数の中のprintfがdosプロンプトに出力されないのですよ。だれか心あたりがありましたらおしえてもらえないでしょうか? お願いいたします。

  • Cプログラムの条件文  if,else if ,elseについて教えてください。

     こんにちは。課題でどうしても解らないところがあるので教えてください。  次のプログラムは一桁の数(0~9)が偶数(EVEN)か奇数(ODD)かを表示するものです。  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); else printf("%d is an ODD. \n", num); } というプログラムをコンパイルして実行すると、ちゃんと実行されるのですが、10以上の数や負数を入力しても動作してしまうんです。  そこで0~9の範囲以外の数が入力されていないかを確認して、その場合を偶数、奇数の判断や表示をせず、エラーメッセージだけを表示して終了するプログラムに書き換えなくてはならないのですが、まず  (1)判断する条件式(変数numの内容が0~9の範囲にあるか)で、num >= 0 && num <= 9 をどこに入れればいいか。  (2)please enter a number[0~9]: 8 8 is an EVEN.  (←例えば8を入れると普通こうなるのですが)   please enter a number[0~9]:12   ERROR:12 is in out of range!!  (←0~9以外ののものだったら、この様にエラー表示にしたいのです。  私が考えたプログラムは  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); if else printf("%d is an ODD. \n", num); else(num >= 0 && num <= 9) printf("ERROR:%d is in out of range!! \n",num); } という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

  • printf scanf が、反応しません。

    printf scanf が、反応しません。 #include <stdio.h> int main(void) { int num = 0; int sum = 0; printf("テストの点数を入力してください。(0で終了)\n"); do{ scanf("%d", &num); sum += num; }while(num); printf("テストの合計点は%d点です。\n", sum); return 0; } C:\WORK>gcc test1.c C:\WORK>gcc -o test1 test1.c おかしいです。 打開策を教えてください。 ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

専門家に質問してみよう