#include #include #include typedef double FTYPE; const int DEFAULT_DELAY = 25; const int LOADING_STAR_DELAY = 50; const int LOADING_STAR_TIMES = 10; const int FINE_DELAY = DEFAULT_DELAY + 20; const int DEFAULT_MIDDLETIME = 1000; const int TRUE = 1; const int FALSE = 0; const int TAB_MAX = 50; int display(char * text, int del); void loading(int ms, int times); void display_and_erase(char * text, int del, int middle_time, int should_erase); int validate(char* text, FTYPE *result); extern "C" FTYPE compute_d_kgm(FTYPE, FTYPE); extern "C" FTYPE rescale_gcm(FTYPE); // -------------------------------------------------------------------------------------------------------- int main(int argc, char **argv) { char tab[TAB_MAX] = {0}; FTYPE a, b; FTYPE result; int dbg_mode = argc > 1 && !strcmp(argv[1], "/d"); int good = FALSE; if(!dbg_mode) { display_and_erase("Architektura komputerow - zadanie 3", DEFAULT_DELAY, DEFAULT_MIDDLETIME, TRUE); display_and_erase("Borys Cywinski, 204192", DEFAULT_DELAY, DEFAULT_MIDDLETIME, TRUE); display_and_erase("Program liczy gestosc kuli dla zadanego jej promienia i masy.", DEFAULT_DELAY, DEFAULT_MIDDLETIME, FALSE); cout << endl; } do { display("Podaj promien [m]: ", DEFAULT_DELAY); cin >> tab; good = validate(tab, &a); } while(!good); good = FALSE; do { display("Podaj mase [kg]: ", DEFAULT_DELAY); cin >> tab; good = validate(tab, &b); } while(!good); display("\nGestosc kuli to: ", FINE_DELAY); if(!dbg_mode) loading(LOADING_STAR_DELAY, LOADING_STAR_TIMES); result = compute_d_kgm(a, b); cout << result << " kg/m^3"; if(!dbg_mode) delay(DEFAULT_MIDDLETIME); display("\nInaczej: ", FINE_DELAY); if(!dbg_mode) loading(LOADING_STAR_DELAY, LOADING_STAR_TIMES); result = rescale_gcm(result); cout << result << " g/cm^3"; if(!dbg_mode) delay(DEFAULT_MIDDLETIME); return 0; } // -------------------------------------------------------------------------------------------------------- int display(char * text, int del) { int tmp = 0; while(*text) { cout << *text++; delay(del); ++tmp; } return tmp; } void loading(int ms, int times) { for(int i = 0; i < times; i++) { cout << (char)0x08 << (char)0x20 << (char)0x08 << '-'; delay(ms); cout << (char)0x08 << (char)0x20 << (char)0x08 << '\\'; delay(ms); cout << (char)0x08 << (char)0x20 << (char)0x08 << '|'; delay(ms); cout << (char)0x08 << (char)0x20 << (char)0x08 << '/'; delay(ms); } cout << (char)0x08; } void slide_off(int count, int del) { for(int i = 0; i < count; i++) { cout << (char)0x08 << (char)0x20 << (char)0x08; delay(del); } } void display_and_erase(char * text, int del, int middle_time, int should_erase) { int tmp = display(text, del); delay(middle_time); if(should_erase) { slide_off(tmp, del); delay(middle_time); } } int validate(char *t, FTYPE *number) { int step = 1; int result = 0; int dots = 0; int cnter = 0; int dotpos = 0; int whole = 0; int part = 0; *number = 0; while(t[cnter] != 0 || step < 50) { ++step; if(t[cnter] == '.') { if(step > 2) { dots++; dotpos = cnter; } else return 0; } else if(t[cnter] < '0' || t[cnter] > '9') { if(t[cnter]) return 0; } else if(!dots) ++whole; else ++part; ++cnter; } if(dots > 1) return 0; step = 1; FTYPE factor = 1; if(!dotpos) { while(whole) { --whole; *number += FTYPE(t[whole] - 48) * factor; factor *= 10; } return 1; } while(part || whole) { if(whole) { *number += FTYPE(t[dotpos - step] - 48) * factor; --whole; } if(part) { *number += FTYPE(t[dotpos + step] - 48) / factor / 10; --part; } factor *= 10; ++step; } result = 1; return result; }