środa, 10 października 2012

Kurs C++ cz. 1b

Dzisiaj stworzymy nasz pierwszy bardziej zaawansowany program czyli prosty kalkulator.

Nasz kalkulator będzie wykonywał działania na 2 liczbach tak więc je zadeklarujmy

#include<iostream>

using namespace std;

int a,b;

Dobrze nasz kalkulator będzie wykonywał działania dodawania, odejmowania, mnożenia oraz dzielenia, do tego potrzebne będą nam operatory matematyczne są to odpowiednio +, -, *, /.

Przydałoby się aby użytkownik wiedział co ma wpisać smarujemy cout'a:

cout << "Podaj liczbe a: ";

Teraz przyszedł czas na użycie cin. Jest to wpisanie danych do programu:

cin >> a;

Zauważcie w którą stronę są zwrócone strzałki. To co teraz zrobiliśmy to wpisanie danych które użytkownik wybrał do zmiennej a. Zmienną a mamy załatwioną tak węc potrzebujemy jeszcze zrobic to samo ze zmienną b:

cout << "Podaj liczbe b: ";
cin >> b;
Mamy już wpisane na jakich liczbach będziemy robili działania, no właśnie na jakich? Posłuży nam tu funkcja switch(zmienna), ale najpierw stwórzmy prosty interfejs:

cout << "Wybierz działanie:\n1.Dodawanie\n2.Odejmowanie\n3.Mnozenie\n4.Dzielenie\n:" << endl;

Użyłem tutaj \n oznacza to przejście do nowe linijki jest także \t który tworzy tabulacje. Do funkcji switch potrzebujemy dodatkowej zmiennej która będzie przechowywała wybór użytkownika, tak więc dopisujemy do int a,b:

int a,b,wybor;

Teraz potrzebujemy aby użytkownik wpisał swój wybór:

cin >> wybor;

A teraz funkcja switch i od razu wypisanie wyniku:

switch(wybor)
{
case 1:cout << "Wynik dodawania liczb " << a << " i" << b << " to" << a+b<<endl;
case 2:cout << "Wynik odejmowania liczb " << a << " i" << b << " to" << a-b<<endl;
case 3:cout << "Wynik mnozenia liczb " << a << " i" << b << " to" << a*b<<endl;
case 4:cout << "Wynik dzielenia liczb " << a << " i" << b << " to" << a/b<<endl;
default: cout << "Bledny wybor" << endl;
}

Case oznacza konkretny wybór np Case 1 oznacza, że uruchomi się ta funkcja dopiero gdy wybor będzie równy 1, default oznacza inny wybór niż podane np. jeżeli napiszemy 5 to zwróci nam "Bledny wybor". Tak oto tym sposobem napisaliśmy prosty kalkulator.

W następnej części zaczniemy omawiać pętle i instrukcje warunkowe.


Zadania
1. Dodaj do programu możliwość potęgowania liczby a przez liczbę b (podpowiedź:  użyj biblioteki cmath)
2. Dodaj trzecią liczbę.
3. Trudne(na obecnym poziomie): Spraw by program zakończył się tylko wtedy jeżeli wybór będzie prawidłowy w przeciwnym wypadku niech program pyta się dalej o wybór(podpowiedź: należy użyć pętli while)

Kurs C++ cz. 1a

Witajcie
Zgonie z obietnica zaczynam kurs języka C++. Kurs będzie w większej części praktyczny, więcej będzie przykładów.


 Informacje wstępne:
Wszystkie programy oraz obrazki będą dotyczyły kompilatora CodeBlocks, różnica może być tylko budowa okna, wszystko inne powinno działać dobrze.
1. Ogólnie o C++
Tak jak mówiłem nie będę przybliżał historii C++, jeżeli jesteś ciekawy co to jest odsyłam na Wikipedię: http://pl.wikipedia.org/wiki/C%2B%2B 
2. Środowisko programistyczne
Osobiście na razie używam CoeBlocks'a(http://www.codeblocks.org/ ), mogę również polecić NetBeansa(netbeans.org) który jest zaawansowanym środowiskiem umożliwiający pisanie programów w Java, HTML, C++ i wielu innych, posiada również dokładne pokazywanie błędów,, dobry dla początkujących jak i zaawansowanych. o niedawna używałem także DevCpp(http://www.bloodshed.net/index.html) jest względnie mały, niestety od około 2005 roku nie jest rozwijany.
3. Pierwszy program
Nie wiem czy jest to jakaś tradycja, lub niewierzenie w możliwości ludzi, al zawsze pierwszym programem jest Hello World.
  1. Tworzymy nowy projekt(New Project) C++ Console Application(lub podobnie zależy jakie środowisko) 
  2. Otwieramy plik main.cpp
  3. Naszym oczom powinno się ukazać takie okienko
 
