fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. typedef float (*OperacjaFunkcja)(float,float);
  5. typedef struct {
  6. char symbol;
  7. int liczba_argumentow;
  8. OperacjaFunkcja funkcja;
  9. } Operacja;
  10. typedef struct {
  11. float wynik;
  12. Operacja *operacje;
  13. int liczba_operacji;
  14. } Kalkulator;
  15. float dodaj(float a,float b){return a+b;}
  16. float odejmij(float a,float b){return a-b;}
  17. float mnoz(float a,float b){return a*b;}
  18. float dziel(float a,float b){
  19. if(b==0){
  20. printf("nie tolerujemy tutaj dzielenia przez 0");
  21. return a;
  22. }
  23. return a/b;
  24. }
  25. float potega(float a,float b){return powf(a,b);}
  26. float pierwiastek(float a,float b){return sqrtf(a);}
  27. float negacja(float a,float b){return -a;}
  28. float negacja_bitowa(float a,float b){return (float)(~(int)a);}
  29. float ustaw(float a,float b){return a;}
  30. void inicjalizuj(Kalkulator *k){
  31. k->wynik=0.0f;
  32. k->liczba_operacji=9;
  33. k->operacje=malloc(k->liczba_operacji*sizeof(Operacja));
  34. k->operacje[0]=(Operacja){'+',2,dodaj};
  35. k->operacje[1]=(Operacja){'-',2,odejmij};
  36. k->operacje[2]=(Operacja){'*',2,mnoz};
  37. k->operacje[3]=(Operacja){'/',2,dziel};
  38. k->operacje[4]=(Operacja){'^',2,potega};
  39. k->operacje[5]=(Operacja){'√',1,pierwiastek};
  40. k->operacje[6]=(Operacja){'n',1,negacja};
  41. k->operacje[7]=(Operacja){'~',1,negacja_bitowa};
  42. k->operacje[8]=(Operacja){'=',1,ustaw};
  43. }
  44. float oblicz(Kalkulator *k,char symbol,float liczba){
  45. for(int i=0;i<k->liczba_operacji;i++){
  46. if(k->operacje[i].symbol==symbol){
  47. if(k->operacje[i].liczba_argumentow==1){
  48. k->wynik=k->operacje[i].funkcja(k->wynik,0);
  49. }else{
  50. k->wynik=k->operacje[i].funkcja(k->wynik,liczba);
  51. }
  52. return k->wynik;
  53. }
  54. }
  55. printf("przykro mi ale takiej operacji nie ma w tym kalkulatorze: %c\n",symbol);
  56. return k->wynik;
  57. }
  58. void wykonaj_z_pliku(Kalkulator *k,const char *nazwa_pliku){
  59. FILE *plik=fopen(nazwa_pliku,"r");
  60. char symbol;
  61. float liczba;
  62. while(fscanf(plik," %c %f",&symbol,&liczba)==2){
  63. printf("-> %c %.2f\n",symbol,liczba);
  64. oblicz(k,symbol,liczba);
  65. printf("Wynik: %.2f\n",k->wynik);
  66. }
  67. fclose(plik);
  68. }
  69. void zakoncz(Kalkulator *k){
  70. free(k->operacje);
  71. }
  72. int main(){
  73. Kalkulator kalk;
  74. inicjalizuj(&kalk);
  75. char symbol;
  76. float liczba;
  77. printf("Kalkulator: + - * / ^ √ n ~ =\n");
  78. printf("f - wczytaj z pliku | q - wyjscie\n");
  79. while(1){
  80. printf("\nWynik: %.2f\n",kalk.wynik);
  81. printf("Podaj operacje i liczbe (np. + 5): ");
  82. if(scanf(" %c",&symbol)!=1)break;
  83. if(symbol=='q')break;
  84. if(symbol=='f'){
  85. char nazwa[100];
  86. printf("Podaj nazwe pliku: ");
  87. scanf("%s",nazwa);
  88. wykonaj_z_pliku(&kalk,nazwa);
  89. continue;
  90. }
  91. if(scanf("%f",&liczba)!=1)break;
  92. oblicz(&kalk,symbol,liczba);
  93. }
  94. zakoncz(&kalk);
  95. return 0;
  96. }
  97.  
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout
Kalkulator: + - * / ^ √ n ~ =
f - wczytaj z pliku | q - wyjscie

Wynik: 0.00
Podaj operacje i liczbe (np. + 5):