• ベストアンサー

プログラミング(argcとargv)

入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。 #include <stdio.h> #include <stdlib.h> #define nMAX 10 int main(int argc, char **argv){ int sum = 0; if(argc < 2){ printf("Too few option!\n"); return 1; } int i, n; for(i = 1; i < argc; i++){ n = atoi(argv[i]); sum = sum + n; } printf("%d\n", sum); }

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

  • ベストアンサー
  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.1

合計は出ているので、計算式の表示で困っているということでしょうか。 暇なので計算式表示部分を書いてみました。 printf("%d\n", sum); の部分と置き換えます。 参考にしてください。 for (i=1; i<argc; i++) { n = atoi(argv[i]); if (i == 1) printf("%d", n); else printf("%+d", n); } printf("=%d\n", sum); 実行結果はこんな感じ。 $ ./sum -1 2 -3 4 0 -1+2-3+4+0=2

bluesky445
質問者

お礼

回答ありがとうございました。参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#144013
noname#144013
回答No.3

bluesky445さん、はじめまして。 計算式表示部分については、tyatsumiさんあるいは、asuncionさんが示されたソースそのままで 大丈夫だと思います。 あと、asuncionさんが示されたようにソース記述を出来るだけ簡略化するのも有効かと思います。 ※でもあまり簡略化しすぎるのも返って、一見しただけでは内容が判り辛くなることもありますので、 その辺はケースバイケースでお考えください。また、判り辛い部分は説明のコメントを入れておけば 良いと思います。 その他に、bluesky445さんが書かれたオリジナルのソースで問題があるとすれば、 main関数はint値を返す関数として宣言されていますので厳密にするならば、asuncionさんの 示されたソースのように、関数の最後にint値を返すreturn文が必要になります。 ※コンパイラによっては、このreturn文が無いためにエラーになってしまいます。 あとこれは蛇足というか、もう時代遅れの話になってしまいますので、あくまで参考意見として。 実行文の途中に下記の変数宣言がありますが、   int i, n; これはコンパイラによっては、こういう実行文内の変数宣言に未対応のため、エラーになる場合 があります。 あえて汎用性を求める場合は(特にコンソールアプリケーションの場合は)、この部分は実行文 の前にもっていった方が良いかも知れません。 もちろん、ご利用の環境内でのみの使用であれば全然問題ないと思います。 ※まぁ私自身オヤジなせいもあり古い形式に拘ってしまうので、ここはオッサンの戯言として  軽く受け流して下さい。^^; あと、ついでにと言ってはなんですが、小数点付き数値(浮動小数点値)対応バージョンも作って みました。参考にはならないかもしれませんが、一応載せてみます。 ◎このサンプルは、表示した際の計算式と合計値の見た目上の整合性をとるため小数点以下の  桁数を固定(#defineで指定)して計算しています。(このサンプルの小数点以下桁数は5桁) ◎入力値(加算値)の小数部が指定桁数以上の場合は、指定桁数+1桁目を四捨五入した後、  切捨てて補正してから加算処理をしています。 /* * sumf.cpp: 合計計算&表示プログラム(浮動小数点値対応版) * ・入力値(加算値)は指定した小数点以下桁数に補正後計算します。 * ・浮動小数点値の範囲、有効桁数は開発環境システムに依存します。 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define nPOI 5 /* 小数点以下桁数の指定 */ /* * Function: main */ int main(int argc, char **argv) { int i, s; double dd, dx; double da, db; char sFmt1[30]; char sFmt2[30]; char sFmt3[30]; double sum = 0.0; /* 入力値の有無チェック */ if(argc < 2){ printf("Too few option!\n"); return 1; } /* 計算式表示フォーマットの作成(指定小数点以下桁数の実数表示形式) */ sprintf(sFmt1, "%%.%df", nPOI); /*    1個目の加算値表示用 */ sprintf(sFmt2, " %%+.%df", nPOI); /*   2個目以上の加算値表示用 */ sprintf(sFmt3, " = %%.%df\n", nPOI); /* 合計値表示用 */ /* 入力値の数だけループ */ for(i=1; i<argc; i++){ dd = atof(argv[i]); /*  入力値(加算値)取得&実数値変換 */ s = 1; /*        サイン値セット(正:1) */ if(dd < 0.0) s = -1; /* サイン値セット(負:-1) */ db = modf(dd, &da); /*       加算値を整数部と小数部に分割 */ db = fabs(db); /*         小数部を絶対値に変換 */ db = (db * pow(10.0, (nPOI*1.0))) + 0.5; /* 小数点以下(n+1)桁を四捨五入 */ db = floor(db) / pow(10.0, (nPOI*1.0)); /*  小数点以下(n+1)桁以上を切捨て */ dx = da + (db * s); /*       加算値を再結合(整数部+補正後小数部×サイン値) */ sum += dx; /*           合計値に加算 */ if (i == 1) printf(sFmt1, dx); /* 加算値を表示 */ else printf(sFmt2, dx); } printf(sFmt3, sum); /*       合計値を表示 */ return 0; } <実行例> D:\Prog\test1>sumf 1 2 3 4 5 6 7 8 9 10 1.00000 +2.00000 +3.00000 +4.00000 +5.00000 +6.00000 +7.00000 +8.00000 +9.00000 +10.00000 = 55.00000 D:\Prog\test1>sumf -1 2.0048 .0000383 +1434.0043913 -.59993538 -1.00000 +2.00480 +0.00004 +1434.00439 -0.59994 = 1434.40929 D:\Prog\test1>sumf 0.999999 1.00000 = 1.00000 D:\Prog\test1>sumf -0.999999 -1.00000 = -1.00000 D:\Prog\test1>sumf -0.999994 -0.99999 = -0.99999 D:\Prog\test1>sumf -0.999995 -1.00000 = -1.00000 D:\Prog\test1>sumf 0.999994 0.99999 = 0.99999 D:\Prog\test1>sumf 0.999995 1.00000 = 1.00000

bluesky445
質問者

お礼

かなり詳しい回答ありがとうございました。勉強になりました。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int sum, i; if (argc < 2) { printf("Too few option!\n"); return 1; } for (sum = 0, i = 1; i < argc; i++) { int n = atoi(argv[i]); printf("%s%d", (i == 1) ? "" : (n >= 0) ? "+" : "", n); sum += n; } printf("=%d\n", sum); return 0; }

bluesky445
質問者

お礼

回答ありがとうございました。何とか完成させることができました。

すると、全ての回答が全文表示されます。

関連するQ&A