前提・実現したいこと
現在大学の課題で逆ポーランド 記法で記述された式をファイルから読み込み、 その結果をファイルに 書き出すプログラムを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/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー