C言語の課題が全くわかりません。
(1)~(5)には何が入りますか?
丸投げですいません。後でじっくり考えます。
お願いします。
コマンド行引数に整数と符号(+、ー)を指定し、
その和を表示するプログラム。
例%calc -5+10+100-10=95と表示するプログラム
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int sum=0,i=1;
if(argc(1)1)
put("komanasi");
else if(argv[i],(2)=='+'){
i++;
sum += atoi(argv[i(3)]);
}else if (argv[i],(2)=='-'){
i++;
sum-=atoi(argv[i(3)]);
}else
sum+=atoi(argv[i(3)]);
while((4)<(5)){
if(argv[i],(2)=='+'){
i++;
sum+=atoi(argv[i(3)]);
}else{
i++;
sum-=atoi(argv[i(3)]);
}
}
printf("%d\n",sum);
return(0);
}
No.3ベストアンサー
- 回答日時:
これは atoi(argv[i]) が使われている関係から、引数は半角スペースなどで区切られた
%calc - 5 + 10 + 100 - 10
といった起動方法となります。
ローカル変数が sum, i と決められてしまっており、argv[i] も決められていることから ↓のようになります。なお、put() は puts() に、また if分岐も実情に合わせて若干手を加えてあります。
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]) {
int sum=0,i=1;
if(argc == 1)
puts("komanasi");
else {
if(argv[i][0] == '+') {
i++;
sum+= atoi(argv[i]);
} else if (argv[i][0]=='-') {
i++;
sum-=atoi(argv[i]);
} else
sum+=atoi(argv[i]);
while(++i<argc) {
if(argv[i][0]=='+') {
i++;
sum+=atoi(argv[i]);
} else {
i++;
sum-=atoi(argv[i]);
}
}
printf("%d\n",sum);
}
return 0;
}
No.2
- 回答日時:
おそらく、次のように入力すると
% calc - 5 + 10 + 100 - 10
95
と表示するプログラムの問題なのだと予想します。
また、argv[i],(2)のところはargv[i](2)の間違いではないかと予想しています。
直接答えを書くのも芸が無いので、ほとんど答えをいっているのではないかというヒントを書いていきます。
> if(argc(1)1)
> put("komanasi");
これは、数式が与えられなかった場合の判定です。
argcはコマンドラインで与えられた引数の数を示すわけですから、何もない場合は必然的に1ですよね。
> else if(argv[i](2)=='+'){
> i++;
> sum += atoi(argv[i(3)]);
> }else if (argv[i](2)=='-'){
> i++;
> sum-=atoi(argv[i(3)]);
> }else
> sum+=atoi(argv[i(3)]);
+や-で始まる場合は+や-として計算を予めする必要があるので、初期値として0が入っているsumに値を足したり、値を引いたりしています。+や-で始まっていない場合は最後のelseに来て、そのままsumに値が足されます。
argv[i](2)についてですが、ここでは+や-といった符号を読み出し、sumに足すのか、引くのかを判定します。
argv[i]だと文字列を表すので、その文字列の先頭の文字を読みだします。
文字列は配列で表現されているので先頭を見るには配列の0番目を見ればよいわけですね。
sum+=atoi(argv[i(3)]);のところは、argv[i]で表される文字列をatoiで数値に変換してsumに足すという操作を表します。sum-=atoi(argv[i(3)]);はargv[i]で表される文字列をatoiで数値に変換してsumから引きます。
ここで、この値の処理は終わったわけなので、iの値を1つ増やしてargv[i]で参照する箇所を移動させます。iの値を1つ増やす方法はi++ですね。
> while((4)<(5)){
> if(argv[i](2)=='+'){
> i++;
> sum+=atoi(argv[i(3)]);
> }else{
> i++;
> sum-=atoi(argv[i(3)]);
> }
> }
あとは、引数が続く限り足し算と引き算を行います。
argv[i]はいくつか続く引数の文字列のi番目の文字列を示します。
無意味なところを見ないためには引数の個数を示すargcよりも小さい範囲でiを増やしながらargv[i]を調べていけばよいわけです。
> printf("%d\n",sum);
> return(0);
> }
すべての計算が終わったらsumを表示して終了します。
ちなみに、足し算と引き算だと演算子の順位が無いので上記のような単純なプログラムでかけますが、掛け算や割り算、括弧が入ると足し算や引き算より優先して計算しなくてはなりませんので少なくとも演算子順位構文解析を行わなくては計算ができません。演算子順位構文解析をさらに強力にするとC言語などのプログラミング言語の解析もできるようになります。まぁ、余談ですが。
この回答への補足
ありがとうございます。とてもわかりやすかったです。
しかし、while文のところが穴埋めともにいまいちわかりません。
申し訳ありませんが、再度よろしくおねがいします。
No.1
- 回答日時:
>丸投げですいません。
後でじっくり考えます。じゃあ、じっくり考えてからもう一度質問して下さい。
この回答への補足
よく考えてみましたがこれでは実行できませんでした。しかし、どこが違うかがわかりません。すいませんが修正お願いします。
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int sum=0,i=1;
if(argc<=1)
put("komanasi");
else if(argv[i][0]=='+'){
i++;
sum += atoi(argv[i++]);
}else if (argv[i][0]=='-'){
i++;
sum-=atoi(argv[i++]);
}else
sum+=atoi(argv[i++]);
while(1<argc){
if(argv[i][0]=='+'){
i++;
sum+=atoi(argv[i++]);
}else{
i++;
sum-=atoi(argv[i++]);
}
}
printf("%d\n",sum);
return(0);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
干支のプログラム
-
c言語の文字列の逆順のプログラ...
-
分割した単語の頻出頻度を表示...
-
C言語のfor文です。 繰り返しの...
-
コンパイルエラー invalid ope...
-
配列をnビットシフトする
-
C言語です
-
構造体の各メンバにfor文からア...
-
C言語エラーについて
-
charからLPTSTRへの変換方法
-
文字を16進変換
-
「ポインタのポインタ」を使っ...
-
'const char *' 型は 'char *' ...
-
double型の値をchar配列に変換...
-
宣言する関数の形が決まってい...
-
【C言語】文字型と整数型の違い
-
決まった文字列幅でのスクロール
-
間接操作のレベルとは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報