入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。
#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);
}
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
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
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
C言語 数字以外を入力させない...
-
#if 1 #elseの意味について
-
配列を使って魔方陣
-
プログラム
-
C言語 プログラム
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
非負整数nを読み込んで、1+...
-
直角三角形を表示するプログラム
-
階乗のプログラム!!
-
getcの改行判定
-
c言語についての質問です。
-
switch文をif文に変換
-
プログラミング(argcとargv)
-
「指定されたキャストは有効で...
-
数学(数列)の問題です。ーど...
-
独立係数について教えて下さい。
-
信頼区間の1.96や1.65ってどこ...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
C言語で電卓を作成する。
-
配列を関数に渡す方法
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
c言語プログラミングで1から100...
-
初心者です。for文、if文を使っ...
おすすめ情報