int wczytuj_mnozenie_dzielenie(int *znak, int liczba1) { int operacja, liczba2; bool poprzednio_cyfra, ujemna; poprzednio_cyfra = true; operacja = *znak; liczba2 = 1; // Liczba neutralna dla mnozenia i dzielenia ujemna = false; do { // Jesli wprowadzilismy znak, ktory konczy wewnetrzna petle if ((*znak == '\n' || *znak == '+' || *znak == '-') && poprzednio_cyfra) { ustaw_jako_przeciwna(&liczba2, &ujemna); liczba1 = oblicz(operacja, liczba1, liczba2); break; // Jesli wczesniej byla cyfra, a teraz jest + lub - to wykonaj poprzednia operacje // i zdefiniuj nowa jako nastepna } else if (poprzednio_cyfra && (*znak == '*' || *znak == '/')) { ustaw_jako_przeciwna(&liczba2, &ujemna); liczba1 = oblicz(operacja, liczba1, liczba2); poprzednio_cyfra = false; operacja = *znak; // Jesli cyfra, to wczytuj liczbe } else if (czy_cyfra(*znak)) { // Jesli poprzednio byl znak, to rozpocznij wczytywanie nowej liczby if (!poprzednio_cyfra) { poprzednio_cyfra = true; liczba2 = 0; // Jesli nie, to kontunuuj wczytywanie } else { liczba2 *= 10; } liczba2 += cyfra(*znak); // Jesli wczesniej byl znak, a teraz jest -, to zdefiniuj nastepna liczbe jako ujemna } else if (!poprzednio_cyfra && *znak == '-') { ujemna = true; // Jesli bedzie spacja, zignoruj, w przeciwnym wypadku wyswietl blad } else if (*znak != ' ') { wyswietl_blad(2); } } while (*znak = getchar()); // Zwracamy wynik, a w *znak jest znak kolejnej operacji return liczba1; }
static void dodaj_do_text(GtkWidget *widget, gpointer data) { if(strcmp((gchar*)data, "\n") == 0) { gtk_entry_append_text(GTK_ENTRY(text), (gchar*)"="); char* wejscie = gtk_entry_get_text (GTK_ENTRY (text));; int len = strlen(wejscie); char* wynik = oblicz(wejscie, len); gtk_entry_set_text(GTK_ENTRY(text), wynik); } if(strcmp((gchar*)data, "") == 0) { gtk_entry_set_text(GTK_ENTRY(text), ""); } else gtk_entry_append_text(GTK_ENTRY(text), (gchar*)data); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); model = new QStandardItemModel(0,5,this); model->setHorizontalHeaderItem(0, new QStandardItem(QString("Nazwa pliku"))); model->setHorizontalHeaderItem(1, new QStandardItem(QString("Rozszerzenie"))); model->setHorizontalHeaderItem(2, new QStandardItem(QString("Rozmiar"))); model->setHorizontalHeaderItem(3, new QStandardItem(QString("Ścieżka"))); model->setHorizontalHeaderItem(4, new QStandardItem(QString("Wartość/Mb"))); ui->wybran_wiersz->setVisible(false); ui->PodanyRozmiar->setVisible(false); ui->aktualnyRozmiar->setVisible(false); ui->plikiEtyketa->setVisible(false); ui->Rozmiar_etykieta->setVisible(false); connect(ui->przyciskUstawienia, SIGNAL(clicked()), this, SLOT(otworzUstawienia())); connect(ui->przyciskOblicz, SIGNAL(clicked()), this, SLOT(oblicz())); alg_plec = new algorytm_plecakowy(); ui->Tabela->setModel(model); ilosc_elementow = 0; rozmiar = 0; wielkoscPlecaka = 1.44; }
std::string Gamma::opis() { return std::to_string(oblicz()); }
std::string e::formatuj_wyrazenie() { return std::to_string(oblicz()); }
std::string operator2arg::opis() { return "Wartosc " + std::to_string(oblicz()); }
int main() { printf("-------------------------\n"); printf("Sposób działania programu\n"); printf("Wpisz wyrażenie i zatwierdź ENTERem\n"); printf("Minus stojacy przed liczba oznacza liczbe ujemna\n"); printf("Przykladowe wyrażenia:\n"); printf("2*3 + 4*5 (zwraca 26)\n"); printf("-10 - -3 (zwraca -7)\n"); printf("-2/5 * 100 (zwraca 0, bo dzielenie jest calkowite, wiec -2/5 = 0)\n"); printf("-------------------------\n\n"); int znak, liczba1, liczba2, operacja; bool poprzednio_cyfra, ujemna; poprzednio_cyfra = false; operacja = '+'; liczba1 = 0; liczba2 = 0; ujemna = false; znak = getchar(); do { // Dlaczego to jest rozdzielne od pozostalych przypadkow? // Poniewaz po wykonaniu tego bloku, po wykonaniu dzielenia i mnozenia // mamy w znak jakas operacje - dodawania lub odejmowania i chcemy ja jeszcze zaladowac. if (poprzednio_cyfra && (znak == '*' || znak == '/')) { liczba2 = wczytuj_mnozenie_dzielenie(&znak, liczba2); poprzednio_cyfra = true; } // Jesli wczesniej byla cyfra, a teraz jest + lub - to wykonaj poprzednia operacje // i zdefiniuj nowa jako nastepna if (poprzednio_cyfra && (znak == '+' || znak == '-')) { ustaw_jako_przeciwna(&liczba2, &ujemna); liczba1 = oblicz(operacja, liczba1, liczba2); poprzednio_cyfra = false; operacja = znak; // Jesli cyfra, to wczytuj liczbe } else if (czy_cyfra(znak)) { // Jesli poprzednio byl znak, to rozpocznij wczytywanie nowej liczby if (!poprzednio_cyfra) { poprzednio_cyfra = true; liczba2 = 0; // Jesli nie, to kontunuuj wczytywanie } else { liczba2 *= 10; } liczba2 += cyfra(znak); // Jesli wczesniej byl znak, a teraz jest -, to zdefiniuj nastepna liczbe jako ujemna } else if (!poprzednio_cyfra && znak == '-') { ujemna = true; // Jesli bedzie spacja zignoruj // Jesli jest jeden ze znakow z rozdzielnych przypadkow, rowniez nie reaguj // Jesli jednak jakis inny znak, to wyrzuc blad } else if (znak != ' ' && znak != '\n' && !(poprzednio_cyfra && (znak == '*' || znak == '/'))) { wyswietl_blad(2); } // Jesli wprowadzilismy symbol zakonczenia wprowadzania wyrazenia // Ta instrukcja nie jest w kolejnym ifie, bo po wyjsciu z mnozenia/dzielenia, mogl byc znak \n, wiec // trzeba tutaj to sprawdzic - jesli tak bylo, to trzeba zakonczyc program if (znak == '\n' && poprzednio_cyfra) { ustaw_jako_przeciwna(&liczba2, &ujemna); liczba1 = oblicz(operacja, liczba1, liczba2); break; } } while (znak = getchar()); printf("\n\nWynik: %d", liczba1); return 0; }