Po lewej stronie mamy listy: plików projektu, symboli użytych w projekcie oraz pliki źrółowe projektu.
Na dole mamy konsole błędów(warto dodać, że konsola w NetBeansie jest zaimplementowana w program tj. nie otworzy się emulator MsDos tylko wyświetlą nam się dane w konsoli błędów), a w centralnej części mamy kod aktualnie otwartego pliku.

Można zauważyć, że pierwszy program jest już napisany, teraz omówię poszczególne linijki.
#incldue<iostream>
Jest to implementacja standardowej biblioteki wejścia/wyjścia. Słówko kluczowe #include oznacza właśnie implementacje biblioteki lub pliku nagłówkowego(o tym również będzie) w znakach mniejszości i większości(< >) wpisujemy nazwę biblioteki, ich nazwy można znaleźć w głównym folderze środowiska programistycznego a następni w folderze \lib.

Następną linijką jest:
using namespace std;
Jest to poinformowanie kompilatora o standardowym wejściu/wyjściu którym jest konsola.

Główną funkcją każdego programu bez którego nie może działać jest main() słówko int oznacza typ zwracanej wartości przez funkcję, w tym przypadku liczby całkowite. Klamry oznaczają zasięg danej funkcji.

W środku funkcji mamy słówko: cout jest to przekazanie informacji do wyjścia czyli w naszym przykładzie konsola. Podwójne strzałki oznaczają w którą stronę kieruje się strumień w przypadku cout są skierowane w jego stronę(lewo), następnie w cudzysłowach przekazujemy dane string(czyli napis) w naszym przypadku Hello World następnie znowu mamy podwójne strzałki w tą samą stronę. Na końcu mamy słówko endl które oznacza przejście do kolejnej linni. Na samym końcu jest średnik ;po prostu informuje kompilator o zakończeniu danego działania, przeważnie jest zawsze a nawet jeżeli zapomnieliśmy o nim kompilator nas o tym poinformuje.

Na samym końcu funkcji mamy słówko return które oznacza jaką wartość ma zwrócić funkcja, w naszym przypadku jest to 0.

To wszystko teraz możemy wybrać z menu Build->Build and Run bądź po prostu nacisnąć F9 i oto napisaliśmy pierwszy program.

Na dziś to wszystko, w następnej części poznam typy zmiennych i napiszemy prosty kalkulator.





niedziela, 7 października 2012

Cyfry z matury maj 2012 cz. 3

Cześć w dzisiejszej części zajmiemy się ostatnim z podpunktów czyli c przypomnę jego treść:
c)  Wypisz wszystkie liczby z pliku cyfry.txt, których cyfry tworzą ciąg rosnący.
Przykład:
Cyfry liczby 123579 tworzą ciąg rosnący, ponieważ 1<2<3<5<7<9.
Cyfry liczby 1232 nie tworzą ciągu rosnącego, ponieważ ostatnia cyfra (2) nie jest
większa od przedostatniej (3).
Cyfry liczby 34556 nie tworzą ciągu rosnącego, ponieważ cyfra trzecia (5) i cyfra
czwarta (5) są sobie równe.
A więc musimy sprawdzić czy kolejne cyfry liczby tworzą ciąg rosnący, mamy ułatwione zadanie gdyż podpunkt b dzieli nam liczbę na cyfry tylko że liczy jej sumę, my musimy sprawdzić czy kolejna cyfra jest mniejsza od poprzedniej. Dotychczasowa pętla wygląda tak:

