Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <math.h>
- int strtm_neg(char str[], int i)
- {
- int k=i-1, j=0;
- int f1;
- while(str[k]!='*'&& str[k]!='/'&& str[k]!='-' && str[k]!='+' && str[k]!='\0' && k>=0)
- {
- j++;
- k--;
- }
- f1=j;
- return f1;
- }
- int strtm_pos(char str[], int i)
- {
- int k=i+1, j=0;
- int f1;
- while(str[k]!='*'&& str[k]!='/'&& str[k]!='-' && str[k]!='+' && str[k]!='\0' && k<strlen(str))
- {
- j++;
- k++;
- }
- f1=j;
- return f1;
- }
- float conv_neg(char x[], int i){
- char *r1=NULL;
- int k=i-1, j=0, t1=0, z;
- float f1;
- while(x[k]!='*'&& x[k]!='/'&& x[k]!='-' && x[k]!='+' && x[k]!='\0' && k>=0)
- {
- j++;
- k--;
- }
- t1 = j;
- r1 = (char*) calloc(t1,sizeof(char));
- for(z=0; z<j; z++)
- {
- r1[z]=x[i-j+z];
- }
- sscanf(r1, "%f", &f1);
- free(r1);
- return f1;
- }
- float conv_pos(char x[], int i){
- char *r2=NULL;
- int k=i+1, j=0, t2=0, z;
- float f2;
- while(x[k]!='*'&& x[k]!='/'&& x[k]!='-' && x[k]!='+' && k<strlen(x) && x[k]!='\0')
- {
- j++;
- k++;
- }
- t2 = j;
- r2 = (char*) calloc(t2,sizeof(char));
- for(z=0; z<j; z++)
- {
- r2[z]=x[i+z+1];
- }
- sscanf(r2, "%f", &f2);
- free(r2);
- return f2;
- }
- void calcula_div(char op[]){
- int i, j;
- float x, y, z;
- char p[10]="", aux1[10]="", aux2[10]="";
- char st2[10];
- for(i=0; i<strlen(op); i++)
- {
- if(op[i]=='/')
- {
- y = conv_neg(op, i);
- x = conv_pos(op, i);
- z = y/x;
- //essa linha de baixo tá possuída pelo capeta
- sprintf(st2, "%f", x);
- sprintf(p, "%f", z);
- int ty=strtm_neg(op, i);
- int tx=strtm_pos(op, i);
- if(ty+tx+1<strlen(op))
- {
- for(j=0; j<(i-ty); j++)
- {
- aux1[j]=op[j];
- }
- for(j=0; j<strlen(op); j++)
- {
- aux2[j]=op[(i+1+tx)+j];
- }
- }
- strcat(aux1, p);
- strcat(aux1, aux2);
- strcpy(op, aux1);
- }
- }
- }
- void calcula_mult(char op[]){
- int i, j;
- float x, y, z;
- char p[100]="", aux1[100]="", aux2[100]="";
- for(i=0; i<strlen(op); i++)
- {
- if(op[i]=='*')
- {
- y = conv_neg(op, i);
- x = conv_pos(op, i);
- z = y*x;
- sprintf(p, "%f", z);
- int ty=strtm_neg(op, i);
- int tx=strtm_pos(op, i);
- if(ty+tx+1<strlen(op))
- {
- for(j=0; j<(i-ty); j++)
- {
- aux1[j]=op[j];
- }
- for(j=0; j<strlen(op); j++)
- {
- aux2[j]=op[(i+1+tx)+j];
- }
- }
- strcat(aux1, p);
- strcat(aux1, aux2);
- strcpy(op, aux1);
- }
- }
- }
- void calcula_sub(char op[]){
- int i, j;
- float x, y, z;
- char p[10]="", aux1[10]="", aux2[10]="";
- for(i=0; i<strlen(op); i++)
- {
- if(op[i]=='-' && i!=0)
- {
- y = conv_neg(op, i);
- x = conv_pos(op, i);
- z = y-x;
- sprintf(p, "%f", z);
- int ty=strtm_neg(op, i);
- int tx=strtm_pos(op, i);
- if(ty+tx+1<strlen(op))
- {
- for(j=0; j<(i-ty); j++)
- {
- aux1[j]=op[j];
- }
- for(j=0; j<strlen(op); j++)
- {
- aux2[j]=op[(i+1+tx)+j];
- }
- }
- strcat(aux1, p);
- strcat(aux1, aux2);
- strcpy(op, aux1);
- }
- }
- }
- void calcula_add(char op[]){
- int i, j;
- float x, y, z;
- char p[100]="", aux1[100]="", aux2[100]="";
- for(i=0; i<strlen(op); i++)
- {
- if(op[i]=='+')
- {
- y = conv_neg(op, i);
- x = conv_pos(op, i);
- z = y+x;
- sprintf(p, "%f", z);
- int ty=strtm_neg(op, i);
- int tx=strtm_pos(op, i);
- for(j=0; j<(i-ty); j++)
- {
- aux1[j]=op[j];
- }
- for(j=0; j<strlen(op); j++)
- {
- aux2[j]=op[(i+1+tx)+j];
- }
- strcat(aux1, p);
- strcat(aux1, aux2);
- strcpy(op, aux1);
- }
- }
- }
- void calcula_tudo(char op[]){
- calcula_mult(op);
- calcula_div(op);
- calcula_add(op);
- calcula_sub(op);
- }
- int main(){
- char operacoes[100][100] = {"1+2*3", "1-2*3/4", "1+1/2", "2/3+3*4"};
- char ret[100][100];
- char op[100];
- int i, b;
- float rft, teste;
- for(i=0; i<4; i++)
- {
- strcpy(op, operacoes[i]);
- calcula_tudo(op);
- strcpy(ret[i], op);
- }
- for(i=0; i<4; i++)
- {
- printf("%s = %s\n", operacoes[i], ret[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement