プロが教える店舗&オフィスのセキュリティ対策術

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);
}

A 回答 (3件)

>丸投げですいません。

後でじっくり考えます。

じゃあ、じっくり考えてからもう一度質問して下さい。

この回答への補足

よく考えてみましたがこれでは実行できませんでした。しかし、どこが違うかがわかりません。すいませんが修正お願いします。
#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);
}

補足日時:2010/02/05 03:45
    • good
    • 0

おそらく、次のように入力すると


% 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文のところが穴埋めともにいまいちわかりません。

申し訳ありませんが、再度よろしくおねがいします。

補足日時:2010/02/05 03:03
    • good
    • 0

 これは 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;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!