Witam, mam do napisania program, którego zadaniem będzie wypisywanie tabliczy mnożenia do podanego wcześniej zakresu liczb (początek i koniec). Napisałem już kod, ale zastanawiam się, czy jest on poprawny i czy nie dałoby się zrobić tego lepiej, łatwiej. Z góry dziękuję i pozdrawiam ! Aha, komentarze są dodane dla nauczyciela :)
#include <iostream>
#include <cstdlib>
using namespace std;
/* stale */
const int MAX_CZYNNIK = 99;
const int MAX_ROZNICA = 13;
/* prototypy */
void wypelnij(int p, int o);
int ustalSzerokosc(int n);
int pobierzDane(int t);
int pobierzDane(int t, int p, int r);
/* glowna funkcja */
int main()
{
cout << "Podaj liczbe od ktorej zaczynamy: ";
int pierwszyCzynnik = 0;
pierwszyCzynnik = pobierzDane(MAX_CZYNNIK); // pobiera dane
cout << "Podaj liczbe na ktorej konczymy (maksymalnie wieksza o 13 od poprzedniej): ";
int ostatniCzynnik = 0;
ostatniCzynnik = pobierzDane(MAX_CZYNNIK, pierwszyCzynnik, MAX_ROZNICA); // pobiera dane
wypelnij(pierwszyCzynnik, ostatniCzynnik); // wypisuje tabliczke
//system("Pause"); dla starszych kompilatorow
return 0;
}
int pobierzDane(int test) // podstawowa wersja funkcji
{
int dana = 0;
while(!(cin >> dana)) // sprawdza czy dana jest liczba
{
cin.clear(); // czysci flagi bledu
cin.sync(); // czysci bufor
cout << "To nie jest liczba ;) Sprobuj ponownie: ";
}
if (dana > test || dana <= 0) // sprawdza czy liczba nie jest za duza i nie jest mniejsza lub rowna zero
{
cout << "Za duza liczba, zero lub ujemna liczba, sprobuj ponownie: ";
cin.sync();
pobierzDane(test); // rekurencja, wywoluje sama siebie
}
cin.sync();
return dana; // zwraca liczbe
}
int pobierzDane(int test, int poprzednia, int roznica) // przeciazona wersja funkcji
{
int dana = 0;
while (( ( dana = pobierzDane(test) ) - poprzednia ) > roznica ) // przypisuje danej liczbe z pobierzDane(), nastepnie sprawdza czy nie jest za duza roznica
{
cout << "Za duza roznica, kolego :) Sprobuj ponownie: ";
cin.sync();
}
return dana;
}
void wypelnij(int start, int stop)
{
int szerokosc = ustalSzerokosc(stop * stop); // zmienna potrzebna do ustalenia szerokosci
cout << endl;
cout.width(szerokosc); // ustala szerokosc wypisywanych znakow, ulatwienie
cout << " ";
for (int i = start; i <= stop; i++) // wypisuje pierwszy wers
{
cout.width(szerokosc);
cout << i;
}
cout << endl << endl;
for (int i = start; i <= stop; i++)
{
cout.width(szerokosc);
cout << i;
cout << " ";
for (int j = start; j <= stop; j++)
{
cout.width(szerokosc);
cout << i * j; // mnozenie
}
cout << endl;
}
}
int ustalSzerokosc(int iloczyn) // funkca ustalajaca szerokosc najwiekszej liczby, tzn ilosc znakow
{
int dlugosc = 2;
while( (iloczyn /= 10)!=0) // jezeli liczba bedzie jednocyfrowa, to po podzieleniu jej calkowicie przez 10, wynik bedzie rowny 0
dlugosc++;
return dlugosc;
}