for(int i=0;i<1000;i++)
{
cin >> liczba;
if(liczba%2==0)parzyste++; 
while(a>0)
{
b=a/10;
a%=10;
suma+=a;
a=b;
}
if(i==0){najmniejsza=suma;punktB[1]=liczba;} if(suma>=najwieksza){punktB[0]=liczba;najwieksza=suma;}
else if(suma<najmniejsza){punktB[1]=liczba;najmniejsza=suma;}
}
Pamiętamy, że a na pewnym odcinku staje się naszą cyfrą, aby sprawdzić czy jest mniejsza od poprzedniej potrzebujemy dodać zmienną:
unsigned short int a2=9;
Musimy także dodać tablicę którą określiliśmy w pierwszej części:
unsigned long int * rosnie;
rosnie = new unsigned long int[1001];
Dodatkowo określmy zmienną typu logicznego która będzie sprawdzała czy zmienna a2 jest większa od a:
bool wiekszaa2=true;
Oraz przydałby nam się licznik liczb które mają ciąg rosnący:
unsigned long int k=0;
Określiliśmy potrzebne zmienne teraz wystarczy sprawdzać czy a jest większa od a2 jeżeli jest to wtedy liczba nie posiada ciągu rosnącego. Wystarczy w pętli while przed:

suma+=a;
dodać:
if(a>a2)wiekszaa2=false;
a2=a;
I już mamy warunek sprawdzający czy nie wystąpił fałsz czyli w naszym przypadku czy zmienna a nie była większa od poprzedniej a(a2).

Teraz musimy napisać tylko warunek czy wiekszaa2 jest prawdziwa, dodać do tablicy naszą liczbę oraz zwiększyć licznik o 1:
if(wiekszaa2==true){rosnie[k]=liczba;k++;};



Dodatkowo resetujemy zmienną:
wiekszaa2=true;
Wypisanie będzie wyglądać tak:
cout << "c ";
 if(k>0)for(int i=0;i<=k-1;i++)cout << rosnie[i] << " ";
 Tak oto skończyliśmy cały program, trochę to zajęło ale praktyka czyni mistrza. W najbliższych tygodniach spróbuje napisać kurs programowania, oczywiście nadal będą się pojawiać tego typu zadania bądź tutoriale np. z javascriptu.

Ostateczny kod programu:
    #include<iostream>
    using namespace std;
    int main()
    {
        unsigned long int liczba,parzyste=0,punktB[2],suma=0,a=0,b=0,k=0,najwieksza=0,najmniejsza=0;//dodajemy nowe zmienne
        unsigned short int a2=9;
        unsigned long int * rosnie;
        rosnie = new unsigned long int[1001];
        bool wiekszaa2=true;
        punktB[0]=1;
        punktB[1]=1;
        for(int i=0;i<=1000;i++)
        {
            cin >> liczba;
            if(liczba%2==0)parzyste++;
            a=liczba;
            while(a>0)
            {
                b=a/10;
                a%=10;
                suma+=a;
                if(a>a2)wiekszaa2=false;
                a2=a;
                a=b;
            }
            if(wiekszaa2==true){rosnie[k]=liczba;k++;};
            wiekszaa2=true;
            if(i==0){najmniejsza=suma;punktB[1]=liczba;}
            if(suma>najwieksza){punktB[0]=liczba;najwieksza=suma;}
            if(suma<najmniejsza){punktB[1]=liczba;najmniejsza=suma;}
            suma=0;
        }
         cout << "a " << parzyste << endl;
         cout << "b " << punktB[0] << " " << punktB[1] << endl;
         cout << "c ";
         if(k>0)for(int i=0;i<=k-1;i++)cout << rosnie[i] << " ";
        return 0;
    }

Do przeczytania(?)!

Link do programu i danych:
http://speedy.sh/Rv7kg/zadanie4.exe 
http://speedy.sh/nSXTr/cyfry.txt

sobota, 6 października 2012

Kalendarz w javascript

Cześć, w dzisiejszym odcinku nauczę was jak zrobić taki kalendarz w javascript

.
NiePonWtoSroCzwPiaSob
A więc na początku tworzymy tabelkę która będzie posiadała 6 wierszy oraz 7 kolumn nadamy jej unikatową nazwę np. tabelka. W pierwszym wierszu wypisujemy dni tygodnia od niedzieli :

