Category Archives: Programowanie

Zadania ze SPOJ’a – Suma

Na początku chciałbym zaznaczyć, że nie chce pokazywać oryginalnego programu na zadanie, bo całkiem nie o to tutaj chodzi. Zaczynam rozwiązywać zadanie z popularnego serwisu z problemami programistycznymi SPOJ. Jakiś czas temu walczyłem, jednak się poddałem – brak chęci do programowania.

Kontynuuj czytanie..“Zadania ze SPOJ’a – Suma” »

Naprawione – problem z funkcją losowania w C++

Na zajęciach programowania, napotkaliśmy na problem który wygląda tak : po wylosowaniu liczb, cały czas zostawały one na poziomie tysięcy/dziesiatek a zmieniały się tylko ich końcówki.

Wyjście:

1346, 1368, 1356 …

Z problemem sobie poradziłem korzystając z biblotek dla funkcji srand. Sprawa tak prosta że az głupia, po prostu zapomnielismy o deklaracji bibloteki <time.h> która odpowiada za obsluge time(null), czyli nasz rdzeń losowania :).

 

Przykładowy program na którym testowałem funkcje losowania :

 

 

 
    #include<iostream>
    #include <time.h>
 
    using namespace std;
 
    int main() {
    srand ( time(NULL) );
 
    for ( int i=1; i<10; i++ ){
 
    cout<<endl<<"Proba: "<<i<<endl<<endl;
    cout<<rand()<<'\n';
    cout<<rand()<<'\n';
    cout<<rand()<<'\n';
 
 
    }
 
        system("PAUSE");
        return 0;
    }

Zbiór programów, programowanie mikrokontrolera – BASCOM

Nie znalazłem podobnego zbioru programów, który mógłby pomóc początkującym programistą, czy też elektronikom którzy próbują swoich sił z mikrokontrolerami.

Tak więc, chce stworzyć taki wpis, zamieszczam poniżej kilka programów[kod źródłowy] który należy skompilować w bezpłatnym programie BASCOM-AVR. Następnie plik *.hex wgrywamy za pomocą programatora do mikrokontrolera.

Oczywiście to nie wszystko, następnym etapem jest podłączenie kabelków z odpowiednimi portami czy też rejestrami.
( Port.A -&AMP;GT; dioda1, stan 1 dioda sie swieci, stan 0 dioda jest zgaszona ).
Jak znajde chwile napiszę o tym więcej, osobny wpis.

Wszystko działa bezproblemowo na układzie ZL3AVR na którym jakiś czas pracuje.

Kontynuuj czytanie..“Zbiór programów, programowanie mikrokontrolera – BASCOM” »

Hack me 3.0 – Podpowiedzi..

Jakiś czas temu na lekcji systemów operacyjnych oglądaliśmy fajną gre, która miała służyć łamaniu “zabezpieczeń” strony i ogólnie chyba zabawie, chociaż więcej nerwów.

Nie powiem wcale takie łatwe to nie jest, tym co zrobiłem chciałem się pochwalić i pokazać jak to zrobić! :)

Link gra jak najbardziej warta uwagi :P

Poniżej podpowiedzi

Kontynuuj czytanie..“Hack me 3.0 – Podpowiedzi..” »

Przesyłanie argumentów przez referencję

O co chodzi z tą referencją, i co to takiego jest ?

Patrząc na ekran, po kompilacji programu, zauwazamy ze funkcja, która chciała wyzerować dwa obiekty a i b wysłane do niej jako argumeny, zaskoczyła nas.

Oczywiście obiekt a jest nietknięty. To znamy, jednak obiekt b ma wartość 0, dlaczego?

Kilka słów o funkcji zer:

Widzimy,że to funkcja , która przyjmuje dwa argumenty, pierwszy z nich jest przesyłany – tak jak poprzednio – przez wartość, drugi natomiast jest przesyłany przez referencję. Zauważ znak &.

W main mamy dwie zmienne, które wysyłamy do funkcji zer. Inaczej mówiąc: wywołujemy funkcje zer z parametrami aktualnymi a,b.

