sprawdzenie poprawnosci postaci inzynieryjnej

sprawdzenie poprawnosci postaci inzynieryjnej
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam.
Zwracam sie z prośbą o pomoc w napisaniu tego programu:

Kopiuj
Napisz program, który na wejsciu bedzie miał ciag znaków a
na wyjsciu odpowie czy podany ciag znaków jest poprawna liczba w postaci
inzynieryjnej czy nie.
Kopiuj
#include <iostream>
#include <conio.h>
using namespace std;

const int klasa_znak=   0;
const int klasa_cyfra=  1;
const int klasa_kropka= 2;
const int klasa_e=      3;
const int klasa_inne=   4;

int ASCII[256];

int AUT[ 5 ][ 8 ]=
{
    { 1, -1, -1, -1, -1,  6, -1, -1},   // klasa_znak
    { 2,  2,  2,  4,  4,  7,  7,  7},   // klasa_cyfra
    {-1, -1,  3, -1, -1, -1, -1, -1},   // klasa_kropka
    {-1, -1, -1, -1,  5, -1, -1, -1},   // klasa_e
    {-1, -1, -1, -1, -1, -1, -1, -1}    // klasa_inne
};

bool err(int stan)
{
    return stan<0;
}

int main()
{
    int stan;
    unsigned char ch;

    for (ch=0; ch<255; ch++)    ASCII[ch]=klasa_inne;
    for (ch='0'; ch<='9'; ch++) ASCII[ch]=klasa_cyfra;
    ASCII['+']=ASCII['-']=klasa_znak;
    ASCII['e']=ASCII['E']=klasa_e;
    ASCII['.']=klasa_kropka;

    for (stan=0; !err(stan);)
    {
        ch = getch();
        if (ch == 13) break;        // ASCII[13] == enter
        stan = AUT[ASCII[ch]][stan];
        cout << ch;
    }

    cout << "\n\n";

    switch (stan)
    {
    case 0:
        cout << "Nie wprowadzono liczby";
        break;
    case -1:
    case 1:
    case 3:
    case 5:
    case 6:
        cout << "Liczba nieprawidlowa";
        break;
    case 2:
    case 4:
    case 7:
        cout << "Liczba prawidlowa";
        break;
    default :
        cout << "Nieznany błąd";
    }
getch();
    return stan;
    
    
}

ale tu są błędy ponieważ program powinien sparwdzic czy ta liczba jst poprawna i wypsiac np. cos takiego:
+5.54e-7 +[znak] 5[liczba] .[kropka] 54[liczba] e[e] -[znak] 7[liczba]

Wstawiajcie jakies komentarze do kodu.

Z góry dziekuje za pomoc

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 513
0

Proste zadanie. Wpisz do tablicy kolejne typy tokenów, i sprawdź czy zawartość tablicy jest poprawna:

Kopiuj
#include <stdio.h>
enum {LICZBA='L',KROPKA='K',ZNAK='Z',E='E'};

int/*bool*/ IsValid(unsigned char *str, /*usuń to*/char *tokens)
{
	int a;
	char result[12]; // +1.4e-5 -> ZNAK,LICZBA,KROPKA,LICZBA,E,ZNAK,LICZBA
	int cchResult = 0;

	char charmap[256];
	memset(charmap, 'B', 256); // B:bad
	charmap['+'] = ZNAK;
	charmap['-'] = ZNAK;
	charmap['e'] = E;
	charmap['E'] = E;
	charmap['.'] = KROPKA;

	for (a='0'; a<='9'; a++)
	{
		charmap[a] = LICZBA;
	}

	result[cchResult++] = ' ';
	while (*str && (cchResult < (sizeof(result)-3) ))
	{
		char type = charmap[*str++];
		result[cchResult++] = type;
		// pomiń cyfry tego samego typu
		while ((charmap[*str] == type && (type==LICZBA))) {str++;}
	}
	result[cchResult++] = ' ';
	result[cchResult] = 0;

	// liczby bez znaku
	// 1		L
	// 1.2		LKL
	// .2		KL
	// z wykładnikiem bez znaku
	// 1E3		LEL
	// 1.2E3	LKLEL
	// .2E3		KLEL
	// z wykładnikiem ze znakiem
	// 1E-3		LEZL
	// 1.2E-3	LKLEZL
	// .2E-3	KLEZL
	//-------------------------
	// liczby ze znakiem
	// -1		ZL
	// -1.2		ZLKL
	// -.2		ZKL
	// z wykładnikiem bez znaku
	// -1E3		ZLEL
	// -1.2E3	ZLKLEL
	// -.2E3	ZKLEL
	// z wykładnikiem ze znakiem
	// -1E-3	ZLEZL
	// -1.2E-3	ZLKLEZL
	// -.2E-3	ZKLEZL
	strcpy(tokens, result);/*usuń to*/
	return (int)strstr(" L LKL KL LEL LKLEL KLEL LEZL LKLEZL KLEZL ZL ZLKL ZKL ZLEL ZLKLEL ZKLEL ZLEZL ZLKLEZL ZKLEZL ", result);
}

Demo:

Kopiuj
int execute(unsigned char *str)
{
	char tokens[32];
	int result = IsValid(str, tokens);
	printf("%16s is %svalid\t%s\n", str, result ? "" : "not ", tokens);
	return result;
}

int main(void)
{
	execute("1");
	execute("1.2");
	execute(".2");
	execute("1E3");
	execute("1.2E3");
	execute(".2E3");
	execute("1E-3");
	execute("1.2E-3");
	execute(".2E-3");
	execute("-1");
	execute("-1.2");
	execute("-.2");
	execute("-1E3");
	execute("-1.2E3");
	execute("-.2E3");
	execute("-1E-3");
	execute("-1.2E-3");
	execute("-.2E-3");
	execute("+5.54e-7");
	// niepoprawne
	execute("+-4");
	execute("0+3");
	execute("2.3e4.5");
	return 0;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

a mozesz dokladniej wytluamczyc jak to dziala linika po linice. i czy to panewno dziala bo wyskakuje mi eror w int main()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.