<table id="tabelka">
<tr>
<td>Nie</td><td>Pon</td><td>Wto</td><td>Sro</td><td>Czw</td><td>Pia</td><td>Sob</td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
</table>

Następnie tworzymy skrypt któy wypełni nam naszą tabelkę datami oraz zaznaczy aktualny dzień:

<script type="text/javascript">
function kalendarz()
{
var wiersz=1 //dni wstawaimy od wiersza nr.1 ponieważ w wierszu 0 powstawialiśmy nazwy dni tygodnia
Data = new Date(); //pobieramy date
var aktmies=Data.getMonth() //pobieramy miesiąc który jest aktualnie
var aktdzien=Data.getDate() //pobieramy aktualny dzień
var dzien=1 //dni liczymy od 1
Data.setDate(dzien) //cofniecie na poczatek aktualnego miesiaca
while (Data.getMonth()==aktmies) //petla dopoki nie skonczy sie miesiac

{
document.getElementById("tabelka").rows[wiersz].cells[Data.getDay()].innerHTML=Data.getDate() //napisz dzien w polu
 if (Data.getDate()==aktdzien)
document.getElementById("tabelka").rows[wiersz].cells[Data.getDay()].className="dzis" //dodajemy klase "dzś" do komórki która przechowuje date aktualnego dnia

if (Data.getDay()==6) {wiersz++} //dodajemy wiersz ponieważ skończył nam się tydzień
dzien++ //zwiększamy date o kolejny dzień
Data.setDate(dzien) //kolejny dzien
}
}
</script>

Skrypt dodajemy pomiędzy znaczniki <head>.

Po tabelce dopisujemy
<script type="text/javascript">
 kalendarz();
</script>
Czyli uruchamiamy funkcję.

Teraz w możemy pozmieniać styl kalendarza np:
<style type="text/css">
            #tabela,td,th{
                border:solid 2px #03436A;    
                border-collapse: collapse;
            }
            td {
                width:50px;
                height:50px;
                text-align: center;
                font-size: 28px;
                font-family: "Comic Sans MS";
            }

            tr:nth-child( odd ) {  //wiersze parzyste
                background-color: #FFCC40    ;
               
            }
            tr:nth-child( even ) { //wiersze nieparzyste
                background-color: #A62800    ;
                color: white;
               
            }
            .dzis { //komórka która została określona jako dzisiaj
                background-color: #FF3D00        ;
                border: 3px solid white;               
            }
            tr:first-child { //wiersz z nazwami dni tygodnia
               
                background-color: #0969A2    ;
                color: white;
                               
          }

</style>
 I to wszystko, prosty skrypt a efekt ciekawy.

Cyfry z matury maj 2012 cz. 2

Witam.
Dzisiaj zajmiemy się tak jak powiedziałem podpunktami a i b.

Tak więc przejdźmy do podpunktu a:

Mamy za zadanie wypisać ile liczb jest parzystych, prosta sprawa wystarczy sprawdzać czy liczba wczytana dzieli się przez 2, jeżeli tak zwiększamy parzyste o 1.

Zaczniemy już pisać program w wersji do kompilacji, pamiętajmy, że musimy dane wczytać z pliku cyfry.txt oraz zapisać je do pliku zadanie4.txt nie musimy tutaj kombinować z fstream'em wystarczy wejść w wiersz poleceń(start->uruchom->cmd) wejść do katalogu z naszym programem i plikami i napisać frazę:
cyfry.txt < nazwa_programu.exe > zadanie4.txt
Aha wszystkie programy wykonuje w środowisku CodeBlock.

Kod programu:
#include<iostream>

using namespace std;


int main()

