Powracam z pytaniem o to samo zadanie, jednak o inną rzecz. Na podstawie kodu podanego przed @draghan próbowałam napisać funkcję sprawdzającą postać wykładniczą. Częściowo się to udało. Jednak pojawia się pewien błąd, który nie wiem z czego może wynikać.
Mój kod...
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef enum
{
wykladnicza, kanoniczna
} type;
typedef enum
{
false = 0, true
} bool;
type postac(const char s[]) /* sprawdza potencjalny typ - nale¿y napisaæ osobne funkcje do sprawdzenia poprawnoœci ka¿dego z typów*/
{
if(strstr(s, "exp") != NULL) return wykladnicza; /* jeœli zawiera frazê "exp", to kandydat na postaæ wykladnicza*/
else return kanoniczna; /* w przeciwyn wypadku rozpatrujemy kanonniczna*/
}
int get_length_of_number(const char s[], bool float_precision, bool plus_or_minus) /*ilosc znakow liczby*/
{
/* flaga plus_or_minus mówi o tym, czy zezwalamy na znak poprzedzaj¹cy*/
/* flaga float_precision mówi o tym, czy pozwalamy na umieszczenie znaku kropki w liczbie*/
int i = 0;
if(s[0] == '+' || s[0] == '-') /* jeœli user umieœci³ na pocz¹tku plus lub minus, sprawdzenie zaczynamy od indeksu 1*/
{
if(!plus_or_minus) return 0; /* jeœli nie pozwalamy na poprzedzaj¹cy liczbê znak*/
i = 1;
}
for(; i < strlen(s); ++i)
{
if(isdigit(s[i]) || (float_precision == true && s[i] == '.')) continue;
else break;
}
return i;
}
bool sprawdz_kanoniczna(const char s[])
{ /* wzorzec jest taki: +/-liczba rzeczywista, znak +/-,j, liczba rzeczywista*/
int licznik;
char temp[100] = "";
int length = get_length_of_number(s, true, true);
licznik = 5 + length;
if(strlen(s) == length){
return true;}
strcpy(temp, s+length); /* w zmiennej 'temp' zostawiamy ci¹g znaków wejœciowy z wyciêt¹ pierwsz¹ liczb¹*/
strcat(temp, "");
if(temp[0] != '+' && temp[0] != '-' && temp[0] != 'j')
{ int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
if(temp[0] != 'j' && temp[1] != 'j')
{ int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
if (temp[0] == 'j'){
length = get_length_of_number(temp+1, true, false);
licznik++;}
if (temp[1] == 'j'){
length = get_length_of_number(temp+2, true, false);
licznik=licznik+2;}
licznik=licznik+length;
if((((temp[0] == '-' || temp[0] == '+')) && strlen(temp) != length + 2) || (temp[0] == 'j' && strlen(temp) != length + 1))
{
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
return true;
}
bool sprawdz_wykladnicza(const char s[])
{
/*wzorzec +-liczba rzeczywista, exp, nawias, +-j, liczba rzeczywista, pi, nawias*/
int licznik;
char temp[100] = "";
int length;
length = get_length_of_number(s, true, true);
licznik = 5 + length;
strcpy(temp, s+length);
strcat(temp, "");
if(temp[0] != 'e')
{ int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
licznik++;
if(temp[1] != 'x')
{int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
licznik++;
if(temp[2] != 'p')
{int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
licznik++;
if(temp[3] != '(')
{int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
licznik++;
if((temp[4] != '+') && (temp[4] != '-') && (temp[4] != 'j')){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
if(temp[4] == 'j'){
length = get_length_of_number(temp+5, true, false);
licznik += length;
if(temp[(5+length)] != 'p'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
licznik++;
if(temp[(6+length)] != 'i'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
licznik++;
if(temp[(7+length)] != ')'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
licznik++;
if((((temp[0] == '-') || (temp[0] == '+')) && (strlen(temp) != length + 5)) || ((temp[0] == 'j') && (strlen(temp) != length + 4)))
{int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
} else{
if((temp[4] == '+') || (temp[4] == '-')){
licznik++;
if (temp[5] != 'j'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
length = get_length_of_number(temp+6, true, false);
licznik += length;
if(temp[(6+length)] != 'p'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
licznik++;
if(temp[(7+length)] != 'i'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
licznik++;
if(temp[(8+length)] != ')'){
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;}
if((((temp[0] == '-') || (temp[0] == '+')) && (strlen(temp) != length + 6)) || ((temp[0] == 'j') && (strlen(temp) != length + 5)))
{
int i; i = 0;
printf("Blad: ");
while(i<licznik){printf(" "); i++;}
printf("^");
return false;
}
}
}
return true;
}
int main(){
char liczba[] = "";
printf("liczba 1: ");
scanf("%s", liczba);
if (postac(liczba)==kanoniczna){
if (sprawdz_kanoniczna(liczba)) printf("ok");
else printf("nie ok");}
else if(sprawdz_wykladnicza(liczba)) printf("ok");
else printf("nie ok");
return 0;
}
Może ktoś będzie w stanie znaleźć błąd...