質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2713閲覧

逆ポーランド記法 単項演算

dogwanwan

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/19 16:20

前提・実現したいこと

現在大学の課題で逆ポーランド 記法で記述された式をファイルから読み込み、 その結果をファイルに 書き出すプログラムをc言語で作成しています.math.hを用いずに単項演算であるマイナスの符号反転と絶対値||の実装を付け加えたいのですが,どのようにして組み込めば良いかが分かりません.どなたか教えていただけないでしょうか.お願い致します.

発生している問題・エラーメッセージ

単項演算の実装方法がわからない

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3#define DUMMY -1//ダミーデータ 4#define NODATA 0//データなし 5#define EXISTDATA 1//データりあり 6 7struct doubleCell{ 8 double data;//データ部 9 struct DoubleCell * next; //ポインタ部 10}; 11 12typedef struct doubleCell DoubleCell; 13typedef DoubleCell* DoubleStack; //スタック型 14typedef DoubleCell* Cell_P; 15 16DoubleStack makeStack();//スタックの作成 17void push(DoubleStack stack, double data);//データ挿入 18double pop(DoubleStack stack);//データ取り出し 19double isEmpty(DoubleStack stack);//空かのテスト 20void calcToStack(FILE * fp,DoubleStack stack);//ファイルからのデータ入力 21Cell_P makeCell(double n);//セル作成 22void result_fprint(FILE * fp, DoubleStack stack); 23void printStack(DoubleStack stack); 24 25int main(){ 26 DoubleStack stack; 27 FILE *fp_in , *fp_out; 28 stack=makeStack(); 29 fp_in=fopen("DoubleData","r"); 30 fp_out=fopen("ResultData","w"); 31 printf("ファイルへ計算結果を出力します.\n"); 32 calcToStack(fp_in, stack); 33 result_fprint(fp_out, stack); 34 fclose(fp_in); 35 fclose(fp_out); 36} 37 38DoubleStack makeStack(){ 39 DoubleStack stack=(DoubleStack)makeCell(DUMMY);//ダミーセル 40 stack->next=NULL; 41 return stack; 42} 43 44double isEmpty(DoubleStack stack){ 45 if(stack->next==NULL) { 46 return NODATA; 47 } 48 else { 49 return EXISTDATA; 50 } 51} 52 53Cell_P makeCell(double n){ 54 Cell_P new=(Cell_P)malloc(sizeof(DoubleCell)); 55 new->data=n; 56 return new; 57} 58 59void push(DoubleStack stack ,double data){ 60 Cell_P new_cell=makeCell(data); 61 new_cell->next=stack->next; 62 stack->next=new_cell; 63 return; 64} 65 66double pop(DoubleStack stack){ 67 Cell_P top=stack->next; 68 double data; 69 if(top!=NULL){ 70 data=top->data; 71 stack->next=top->next; 72 free(top); 73 return data; 74 } 75 else{ 76 printf("No data\n"); 77 return -1; 78 } 79} 80 81void result_fprint(FILE * fp, DoubleStack stack){ 82 double result; 83 result = pop(stack); 84 fprintf(fp, "%f ", result); 85 return; 86} 87 88void calcToStack(FILE * fp,DoubleStack stack){ 89 char tmp[10]; 90 double a; 91 double b; 92 while(fscanf(fp,"%s", tmp)!=EOF){ 93 printStack(stack); 94 if(tmp[0] == '+') { 95 a=pop(stack); 96 b=pop(stack); 97 push(stack, a+b); 98 } else if(tmp[0] == '-') { 99 a=pop(stack); 100 b=pop(stack); 101 push(stack, b-a); 102 } else if(tmp[0] == '*') { 103 a=pop(stack); 104 b=pop(stack); 105 push(stack, b*a); 106 } else if(tmp[0] == '/') { 107 a=pop(stack); 108 b=pop(stack); 109 push(stack, b/a); 110 } else { 111 push(stack, atof(tmp)); 112 } 113 } 114 return; 115} 116 117void printStack(DoubleStack stack){ 118 Cell_P p=stack->next; 119 printf("("); 120 while(p!=NULL){ 121 printf("%3.2f, ",p->data); 122 p=p->next; 123 } 124 printf("]\n"); 125 return; 126} 127

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/08/19 16:28

どんな入力に対しどんな結果を期待するのか、入力データの例とその時の出力を示してください。
dogwanwan

2020/08/19 17:00

ただいま,他の方の回答で解決することができました.貴重なお時間頂戴してしまい大変申し訳ございません.
guest

回答1

0

ベストアンサー

二項演算子はスタックからふたつの値を取り出して結果をスタックに積むのですから、取り出す値がひとつであればそれで単項演算子になります。

仮に単項マイナス (符号反転) を negate、絶対値をとるのを abs と名付けた場合、具体的には calcToStackif 文の最後の else の前に以下のような分岐を付け加えればよいはずです。

c

1} else if(!strcmp(tmp, "negate")) { 2 a = pop(stack); 3 push(stack, -a); 4} else if(!strcmp(tmp, "abs")) { 5 a = pop(stack); 6 push(stack, a<0 ? -a : a);

投稿2020/08/19 16:35

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dogwanwan

2020/08/19 17:07

この通りコードを書き込んだところしっかり動作させることができました!pushの引数の中で値を変換するという考えが思いつきませんでした.本当にありがとうございます!また,貴重なお時間ご頂戴してしまい申し訳ございませんでした.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問