{
unsigned long int liczba,parzyste=0; //deklarujemy zmienne oraz dla "spokojności" zerujemy
for(int i=0;i<1000;i++)   //wczytujemy liczby z pliku, pętla wykona się 1000 razy gdyż liczymy od 0
{
cin >> liczba;
if(liczba%2==0)parzyste++ //sprawdzamy czy zmienna z dzielenia liczby przez 2 wynosi 0 jeżeli tak to parzyste zwiększają się o jeden.
}
 cout <<"a " <<parzyste <<endl; //wypisujemy wynik poprzedzając go literką z podpunktu
To byłoby na tyle w podpunkcie a.

W podpunkcie b mamy wypisać liczbę która posiada największą oraz najmniejszą sumę cyfr..

tak więc dopisujemy zmienną punktB[1] którą stworzyliśmy w poprzedniej części oraz zmienną suma,najwieksza i najmniejsza:
 unsigned long int liczba,parzyste=0,punktB[1],suma=0,najwieksza=0,najmniejsza=0;
dodatkowo musimy wyzerować tablicę:
punktB[0]=0;
punktB[1]=0;
Aby znaleźć która z liczb ma największą sumę cyfr musimy znaleźć sumę. Wystarczy dodać 2 zmienne a i b, dzielić zmienną b która będzie przechowywać podzieloną liczbę oraz wyciągać resztę z dzielenia przez 10 ze zmiennej a. Zobaczmy jak to działa:


mamy liczbę 1234
zmienna a przyjmuje wartość liczby czyli 1234 
dzielimy ją dopóki nie osiągnie wartości 0
czyli
zmienna b równa się zmienna a dzielona przez 10 czyli 123,4 a ponieważ typ int przechowuje tylko zmienne całkowite otrzymamy 123
wyciągamy resztę z dzielenia z a czyli 1234%10=4  (a=4)
dodajemy otrzymany wynik do sumy suma+=a czyli 4
zmienna a przyjmuje wartość zmiennej b czyli a=123
i tak powtarzamy aż do 0

czyli nasz kod programu wygląda na razie tak:
int main()
{
unsigned long int liczba,parzyste=0,punktB[1],suma=0;//dodajemy nowe zmienne
for(int i=0;i<1000;i++)   //wczytujemy liczby z pliku
{
cin >> liczba;
if(liczba%2==0)parzyste++; 
while(a>0)
{
b=a/10;
a%=10;
suma+=a;
a=b;
}
}
 cout <<"a " <<parzyste <<endl;
}
Teraz wystarczy w pętli for sprawdzać czy otrzymana suma jest większa od zmiennej najwieksza lub mniejsza od najmniejsza jeżeli jest to podmieniamy najwieksza lub najwieksza na sume:
if(suma>najwieksza){punktB[0]=liczba;najwieksza=suma;}
else if(suma<najmniejsza){punktB[1]=liczba;najmniejsza=suma;}
I tak oto zakończyliśmy podpunkt b.

Kod programu:
    #include<iostream>
    using namespace std;
    int main()
    {

        unsigned long int liczba,parzyste=0,punktB[1],suma=0,a=0,b=0,najwieksza=0,najmniejsza=0;//dodajemy nowe zmienne
        punktB[0]=0;
        punktB[1]=0;
        for(int i=0;i<=1000;i++)   //wczytujemy liczby z pliku
        {

            cin >> liczba;
            if(liczba%2==0)parzyste++;
            a=liczba;
            while(a>0)
            {

                b=a/10;
                a%=10;
                suma+=a;
                a=b;
            }
            if(i==0){najmniejsza=suma;punktB[1]=liczba;}
            if(suma>=najwieksza){punktB[0]=liczba;najwieksza=suma;}
            else if(suma<najmniejsza){punktB[1]=liczba;najmniejsza=suma;}
            suma=0;

        }
         cout << "a " << parzyste << endl;

         cout << "b " << punktB[0] << " " << punktB[1] << endl;

        return 0;

    }
 W kolejnej części zajmiemy się podpunktem c.


piątek, 5 października 2012

Cyfry z matury maj 2012 cz. 1

Cześć,
Postanowiłem zrobić tego bloga dla maturzystów jak też dla osób lubiących programować.
Razem przejdziemy przez zadania maturalne z programowania.

Pierwsze zadanie brzmi następująco:
W kolejnych wierszach pliku cyfry.txt znajduje się 1000 liczb naturalnych, mniejszych
niż 10 do 9 (jeden miliard), po jednej liczbie w każdym wierszu.
Napisz program, który da odpowiedzi do poniższych podpunktów. Każdą odpowiedź zapisz
w pliku zadanie4.txt, poprzedzając ją oznaczeniem odpowiedniego podpunktu. 
a)  Ile liczb parzystych jest w pliku cyfry.txt?
b)  Podaj liczbę z pliku cyfry.txt, której suma cyfr jest największa oraz liczbę z tego
pliku, której suma cyfr jest najmniejsza. W obu przypadkach jest tylko jedna taka liczba.
Przykład:
Dla danego zbioru liczb:
121324
66562
675100
1187010
odpowiedzią są liczby: 66562  oraz 121324, ponieważ suma cyfr liczby 66562 jest
równa 25 (6+6+5+6+2) i jest największą taką sumą, zaś suma cyfr liczby 121324
(1+2+1+3+2+4) jest równa 13 i jest najmniejszą taką sumą.
c)  Wypisz wszystkie liczby z pliku cyfry.txt, których cyfry tworzą ciąg rosnący.
Przykład:
Cyfry liczby 123579 tworzą ciąg rosnący, ponieważ 1<2<3<5<7<9.
Cyfry liczby 1232 nie tworzą ciągu rosnącego, ponieważ ostatnia cyfra (2) nie jest
większa od przedostatniej (3).
Cyfry liczby 34556 nie tworzą ciągu rosnącego, ponieważ cyfra trzecia (5) i cyfra
czwarta (5) są sobie równe.
Zadanie nie wydaje się być trudne, ale na nim możemy ustalić podstawowe zasady rozwiązywania.

