#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef float (*OperacjaFunkcja)(float,float);
typedef struct {
char symbol;
int liczba_argumentow;
OperacjaFunkcja funkcja;
} Operacja;
typedef struct {
float wynik;
Operacja *operacje;
int liczba_operacji;
} Kalkulator;
float dodaj(float a,float b){return a+b;}
float odejmij(float a,float b){return a-b;}
float mnoz(float a,float b){return a*b;}
float dziel(float a,float b){
if(b==0){
printf("nie tolerujemy tutaj dzielenia przez 0"); return a;
}
return a/b;
}
float potega(float a,float b){return powf(a,b);}
float pierwiastek(float a,float b){return sqrtf(a);}
float negacja(float a,float b){return -a;}
float negacja_bitowa(float a,float b){return (float)(~(int)a);}
float ustaw(float a,float b){return a;}
void inicjalizuj(Kalkulator *k){
k->wynik=0.0f;
k->liczba_operacji=9;
k
->operacje
=malloc(k
->liczba_operacji
*sizeof(Operacja
)); k->operacje[0]=(Operacja){'+',2,dodaj};
k->operacje[1]=(Operacja){'-',2,odejmij};
k->operacje[2]=(Operacja){'*',2,mnoz};
k->operacje[3]=(Operacja){'/',2,dziel};
k->operacje[4]=(Operacja){'^',2,potega};
k->operacje[5]=(Operacja){'√',1,pierwiastek};
k->operacje[6]=(Operacja){'n',1,negacja};
k->operacje[7]=(Operacja){'~',1,negacja_bitowa};
k->operacje[8]=(Operacja){'=',1,ustaw};
}
float oblicz(Kalkulator *k,char symbol,float liczba){
for(int i=0;i<k->liczba_operacji;i++){
if(k->operacje[i].symbol==symbol){
if(k->operacje[i].liczba_argumentow==1){
k->wynik=k->operacje[i].funkcja(k->wynik,0);
}else{
k->wynik=k->operacje[i].funkcja(k->wynik,liczba);
}
return k->wynik;
}
}
printf("przykro mi ale takiej operacji nie ma w tym kalkulatorze: %c\n",symbol
); return k->wynik;
}
void wykonaj_z_pliku(Kalkulator *k,const char *nazwa_pliku){
FILE
*plik
=fopen(nazwa_pliku
,"r"); char symbol;
float liczba;
while(fscanf(plik
," %c %f",&symbol
,&liczba
)==2){ printf("-> %c %.2f\n",symbol
,liczba
); oblicz(k,symbol,liczba);
printf("Wynik: %.2f\n",k
->wynik
); }
}
void zakoncz(Kalkulator *k){
}
int main(){
Kalkulator kalk;
inicjalizuj(&kalk);
char symbol;
float liczba;
printf("Kalkulator: + - * / ^ √ n ~ =\n"); printf("f - wczytaj z pliku | q - wyjscie\n"); while(1){
printf("\nWynik: %.2f\n",kalk.
wynik); printf("Podaj operacje i liczbe (np. + 5): "); if(scanf(" %c",&symbol
)!=1)break; if(symbol=='q')break;
if(symbol=='f'){
char nazwa[100];
printf("Podaj nazwe pliku: "); wykonaj_z_pliku(&kalk,nazwa);
continue;
}
if(scanf("%f",&liczba
)!=1)break; oblicz(&kalk,symbol,liczba);
}
zakoncz(&kalk);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KdHlwZWRlZiBmbG9hdCAoKk9wZXJhY2phRnVua2NqYSkoZmxvYXQsZmxvYXQpOwp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIHN5bWJvbDsKICAgIGludCBsaWN6YmFfYXJndW1lbnRvdzsKICAgIE9wZXJhY2phRnVua2NqYSBmdW5rY2phOwp9IE9wZXJhY2phOwp0eXBlZGVmIHN0cnVjdCB7CiAgICBmbG9hdCB3eW5pazsKICAgIE9wZXJhY2phICpvcGVyYWNqZTsKICAgIGludCBsaWN6YmFfb3BlcmFjamk7Cn0gS2Fsa3VsYXRvcjsKZmxvYXQgZG9kYWooZmxvYXQgYSxmbG9hdCBiKXtyZXR1cm4gYStiO30KZmxvYXQgb2Rlam1paihmbG9hdCBhLGZsb2F0IGIpe3JldHVybiBhLWI7fQpmbG9hdCBtbm96KGZsb2F0IGEsZmxvYXQgYil7cmV0dXJuIGEqYjt9CmZsb2F0IGR6aWVsKGZsb2F0IGEsZmxvYXQgYil7CiAgICBpZihiPT0wKXsKICAgICAgICBwcmludGYoIm5pZSB0b2xlcnVqZW15IHR1dGFqIGR6aWVsZW5pYSBwcnpleiAwIik7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICByZXR1cm4gYS9iOwp9CmZsb2F0IHBvdGVnYShmbG9hdCBhLGZsb2F0IGIpe3JldHVybiBwb3dmKGEsYik7fQpmbG9hdCBwaWVyd2lhc3RlayhmbG9hdCBhLGZsb2F0IGIpe3JldHVybiBzcXJ0ZihhKTt9CmZsb2F0IG5lZ2FjamEoZmxvYXQgYSxmbG9hdCBiKXtyZXR1cm4gLWE7fQpmbG9hdCBuZWdhY2phX2JpdG93YShmbG9hdCBhLGZsb2F0IGIpe3JldHVybiAoZmxvYXQpKH4oaW50KWEpO30KZmxvYXQgdXN0YXcoZmxvYXQgYSxmbG9hdCBiKXtyZXR1cm4gYTt9CnZvaWQgaW5pY2phbGl6dWooS2Fsa3VsYXRvciAqayl7CiAgICBrLT53eW5paz0wLjBmOwogICAgay0+bGljemJhX29wZXJhY2ppPTk7CiAgICBrLT5vcGVyYWNqZT1tYWxsb2Moay0+bGljemJhX29wZXJhY2ppKnNpemVvZihPcGVyYWNqYSkpOwogICAgay0+b3BlcmFjamVbMF09KE9wZXJhY2phKXsnKycsMixkb2Rhan07CiAgICBrLT5vcGVyYWNqZVsxXT0oT3BlcmFjamEpeyctJywyLG9kZWptaWp9OwogICAgay0+b3BlcmFjamVbMl09KE9wZXJhY2phKXsnKicsMixtbm96fTsKICAgIGstPm9wZXJhY2plWzNdPShPcGVyYWNqYSl7Jy8nLDIsZHppZWx9OwogICAgay0+b3BlcmFjamVbNF09KE9wZXJhY2phKXsnXicsMixwb3RlZ2F9OwogICAgay0+b3BlcmFjamVbNV09KE9wZXJhY2phKXsn4oiaJywxLHBpZXJ3aWFzdGVrfTsKICAgIGstPm9wZXJhY2plWzZdPShPcGVyYWNqYSl7J24nLDEsbmVnYWNqYX07CiAgICBrLT5vcGVyYWNqZVs3XT0oT3BlcmFjamEpeyd+JywxLG5lZ2FjamFfYml0b3dhfTsKICAgIGstPm9wZXJhY2plWzhdPShPcGVyYWNqYSl7Jz0nLDEsdXN0YXd9Owp9CmZsb2F0IG9ibGljeihLYWxrdWxhdG9yICprLGNoYXIgc3ltYm9sLGZsb2F0IGxpY3piYSl7CiAgICBmb3IoaW50IGk9MDtpPGstPmxpY3piYV9vcGVyYWNqaTtpKyspewogICAgICAgIGlmKGstPm9wZXJhY2plW2ldLnN5bWJvbD09c3ltYm9sKXsKICAgICAgICAgICAgaWYoay0+b3BlcmFjamVbaV0ubGljemJhX2FyZ3VtZW50b3c9PTEpewogICAgICAgICAgICAgICAgay0+d3luaWs9ay0+b3BlcmFjamVbaV0uZnVua2NqYShrLT53eW5paywwKTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBrLT53eW5paz1rLT5vcGVyYWNqZVtpXS5mdW5rY2phKGstPnd5bmlrLGxpY3piYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGstPnd5bmlrOwogICAgICAgIH0KICAgIH0KICAgIHByaW50ZigicHJ6eWtybyBtaSBhbGUgdGFraWVqIG9wZXJhY2ppIG5pZSBtYSB3IHR5bSBrYWxrdWxhdG9yemU6ICVjXG4iLHN5bWJvbCk7CiAgICByZXR1cm4gay0+d3luaWs7Cn0Kdm9pZCB3eWtvbmFqX3pfcGxpa3UoS2Fsa3VsYXRvciAqayxjb25zdCBjaGFyICpuYXp3YV9wbGlrdSl7CiAgICBGSUxFICpwbGlrPWZvcGVuKG5hendhX3BsaWt1LCJyIik7CiAgICBjaGFyIHN5bWJvbDsKICAgIGZsb2F0IGxpY3piYTsKICAgIHdoaWxlKGZzY2FuZihwbGlrLCIgJWMgJWYiLCZzeW1ib2wsJmxpY3piYSk9PTIpewogICAgICAgIHByaW50ZigiLT4gJWMgJS4yZlxuIixzeW1ib2wsbGljemJhKTsKICAgICAgICBvYmxpY3ooayxzeW1ib2wsbGljemJhKTsKICAgICAgICBwcmludGYoIld5bmlrOiAlLjJmXG4iLGstPnd5bmlrKTsKICAgIH0KICAgIGZjbG9zZShwbGlrKTsKfQp2b2lkIHpha29uY3ooS2Fsa3VsYXRvciAqayl7CiAgICBmcmVlKGstPm9wZXJhY2plKTsKfQppbnQgbWFpbigpewogICAgS2Fsa3VsYXRvciBrYWxrOwogICAgaW5pY2phbGl6dWooJmthbGspOwogICAgY2hhciBzeW1ib2w7CiAgICBmbG9hdCBsaWN6YmE7CiAgICBwcmludGYoIkthbGt1bGF0b3I6ICsgLSAqIC8gXiDiiJogbiB+ID1cbiIpOwogICAgcHJpbnRmKCJmIC0gd2N6eXRhaiB6IHBsaWt1IHwgcSAtIHd5anNjaWVcbiIpOwogICAgd2hpbGUoMSl7CiAgICAgICAgcHJpbnRmKCJcbld5bmlrOiAlLjJmXG4iLGthbGsud3luaWspOwogICAgICAgIHByaW50ZigiUG9kYWogb3BlcmFjamUgaSBsaWN6YmUgKG5wLiArIDUpOiAiKTsKICAgICAgICBpZihzY2FuZigiICVjIiwmc3ltYm9sKSE9MSlicmVhazsKICAgICAgICBpZihzeW1ib2w9PSdxJylicmVhazsKICAgICAgICBpZihzeW1ib2w9PSdmJyl7CiAgICAgICAgICAgIGNoYXIgbmF6d2FbMTAwXTsKICAgICAgICAgICAgcHJpbnRmKCJQb2RhaiBuYXp3ZSBwbGlrdTogIik7CiAgICAgICAgICAgIHNjYW5mKCIlcyIsbmF6d2EpOwogICAgICAgICAgICB3eWtvbmFqX3pfcGxpa3UoJmthbGssbmF6d2EpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYoc2NhbmYoIiVmIiwmbGljemJhKSE9MSlicmVhazsKICAgICAgICBvYmxpY3ooJmthbGssc3ltYm9sLGxpY3piYSk7CiAgICB9CiAgICB6YWtvbmN6KCZrYWxrKTsKICAgIHJldHVybiAwOwp9Cg==