Wewnątrz funkcji zer, na moment przed egzekucją, wypisujemy jeszcze wartość dwóch parametrów formalnych wart,ref.
Tu następuje jakaś operacja zmieniająca wartość zmiennych wart i ref.W naszym przypadku wpisanie im zer.

Na dowód, że tak się stało w istocie – wypisujemy ich wartość na ekran.

Kończymy pracę funkcji, będąc już w main wypisujemy na ekranie wartości zmiennych a i b. I tu cała niespodzianka.
a pozostało bez zmian, a b?

pozostało zmienione właśnie ze względu na referencję.
- dwie nazwy ref, b określały ten sam obiekt. W tym cała filozofia referencji w języku C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
 
 
void zer(int wart, int &ref) {
	cout<<"\tW funkcji zer przed zerowaniem\n";
	cout<<"\twart="<<wart<<"ref."<<ref<<endl;
 
	wart = 0;
	ref = 0;
 
	cout<<"\tW funkcji zer po zerowaniu\n";
	cout<<"\twart="<<wart<<"ref="<<ref<<endl;
							}
 
int main() {
	int a = 44, b= 77;
 
	cout<<"Przed wywolaniem funkcji:zer\n";
	cout<<"a "<<a<<"  b  "<<b;
 
	zer(a,b);
	cout<<"Po powrocie z funkcji zer\n";
	cout<<" a "<<a<<"  b"<<b<<endl;
	system("PAUSE");
}

Funkcja inline( w lini )

Dzisiaj testowałem funkcję inline, która pozwala na wypisanie wnętrza funkcji np. takiej jak poniżej,

int zor(int ases) {
return ( ases + 0.5)
}

Jak ją stosować? Wystarczy dodanie do funkcji wyżej przedrostka inline :

inline int zor(int ases) {
return ( ases + 0.5)
}

Kontynuuj czytanie..“Funkcja inline( w lini )” »

Program na obliczanie poteg liczb calkowitych z zadanego przedzialu

Przerabiajac książke [ Symfonia C++ ] , znalazłem ciekawy program który oblicza potęge liczby z zadanego mu przedziału.
Warto przetestować, fajny program.

A tak obok, mam zamiar cześciej opisywać takie problemy programistyczne*, z zasaday a może się komuś przyda :)
Zawsze mnie to zmusza, do przepisania kodu z książki, może zapamiętam ??
W każdym razie zapraszam do analizy kodu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
 
long potega(int stopien, long liczba);
//*****************************************************************************
int main() {
	int pocz, koniec;
 
	cout<<"Program na obliczanie poteg liczb calkowitych z zadanego przedzialu\n"
	<<"Podaj poczatek przedzialu:";
	cin>>pocz;
 
	cout<<"Podaj koniec przedzialu:";
	cin>>koniec;
 
	//petla drukujaca wyniki z danego przedzialu
	for(int i=pocz; i<= koniec; i++ )
	{
		cout<<i
		<<" Do kwadratu="
		<<potega(2,i)
		<<" a do szczescianu="
		<<potega(3,i)
		<<endl; 
	}
	system("PAUSE");
}
//*****************************************************************************
 
long potega( int stopien, long liczba) {
 
	long wynik = liczba;
 
	for(int i = 1; i<stopien; i++)
	{
		wynik = wynik * liczba;
		// zwiezlej mozna zapisac to samo jako wynik*=liczba;
	}
return wynik; }

*Mateusz mam nadzieje że pomożesz ;)

[Zadanie C++] Dodaj dwie tablice – wynik zapisz w trzeciej.

Dokładnie tak jak w temacie, zadanie polega na dodaniu tablicyA+tablicaB = tablicaC.

Dodawanie dwóch tablic do siebie.

Niby proste, ale jednak trochę kodzenia jest. Szczególnie dla początkujących.
Poniżej przedstawiam rozwiązanie problemu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<iomanip>
 
using std::cout;
using std::setw;
 
void wypisz(int tab[], int n)
{
     for (int i=0; i<n; ++i)
     cout<<setw(3)<<tab[i];
}
 
 
int main()
{
    int tablica[20], tablica2[20], tablica3[20];
    srand (time(NULL));
 
    for( int i=0; i<10; ++i) tablica[i] = rand()%10;
    for( int i=0; i<10; ++i) tablica2[i] = rand()%10;
 
    cout << "Tablica wypelniona losowo liczbami z przedzialu <0,10>:\n";
 
    wypisz(tablica,10); 
    cout<<"\n\n";
 
	cout << "Tablica2 wypelniona losowo liczbami z przedzialu <0,10>:\n";
	wypisz(tablica2,10);
	cout<<"\n\n";
 
	cout<<"Dodawanie dwoch tablic\n";	
for ( int i = 0; i<10; ++i ) {
 
tablica3[i] = tablica[i] + tablica2[i];
cout<<setw(3)<<tablica3[i];
}
cout<<"\n";
 
	system( "PAUSE" );
    return 0;
}

* Dzięki Mateusz.

[C++] Szyfr cezara – ulepszony!

Jest takie zadanie ze strony spoj.pl , które wymaga od nas zakodzenia programu który będzie szyfrował tekst konkretnym szyfrem – Szyfr cezara.

Polega on na zamianie liter o 3, czyli a=c  itd.
Program poniżej , jest bardziej uniwersalny nie tylko szyfruje – szyfrem cezara ale także innymi szyframi które mu zadamy. Możemy sami ustawić przesunięcie , w szyfrze cezara = 3, w naszym szyfrze może być to 4 ..

Jest zrobiony na tablicy liter ASCII, ponieważ każda litera jest zaprezentowana w ów kodzie zadanie można dość prosto rozwiązać.

#include<iostream>
using namespace std;
 
void szyfruj(char tekst[], int klucz)
{
     int i = 0;
     klucz = klucz%26; // reszta z dzielenia wartosci wpisanego klucza(przesuniecie znaku o całkowitą wielokrotność liczby 26)..
     while(tekst[i]!='\0')
     {
                   if((int)tekst[i]>122-klucz) // ograniczenie aby nie wyjść poza zakres alfabetu
                   tekst[i]=(char)((int)tekst[i]+klucz-26);
                   else
                   tekst[i] =(char)((int)tekst[i]+klucz);
                   i++;
                   }
                   }
void deszyfruj(char tekst[], int klucz)
{
     int i = 0;
     klucz = klucz%26;
     while (tekst[i]!='\0')
     {
           if((int)tekst[i]-klucz<97)
           tekst[i] = (char)((int)tekst[i]-klucz);
           else
           tekst[i]=(char)((int)tekst[i]-klucz);
           i++;
           }
           }
int main() {
    char a[50];
    int klucz;
    cout<<"Podaj klucz(dla szyfru CEZARA WPISZ 3 )";
    cin>>klucz;
    cout<<"Tekst do zaszyfrowania:";
    cin>>a;
    cout<<"Tekst zaszyfrowany";
    szyfruj(a,klucz);
    cout<<a<<endl;
    cout<<"Tekst odszyfrowany:  ";
    deszyfruj(a,klucz);
    cout<<a<<endl;
    system("PAUSE");
 
    return 0; }

* Wszystko działa poprawnie, jednak polecam przetestować.
Nie jest to mój kod, lecz kod z książki – jednak bardzo się przydał do zrozumienia tematu.

Losowanie serial, bezsensowny kod

Miałem pomysł na coś fajnego, ale nie do końca umiem go opisać.
Losowanie sezonu 1-10, odcinka 1-24.  Wykorzystałem funkcje rand, do losowania.

Tylko nie zrobiłem tablicy, która nie pozwoliłaby na występowania zera. :P

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <conio.h>
using namespace std;
 
int main(){
int l,k;
srand(time(NULL));
 
 
cout<<"Losowanie sezonu friends:  "<<endl;
int ,j;
k=rand()%10+1;
cout<<"sezon: "<<k<<endl;
cout<<"Losowanie odcinka friends:  "<<endl;
l=rand()%24;
cout<<"Odcinek ktory powinienes obejzec to:  "<<l;
getch();
return 0;
}