Pierwsze co robimy to dokładnie zapoznajemy się jak mają wczytać się dane, a dokładniej który wiersz co oznacza. W naszym przypadku danymi są liczby to liczby do 1 miliarda tak więc potrzebujemy zmiennej całkowitej czyli int, dodatkowo wiemy, że są one naturalne tak więc zaczynają się od 0 oraz są całkowite, tak więc potrzebujemy zmiennej większej od int, wystarczy dodać do niej przedrostek long oraz wiedząc, że nie mamy liczb ujemnych dajemy przedrostek unsigned.
unsigned long int liczba; 
Czemu tylko jedna zmienna a nie np. tablica? Po prostu chodzi o efektywność, mimo, że nie jest wymagana na maturze to dobry nawyk, by dążyć to optymalizacji kodu.

Załatwiliśmy sprawę wejścia, zajmijmy się wyjściem:
  • w podpunkcie a wyjściem będzie jedna liczba określająca ilość liczb parzystych tak więc początkowo możemy stworzyć zmienną
unsigned long int parzyste
  • w podpunkcie b na wyjściu będą 2 liczby których suma ich cyfr jest największa oraz najmniejsza(WAŻNE! Jeżeli mamy w jednym wierszu napisać 2 zmienne nie pomylmy kolejności tj. w tym  przypadku musimy podać największą i najmniejsza a nie najmniejszą i największą). Skoro są to 2 liczby mamy wybór: Możemy stworzyć 2 zmienne lub stworzyć tablicę. Wybór należy do was, ja akurat stworzę tablicę(pamiętajmy, że tablice indeksujemy od 0):
unsigned long int punktB[1]
  • w podpunkcie c nie mamy określonej ilości liczb na wyjściu wiemy, że ich liczba jest mniejsza bądź równa 1000. Dobrze jest w tym przypadku zrobić tablicę dynamiczną:
tworzymy wskaźnik tablicy: unsigned long int * rosnie;
tworzymy tablicę wykorzystując wskaźnik:  rosnie = new unsigned long int[1000];
Na dzisiaj to tyle. Podsumujmy:
  • stworzyliśmy zmienną przechowującą kolejne cyfry;
  • stworzyliśmy 3 zmienne przechowujące dane na wyjściu;
Mimo, że wygląda to na mało znaczące ale musimy pamiętać, że  dzięki stworzeniu optymalnych zmiennych nasze programy będą działać efektywniej, oraz wyeliminujemy błędy możliwe przy wczytaniu większej liczby niż to możliwe do zmiennej.

W następnej części określimy co nasz program ma robić oraz przystąpimy do podpunktów a i b;