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.
Category Archives: Programowanie
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
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
Poniżej 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 )
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.
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; } |
Komentarze: