• ベストアンサー
  • すぐに回答を!

プログラミングに自信のある方是非解答をお願いします

問題は以下です。 以下のプログラムは、整数の数式を入力して、式の値を求めて表示するプログラムである。このプログラムを発展させて、さらに高機能にせよ。(何をする機能を加えたかについての解説もお願いします。) #include <stdio.h> #include <stdlib.h> #include <ctype.h> static int ch; void error(char *s) { fprintf(stderr, "%s\n", s); exit(EXIT_FAILURE); } void nextch() { do { if ((ch = getchar()) == EOF) return; }while (ch == ' ' || ch == '\t'); } double number() { double x, a; int sign = '+'; if (ch == '+' || ch == '-') { sign = ch; nextch(); } if (! isdigit(ch)) error("Not a number or '(' is required."); x = ch - '0'; nextch(); while (isdigit(ch)) { x = 10 * x + ch - '0'; nextch(); } if (ch == '.') { a = 1; nextch(); while (isdigit(ch)) { x += (a /= 10) * (ch - '0'); nextch(); } } return sign == '-' ? -x : x; } double expression(); double factor() { double x; if (ch != '(') return number(); nextch(); x = expression(); if (ch != ')') error("')' is required,"); nextch(); return x; } double term() { double x, y; x = factor(); while (1) { if (ch == '*') { nextch(); x *= factor(); } else if (ch == '/') { nextch(); y = factor(); if (y == 0) error("Zero division"); x /= y; } else break; } return x; } double expression() { double x; x = term(); while (1) { if (ch == '+') { nextch(); x += term(); } else if (ch == '-') { nextch(); x -= term(); } else break; } return x; } int main() { double x; nextch(); x = expression(); if (ch != '\n') error("Syntax error"); printf("%g\n", x); return EXIT_SUCCESS; }

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数425
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2
noname#242220
noname#242220

まず。 プログラム自体が長過ぎる(スパゲッティコード) start data cls // main keyinput if keyin=""then rtn else sub cmpdata ; キー入力待ち if keying="e" then sub printout else end;ここでeが押されるまで処理を繰り返す。 end  //cmpdata ;比較用データアレイと処理 data アレイ 1.a 2.b . end ---------- printout ;結果表示 --===== endReturn

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。

関連するQ&A

  • 構文図についての問題です。

    全然分からなく困っています。どうか解答、解説をよろしくお願いします。問題は、以下です。 以下のプログラムは、整数の数式を入力して、式の値を求めて表示するプログラムである。このプログラムが対象とする数式の構文を、BNFか構文図で書け。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> static int ch; void error(char *s) { fprintf(stderr, "%s\n", s); exit(EXIT_FAILURE); } void nextch() { do { if ((ch = getchar()) == EOF) return; }while (ch == ' ' || ch == '\t'); } double number() { double x, a; int sign = '+'; if (ch == '+' || ch == '-') { sign = ch; nextch(); } if (! isdigit(ch)) error("Not a number or '(' is required."); x = ch - '0'; nextch(); while (isdigit(ch)) { x = 10 * x + ch - '0'; nextch(); } if (ch == '.') { a = 1; nextch(); while (isdigit(ch)) { x += (a /= 10) * (ch - '0'); nextch(); } } return sign == '-' ? -x : x; } double expression(); double factor() { double x; if (ch != '(') return number(); nextch(); x = expression(); if (ch != ')') error("')' is required,"); nextch(); return x; } double term() { double x, y; x = factor(); while (1) { if (ch == '*') { nextch(); x *= factor(); } else if (ch == '/') { nextch(); y = factor(); if (y == 0) error("Zero division"); x /= y; } else break; } return x; } double expression() { double x; x = term(); while (1) { if (ch == '+') { nextch(); x += term(); } else if (ch == '-') { nextch(); x -= term(); } else break; } return x; } int main() { double x; nextch(); x = expression(); if (ch != '\n') error("Syntax error"); printf("%g\n", x); return EXIT_SUCCESS; }

  • C言語による簡易電卓の作成

    四則演算に加えてべき乗、階乗を使えるような電卓を作りたいのです。 四則演算は #include <stdio.h> #include <ctype.h> void Factor( int *x ); void MulDiv( int *x ); void AddSub( int *x ); int expression( void ); int main( void ) { printf( "%d\n", expression() ); return 0; } void Factor( int *x ) { int num = 0, flag = 1, c = 0; c = fgetc( stdin ); if( c == '-' || c == '+' ){ c = fgetc( stdin ); flag = (c == '+' ) ? 1 : -1; } if( isdigit(c) ){ int n = 0; while( isdigit(c) ){ n = n * 10 + ( c - '0' ); c = fgetc( stdin ); } num = n * flag; }else{ if( c == '(' ){ num = expression(); if( fgetc( stdin ) != ')' ){ exit(-1); } c = 0x0100; } } if( c != 0x0100 ) ungetc( c, stdin ); (*x) = num; } void MulDiv( int *x ) { int num = 0, c = 0; Factor( x ); num = (*x); c = fgetc( stdin ); while( c == '*' || c == '/' || c == '%' ){ switch( c ) { case '*': Factor( x ); num = num * (*x); break; case '/': Factor( x ); num = num / (*x); break; case '%': Factor( x ); num = num % (*x); break; } c = fgetc( stdin ); } ungetc( c, stdin ); (*x) = num; } void AddSub( int *x ) { int num = 0, c = 0; MulDiv( x ); num = (*x); c = fgetc( stdin ); while( c == '+' || c == '-' ){ switch( c ) { case '+': MulDiv( x ); num = num + (*x); break; case '-': MulDiv( x ); num = num - (*x); break; } c = fgetc( stdin ); } ungetc( c, stdin ); (*x) = num; } int expression( void ) { int x = 0; AddSub( &x ); return x; } これで正しく動くことを確認できたのですが、階乗、べき乗の書き方が全くわかりません。どなたか、詳しい方いらっしゃいましたら、ご教授願います。

  • K&Rのp.95のgetop(char s[])

    こんにちは K&Rを読んでいるのですが、p.95のgetop(char s[])について質問します。 (1)関数本体の4行めにある    s[1] = '\0'; は、何のためにあるのでしょうか? (2)9行めと12行めで、    while( isdigit(s[++i] = c = getch()) ) とあるのですが、なぜs[i++]とせずにs[++i]として、cを格納するs[i]を、s[0]ではなくてs[1]から始めているのでしょうか? /* getop: 次の演算子あるいは数値の被演算数をとってくる */ int getop(char s[]) { int i, c; while( (s[0] = c = getch()) == ' ' || c == '\t') ; s[1] = '\0';       /* ← (1) */ if( !isdigit(c) && c != '.') return c;        /* 数ではない */ i = 0; if(isdigit(c))      /* 整数部を集める */ while( isdigit(s[++i] = c = getch()) )     /* ← (2) */ ; if(c == '.')       /* 小数部を集める */ while( isdigit(s[++i] = c = getch()) )     /* ← (2) */ ; s[i] = '\0'; if(c != EOF) ungetch(c); return NUMBER; }

その他の回答 (3)

  • 回答No.4

他人の作ったプログラムを改変する自信があるわけではありませんが、 処理を整数の数式に限定するために、 すべてのdoubleをintに置き換える %gを%dに置き換える 入力文字が'.'のときの処理を削除する これで、環境によっては、処理が高速になります。

共感・感謝の気持ちを伝えよう!

  • 回答No.3

宿題だろ、これ? 丸投げすんな・・・

共感・感謝の気持ちを伝えよう!

  • 回答No.1

自信なくてもできると思うから、本当に自信のある人は回答しないと思うし、基本的に丸投げの人って、自分では何も努力しない他人任せな人という印象が強いから、助けてあげようという気持ちになるひとは少ないと思います。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Visual C++での数値計算のプログラミング

    質問初めてになります。 プログラミングにあまり詳しくない大学院の数理科の学生です。 学校で熱方程式の陽解法のプログラミングのレポートが出されたのですが、困っています。 レポートで詰まっている点は windows Visual C++ Expressionでの陽解法のプログラミングです。 indows Visual C++ Expression2008が良くわからないのでコマンドプロンプトで実行しています。 熱方程式の初期値問題の陽解法のプログラムをなんとか組んでいます。 私が組んだプログラムではLinuxでは通るのですがwindows Visual C++ Expressionでは通りません。 このプログラムをwindows Visual C++ Expression 2008で通すにはどのように直したがいいのか教えて頂きたいと思います。よろしくお願いします。 以下は私なりに組んだプログラミングです。 πの値、u1[N+1]、u2[N+2] の3箇所でエラーがでてると思われます。 #include<stdio.h> #include<stdio.h> #include<math.h> int main(){ int i,k,kmax; int N=10; double dx double dt=0.01; double u1[N+1]; double u2[N+1]; double r=dt/(dx*dx); double T=1.0; kmax=T/dt; u1[0]=0; u1[N]=0; for(i=1;i<=N;i++){   u1[i]=sin(M_PI*i*dx); } for(k=1;k<=kmax;k++){ for(i=1;i<=N-1;i++){ u2[i]=r*u1[i-1]+(1-2*r)*u1[i]+r*u1[i+1]; }   for(i=1;i<=N-1;i++){ u1[i]=u2[i];   }   for(i=0;i<=N;i++){ printf("%f %f %f\n",dt*k,dx*i,u1[i]);   }   printf("\n"); } return 0; }

  • プログラミング

    以下のC++で書かれた以下のプログラムのコンパイルができません。理由を教えてください。 #include <iostream> #include <vector> #include <algorithm> istream& read(istream&, std::vector<double>&); double median(std::vector<double>); int main(){ std::vector<double> a; read(std::cin, a); std::vector<double>::iterator itr; while(itr != a.end()){ std::cout << *itr; } std::cout << median(a) << std::endl; } istream& read(istream& is, std::vector<double>& v){ double b; if(is){ while(in >> b) v.push_back(b); } return is; } double median(std::vector<double> a){ int i; if(a.size() == 0) { return -1; } i = a.size() / 2; if(a.size()%2 == 1) return (a[i]); else return ((a[i] + a[i-1])/2); }

  • BNF(バッカス・ナウア・記法)

    BNFについてですが、 <expression> ::= <expression> + <term> | <term> <term> ::= <term> * <primary> | <primary> <primary> ::= (<exprssion>) | <identifier> <identifier> ::= a という、数式の定義があるとき、(((a))) という記号列は得ることが出来ますか?

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • よく分からない関数?がある

    プログラミングが良く分かっていないため、このプログラムを読みきる事ができませんでした。 #include <stdio.h> int (*get_sign)(); int iget_sign(int *a); int dget_sign(double *a); main(){ int sgn, idt=5; //intを2つ作成。idtは5 double fdt = -3.234; //ダブル型のfidを作成、数値は-3.234 get_sign = iget_sign; //不明:get_sigin sgn = get_sign(&idt); //get_siginにidtの数値を渡してsgnにいれてる printf("*date:%d sgn:%d\n",idt ,sgn); get_sign = dget_sign; sgn = get_sign(&fdt); printf("*data:%lf sgn:%d\n", fdt, sgn); } int iget_sign(int *a){ if(*a == 0) return 0; else if(*a > 0) return 1; else return -1; } int dget_sign(double *a){ if(*a == 0) return 0; else if(*a > 0.0) return 1; else return -1; } 数値が0なら0を、プラスなら1をマイナスなら-1を返すプログラムだと言うことは分かります。 しかし、2行目の「int (*get_sign)();」や10行目の「get_sign = iget_sign; //不明:get_sigin」が良く分かりません。 ぜひアドバイスをお願いします。

  • schemeのことです

    schemeのことです expression datatypeを作りました 一番最後のexp->string部分で困っています consとかifとか使うべきですか? -------------------------------- (define-datatype expression expression? (const-exp (num number?)) (var-exp (var symbol?)) (zero?-exp (exp1 expression?)) (diff-exp (exp1 expression?) (exp2 expression?))) ;; Predicates. (define const-exp? (lambda (exp) (cases expression exp (const-exp (num) #t) (else #f)))) (define var-exp? (lambda (exp) (cases expression exp (var-exp (var) #t) (else #f)))) (define zero?-exp? (lambda (exp) (cases expression exp (zero?-exp (exp1) #t) (else #f)))) (define diff-exp? (lambda (exp) (cases expression exp (diff-exp (exp1 exp2) #t) (else #f)))) ;; ====================================================================== ;; Extractors. (define exp->const (lambda (exp) (cases expression exp (const-exp (num) num) (else #f)))) (define exp->var (lambda (exp) (cases expression exp (var-exp (var) var) (else #f)))) (define exp->exp1 (lambda (exp) (cases expression exp (zero?-exp (exp1) exp1) (else #f)))) (define exp->exp2 (lambda (exp) (cases expression exp (diff-exp (exp1 exp2) exp2) ;; ====================================================================== ;; exp->string: exp -> string ;; Abstract syntax to concrete syntax. (define exp->string (lambda (exp) (cond ((const-exp? exp) (format "~a" (exp->const exp))) ((var-exp? exp) (format "~a" (exp->var exp))) ((zero?-exp? exp) (format "zero?(~a)" (exp->exp1 exp))) ((diff-exp? exp) (format "-(~a,~a)" (exp->exp2 exp)(exp->exp2 exp))) (else #f

  • プログラミングについての質問です。

    プログラミングについての質問です。 できるだけ早めの解答をお待ちしてます。 次の構文をC言語として表したいのですが、一応作っては見たもののできません。 1.S→E<A4> 2.E→TX 3.X→+<A1>T<A2>X 4.X→ε 5.T→FY 6.Y→*<A1>F<A2>Y 7.Y→ε 8.F→-<A1>F<A2>Y 9.F→I<A1> 10.F→(E) 11.I→a|b|c|d|e A1はスタック上に項目を挿入するという動作。 A2はスタックから3つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A3はスタックから2つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A4はスタックから1つの項目を除去する。 #include<stdio.h> #include<string.h> intmain(void) { charsymbol[10][10]; inti=0,j,k=0; printf("Inputsymbol:"); while(1) {scanf("%s",symbol[i]); if(strcmp(symbol[i],"_")==0) {i--;break;} i++;} printf("symbol="); for(j=0;j<=i;j++) {printf("%s",symbol[j]);} printf("&#165;n"); gotoS; S: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoE;return;} elseif(strcmp(symbol[k],"-")==0) {gotoE;return;} elseif(strcmp(symbol[k],"(")==0) {gotoE;return;} else {gotoerror;} E: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"-")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"(")==0) {gotoT;gotoX;return;} else {gotoerror;} X: if(strcmp(symbol[k],"+")==0) {k++;gotoT;gotoX;return;} else {if(strcmp(symbol[k],"_")!=0) {gotoerror;} elseif(strcmp(symbol[k],")")!=0) {gotoerror;} } T: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"-")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"(")==0) {gotoF;gotoY;return;} else {gotoerror;} Y: if(strcmp(symbol[k],"*")==0) {k++;gotoF;gotoY;return;} elseif(strcmp(symbol[k],"_")==0) {gotoerror;} elseif(strcmp(symbol[k],")")==0) {gotoerror;} elseif(strcmp(symbol[k],"+")==0) {gotoerror;} I: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {k++; } elsegotoerror; F: if(strcmp(symbol[k],"-")==0) {k++;gotoF; } else if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoI;} else {if(strcmp(symbol[k],"(")==0) {k++;gotoE; if(strcmp(symbol[k],")")!=0) gotoerror;} elsegotoerror;} error: printf("No&#165;n"); exit(1); 制限字数の関係でプログラムを削ったりしています。 見にくくてすみません。 御指導よろしくお願いします。

  • プログラミング 返り値

    #include <stdio.h> int sumn(double a); int main(void) { double b, answer; while(1){ printf("Input a number:"); scanf("%lf",&b); answer = sumn(b); printf("(4*3.14*a*a*a)/3=%f\n",answer); } return 0; } int sumn(double a){ double sum; sum=(4*3.14*a*a*a)/3; return sum; } これを実行してもwarning C4244: 'return' : conversion from 'double ' to 'int ', possible loss of dataと出てしまい小数点を切り捨てて表示されてしまいます。 どこが間違っているのでしょうか? 教えてくださいm(_ _ )m

  • 関数

    FILE *fp; char *str,buf[1000]; char xbuf[100],*xstr;   char ybuf[100],*ystr; static double bx=0; static double by=0; if ((fp = fopen("kadai.txt", "r")) == NULL) { printf("ファイルが開けません\n"); return EXIT_SUCCESS; } while (fgets(buf, 1000, fp) != NULL) { str=buf;        while((*str!='\0'){ if(*str=='X'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') xstr=xbuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) || *str=='-' || *str=='.')*xstr++=*str++; *xstr='\0'; } if(*str=='Y'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') ystr=ybuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) |*str=='||*str=='.') *ystr++=*str++; *ystr='\0'; } else str++; } } ファイルからの一行の切り分けのプログラムなのですが if(*str=='X'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') xstr=xbuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) || *str=='-' || *str=='.')*xstr++=*str++; *xstr='\0'; } の部分と if(*str=='Y'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') ystr=ybuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) |*str=='||*str=='.') *ystr++=*str++; *ystr='\0'; } の部分は変数が違うだけでほとんど同じ文ですよね。 関数を作ってこの処理のときに呼び出せれば応用が利くと思い 考えてみたのですが中々できません。よろしければ教えて下さい。 まだ戻り値や関数の理解が今ひとつです。

  • cのプログラミング

    //ユーザーが入力した文字の個数をカウントする #include<stdio.h> int main() { char ch; int moji; int s_cunt=0, a_cunt=0, k_cunt=0; printf(\"文字を入力してください-->\"); do{ ch = getchar(); if(\'0\'<=ch && ch<=\'9\') moji = 1; else if(\'a\'<=ch && ch<=\'z\') moji = 2; switch(moji){ case 1: s_cunt++; break; case 2: a_cunt++; break; default: k_cunt++; break; } }while(ch != \'\\n\'); printf(\"数字の入力数:%d\\n\",s_cunt); printf(\"英字の入力数:%d\\n\",a_cunt); printf(\"区切りの入力数:%d\\n\",k_cunt); return 0; } 数字、英字、区切り文字をそれぞれリターンキーが押されるまでカウントして出力したいのですが上手く出力されません。このプログラミングは全然違いますか?