- ベストアンサー
この問題が解けません( iдi )
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
そういうプログラムをフリーソフトとして出してます。 で、結論からいうと、このプログラムは「どの程度まで」作りこむかを厳密に決めておかないと、ほいほいと簡単に作れるものではありません。 1.数式の間違いや入力ミスに対するエラー処理 2.文字←→数字の変換に関わる処理 3.カッコの優先処理 4.数学関数の処理 5.基本四則演算処理 俺が作ったプログラムは自分が使いたいだけなのでこれだけで充分ですが、さらに本格的にやるんならこれでもまだ全然足りません。 で、実際のところ、どの程度までできればいいんでしょうか?(^_^; 純粋に「??+??」という足し算ができればよくて、他の計算式は全く考慮しない、エラー処理も必要ないということであれば、 printf("%d", atoi(argv[1])+atoi(argv[3])); というプログラムが1行あれば事足ります。 ですが、四則演算全てに対応するなら argv[2] の内容が "+" "-" "*" "/" の4つのうちのどれか、もしくはそれ以外かによって処理を分岐する必要があります。 さらに演算記号が複数出てくる数式に対応したり、カッコのある計算式に対応したいということであれば、引数をすべて1つにまとめて文字列解析を行う、といった複雑な処理も必要になってきます。 どのレベルまで作りこむかによってアドバイスも変わってきますので、その辺を補足してください。
その他の回答 (4)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
[1] argv[n] が コマンドプロンプトで入力されたn番目の値 [2] 関数 atoi() で数字から数値に変換 [3] argv[2][0] == '+' なら加算、'-'なら減算
お礼
皆さんの力添えでなんとかできました。どうもありがとうございます。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 #2さんが回答されています、 printf("%d", atoi(argv[1])+atoi(argv[3])); この意味はわかりましたか? この意味と、文字比較の仕方を知っていれば解ける問題だと思います。 少し考えてみましょう^^
補足
はい。わかりました、考えてみます。どうもありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
何がわかりませんか? [1] コマンドプロンプトから値(文字列)を取り込むこと [2] [1]で得られた'数字'を'数値'に変換すること [3] [2]で得られた数値を足す/引くこと [4] [3]で得られた結果を表示すること 'わからない'を説明してください。
補足
[1][2][3]です。(ノ_<。)うっ ごめんなさい
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 どういった加算処理をしたいのでしょうか? もう少し具体的に処理の内容を教えてください。 それと、ご自身では、どこまで出来ましたか? 全く処理手順を思いつかないようでしたら考え方が全く身についてない、という事ですので、生にアドバイスを求めた方がご自身の為になると思います。 (身につかなくても本問題が解ければそれでいい、というのであれば回答させて頂きますが(笑)) とりあえず、表示したいだけならば、 printf("prog01 12 + 35\n47\n"); という、たった一行の命令で出来てしまいます。 多分、これでは問題の意図とは違いますよね。
補足
はい。現在ポインタ配列の問題をやっているのですが、windowsで、visualc++を使っています。そこで コマンドプロンプトにprog01 12 + 35と入力すると、 47を返すプログラムを作りたいのです。 もちろんprog01 12- 35とすれば-23を返す加減算プログラムです。実行する手順はわかるのですが、どうプログラムすればいいのか全くわかりません。ほかに頼る人がいなかったので投稿した次第です。申し訳ありません。
関連するQ&A
- main( )
次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) { if(argc!=3){ printf("2つの数を指定してください。"); exit(1); } printf("%f",atoi(argv[1])+atoi(argv[2])); return 0; }
- ベストアンサー
- C・C++・C#
- コマンドプロンプトを使用してのコマンドライン引数
winXPのコマンドプロンプトを利用して 参考書「独習C」を使い、C言語の学習をしています。 その本の7.4の項目~main()の引数~で main(int argc,char *avgv[])を利用すると コマンドラインから引数をとることができるとありますが 私の学習環境ではうまくいきません。 具体的には #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i=1; i<argc; i++) printf("%s ", argv[i]); return 0; } というプログラムを実行しても何も表示されません。 どうすればコマンドライン引数を利用できますか?
- ベストアンサー
- C・C++・C#
- C言語でコマンドラインの引数について。
コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。
- ベストアンサー
- C・C++・C#
- 二行目の*の意味を教えてください。
#include <stdio.h> int main(int argc, char *argv[]) { int i; for ( i = 0; i < argc; i++ ){ printf("argv[%d]=%s\n", i, argv[i]); } return argc; } 以上プログラムで、二行目の*の意味を教えてくさい。 6行目のargvには*が付いていません!? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- プログラミング(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); }
- ベストアンサー
- C・C++・C#
- strcmp,strcpy
a.outの後で入力した文字列を比較するコードでの質問です。 #include<stdio.h> #include<string.h> int mystrcmp(???){ ??? } int main(int argc,char*argv[]){ printf(???); exit(0); } ???の所をどう書けばいいか分かりません、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- コマンドラインから引数を渡すことについて
----------------------------------------------- #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[ ]) { FILE *fin,*fout; char ss[256]; if(argc != 3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルをオープンできません\n"); exit(1); } while(fgets(ss,256,fin)!=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; } ----------------------------------------------- 以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。 「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、 abcdef ABCDEF 012345 を「bbb.txt」にコピーしていきます。 そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、 >tcopy aaa.txt bbb.txt と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、 int main(int argc,char *argv[ ]) のargcに引数が何故代入されるかが分かりません。 後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。 教えていただければ嬉しいです。
- ベストアンサー
- C・C++・C#
- ポインタのポインタ
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv){ int i; if(argc != 2) { fprintf(stderr, "Usage: %s vector\n\tEx: %s 11110000\n", argv[0], argv[0]); return 1; } for(i=0;i<8;i++){ if(**argv == '0'){ printf("%d\n",i); } else{ printf("A%d\n",i); } argv++; } return 0; } コンパイルして./a.exe 10010011などと入力しても A0 A1 Segmentation Faultとなります。 どうすれば、 A1 0 ・・・省略 for文で回した8回分、出力が可能になるのか教えてください。 初歩的な質問ですいません。
- ベストアンサー
- C・C++・C#
補足
たびたびのご回答本当にありがとうございます。 私は大学1年生の全くの初心者です。おそらくただ純粋に足し算ができればよいものであると思います。 問題にある /*ここに処理の記述*/ と書かれている場所に何らかを記述するだけの課題ですので、全く深いものではありません。