Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Temat poświęcony wszelkim wersjom języka C. Pytania, problemy i ich rozwiązania, pomoc w ulepieniu programu itd...

Ponieważ nie znalazłem na Forum jeszcze takiego tematu, więc zakładam. Mam następujący problem:

Mam w programie napisane 5 funkcji. Załóżmy, że są to: fun1, fun2, fun3, fun4, fun5. Potrzebuje napisać kolejną funkcję, która będzie służyła za swego rodzaju menu; i tak: po wypisaniu użytkownikowi komunikatu w stylu "wciśnij odpowiedni klawisz, aby uruchomić odpowiednią funkcję" na ekranie wyświetli się:

F1 - fun1
F2 - fun2
F3 - fun3
F4 - fun4
F5 - fun5
ESC - zakończ program

Jak zrobić, żeby to zadziałało?? Tzn. żeby po wciśnięciu danego klawisza uruchamiała się odpowiednia funkcja?? Wiem, że trzeba skorzystać z funkcji getchar() i przyporządkować odpowiednim przyciskom ich kody ASCI, ale za bardzo nie wiem jak to zrobić :( Czy ktoś mógłby mi pomóc i napisać taką funkcję menu?? Funkcja ta ma być napisana w języku ANSI C, zatem nie mogę wykorzystywać bibliotek i funkcji, które wystrępują tylko w C++.

Z góry dziękuję za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

sprawa dość ciężka, gdyż ANSI C jest już językiem niemalże archaicznym. Dziwi mnie zatem Twój wybór języka programowania ;). Ale to Twoja prywatna sprawa, więc wisi mi to. Jedyne, co mogę Tobie doradzić, to fakt, że kody ASCII poprzedzamy znakiem #. Dlatego [nie programuję ani w C, ani w żadnych od niego pochodnych, ale np. Enter jako char zastosować należy w postaci #13 [o ile pamiętam :P]. Osobiście spróbowałbym czegoś podobnego do instrukcji CASE ... OF ;).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Do robienia tego typu "menusów" służą słowa kluczowe switch i case.
Pierwsza lepsza wygooglowana strona: http://cermics.enpc.fr/~ts/C/SYNTAX/switch.html

Dalej kody ASCII klawiszy funkcyjnych też łatwo znaleźć w necie.
Pierwsza lepsza wygooglowana strona: http://www.jimprice.com/jim-asc.htm#keycodes

Problem jest tego rodzaju, że te klawisze mają kody dwubajtowe, więc musisz sobie jakoś z tym problemem poradzić. ;) Jak już będziesz wiedział co zostało wciśnięte (załóżmy, że wpisałeś "nazwę" wciśniętego klawisza do zmiennej "klawisz") to masz tak:

switch(klawisz)
{
case ''F1'':
funkcja1();
break;

case ''F2'':
funkcja2();
break;
...
...
}

Break jest ważne - jak o nim zapomnisz, to program nie wyjdzie z "pętli" switch i wykona wszystko dalej - czyli naciśnięcie F1 spowoduje wykonanie wszystkich funkcji po kolei.

Teraz więc pozostaje Ci tylko rozwikłanie problemu podwójnego kodu ASCII - powodzenia! :)
Przypuszczam, że pomoże użycie funkcji getchar dwa razy (z tego co pamiętam to ona wyciąga jeden bajt) i sprawdzenie obu wartości. Ale głowy nie dam. :P

----

--> NattaN

Przypuszczam, że to nie jest kwestia wyboru Bartuca, tylko jakieś odgórne wymagania - u nas na uczelni też na pierwszym roku wymagali ANSI C. :) Co do hasha, to nie masz racji, przynajmniej nie w przypadku czystego C.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękuję wszystkim za pomoc... Zaraz się zabieram do roboty i postaram się coś ulepić :P

-> NattaN

Nie masz do końca racji... Może "typowych programistów" nie uczą już ANSI C, ale jest to język, który służy przede wszystkim do programowania układów sterujących np. maszynami i na naszym wydziale jego znajomość jest konieczna.

-> Domek

No na naszym też nas tym katują... Tylko, że ja jestem na drugim roku :P
I sem. mieliśmy Turbo Pascala, II sem. wstęp do programowania w C/C++, no a teraz programowanie proceduralne w ANSI C (niby jako wprowadzenie do programowania obiektowego).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam pytanie ile ma cie lat???Od ilu najlepiej jest zaczac C++.Ja mam 14lat i mam 3 tomy po 300str jak sie programuje.Kuzyn programista kupil mi;).Ale problemow sie nastraja duzo z tym programowaniem....
Czy sadzicie ze jestem za mlody???

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie.W zasadzie można zaczynać nawet od 12 lat, gdyż jeśli zaczniesz już wtedy, to możesz w przyszłości pójść na jakąś politechnikę informatyczną i naprawdę dobrze sobie radzić. Z wieloletnią nauką ,,na własną rękę" i ukończoną pożądną szkołą, miałbyś później znacznie łatwiej przy szukaniu pracy.
A co do języka, który wybrać - na początek dobrze jest zająć się Pascalem. Większość współczesnych, popularnych języków opiera się właśnie na nim. No i jest on w programie zajęć informatycznych gimnazjów i liceów. Z drugiej strony - jeśli masz na oku konkretny język, to najlepiej od razu zacznij naukę jego - nie zawsze łatwo przystosować się do nieco innej składni, komend itd. Tu proponuję bardzo popularny język C lub C++ (a jako kompilatora/debuggera, czyli tego ,,programu do pisania programów" najlepiej na początku używać wizualnego czyli którejś wersji C++ Buildera), ew. Delphi (sam się go od pewnego czasu uczę, kompilator/debugger również wizualny, do zastosowań zarówno domowych jak i firmowych w pełni wystarczy). Jeśli poczujesz, że ,,jesteś dobry w te klocki", możesz spróbować zająć się czymś naprawdę trudnym - tzw. ,,Assemblerowcami". W nich napisanie prostego programu to sporo roboty, gdyż polecenia wydajesz bezpośrednio procesorowi (wręcz niezbędna okazuje się znajomość typu własnego procesora i jako taka jego architektury). Możesz dosłownie wręcz zaprogramować każde przerwanie. No i to w Assemblerze na ogół pisze się trójwymiarowe silniki gier oraz bardzo złożone programy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Hmm. Jest takie dość częste porzekadło wśród programistów, że dużo daliby, aby zacząć się uczyć programowania w wieku 11-12 lat. Osobiście mam znajomego, który opanował C w wieku 10 lat (ale gostek to wyjątek, aktualnie ma trzy doktoraty :P). Sam zacząłem uczyć się programowania w wieku 12 lat i nie żałuję ;). Nie znam C++, natomiast całkiem dobrze poruszam się w winapi oraz ogólnym programowaniu obiektowym (preferuję pisanie programów niż gier ;]) i bardzo mi z tym dobrze. Osobiście polecam programowanie każdemu, tak więc Radziula - ucz się ucz, póki nie jest za późno! ;]

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.10.2005 o 21:29, Radziula napisał:

Mam pytanie ile ma cie lat???Od ilu najlepiej jest zaczac C++.Ja mam 14lat i mam 3 tomy po 300str jak sie programuje.Kuzyn
programista kupil mi;).Ale problemow sie nastraja duzo z tym programowaniem....
Czy sadzicie ze jestem za mlody???

Najlepiej zacząć się uczyć wtedy, kiedy masz na to ochotę :)
Jeśli czujesz się na siłach - zaczynaj, na pewno sobie poradzisz. Nawet jak teraz wszystkiego nie opanujesz, to później będzie Ci znacznie łatwiej. A jak masz z czymś problem, wystarczy zapytać, choćby i na tym forum.

Czy zaczniesz od C++, czy Pascala, to bez znaczenia, ale polecam C++, bo Pascal jest już mało przydatny, a wcale nie jest łatwiejszy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.10.2005 o 23:47, Vel Grozny napisał:

Najlepiej zacząć się uczyć wtedy, kiedy masz na to ochotę :)


Święte słowa. :)

Dnia 16.10.2005 o 23:47, Vel Grozny napisał:

Czy zaczniesz od C++, czy Pascala, to bez znaczenia, ale polecam C++, bo Pascal jest już
mało przydatny, a wcale nie jest łatwiejszy.


No, tak. Jak zaczynałem uczyć się Pascala i postanowiłem spróbować swoich sił przy programowaniu obiektowym... Otworzyłem pierwszy przykładowy program - puste okno jedynie z określoną treścią ,,nagłówka" (wyleciało mi z głowy właściwe słowo). Spojrzałem na jego kod... Teraz programowania obiektowego boję się znacznie mnie. Nadal jednak napisanie bez moich ,,świętych notatek" czegoś co ma ręce i nogi odpada... Jeszcze się nauczę. Albo i nie. Pascal już wygasa, został tylko w niektórych szkołach jako dobry przykład na początek nauki. Chyba przesiądę się na stałe na Delphi.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No to ja jeszcze od siebie dodam, ze programowania fajnie uczyc sie teraz na obiektowych jezykach takich jak Java albo C#. Latwo mozna opanowac podstawowa skladnie ktora wlasciwie nie rozni sie niczym od starego dobrego C (czy C++). Czemu warto? Poniewaz poczatkowy programista nie musi myslec o zarzadzaniem pamiecia, nie musi uczyc sie wskaznikow ani za duzo operacji na strumieniach.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.10.2005 o 08:28, Latoch napisał:

No to ja jeszcze od siebie dodam, ze programowania fajnie uczyc sie teraz na obiektowych jezykach takich jak Java albo C#.
Latwo mozna opanowac podstawowa skladnie ktora wlasciwie nie rozni sie niczym od starego dobrego C (czy C++). Czemu warto?
Poniewaz poczatkowy programista nie musi myslec o zarzadzaniem pamiecia, nie musi uczyc sie wskaznikow ani za duzo operacji
na strumieniach.


Co polecasz do kompilacji c#? Pierwsze o tym sysze :) ale warto spróbować. Do taj pory do obiektowego cpp używałem tylko borland buildiera.
BTW: Początkujący programista raczej zarządzanie pamięcią może sobie odpuścić przy robieniu programików obliczających pole koła :>

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.10.2005 o 08:32, Don Lizak napisał:

> No to ja jeszcze od siebie dodam, ze programowania fajnie uczyc sie teraz na obiektowych jezykach takich jak Java albo
C#.
> Latwo mozna opanowac podstawowa skladnie ktora wlasciwie nie rozni sie niczym od starego dobrego C (czy C++).
Czemu warto?
> Poniewaz poczatkowy programista nie musi myslec o zarzadzaniem pamiecia, nie musi uczyc sie wskaznikow
ani za duzo operacji
> na strumieniach.

Co polecasz do kompilacji c#? Pierwsze o tym sysze :) ale warto spróbować.
Do taj pory do obiektowego cpp używałem tylko borland buildiera.
BTW: Początkujący programista raczej zarządzanie pamięcią
może sobie odpuścić przy robieniu programików obliczających pole koła :>


Ja pisze w Visual Studio lecz to raczej droga zabawka jak na nauke. Mozesz wyprobowac darmowy <a href= http://www.icsharpcode.net/OpenSource/SD/Default.aspx>#develop</a>. Ma dosc spore mozliwosci i jet calkiem przyjazdny (GUI a''la Visual Studio) dla uzytkownika.

Jesli chodzi o VS to mozesz tez sprobowac zamowic wersje 2005 Beta 2 ze strony Microsoftu (oczywiscie nieodplatnie).

PS. Ciekawe czy to forum przepusci znacznik htmlowy:)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.10.2005 o 21:29, Radziula napisał:

Mam pytanie ile ma cie lat???Od ilu najlepiej jest zaczac C++.

Jak najwcześniej i najlepiej bez znajomości żadnego innego języka programowania. Jeszcze lepiej zacząć od najnowszej wersji Javy.

Dnia 16.10.2005 o 21:29, Radziula napisał:

Czy sadzicie ze jestem za mlody???

Nie. Ja nauczyłem się C dokładnie w tym samym wieku, a wczesną wersję C++ 3 lata później. Dzięki temu później nauczenie się prymitywniejszych (koncepcyjnie ) języków takich jak Pascal, Algol, Fortran , Forth, Ada itp. trwało zwykle około miesiąca.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.10.2005 o 12:49, NattaN napisał:

sprawa dość ciężka, gdyż ANSI C jest już językiem niemalże archaicznym.

Zdziwiłbyś się. ANSI C, to obecnie podstawa sterowania we wszystkich maszynach od pralki, aż po robota przemysłowego (w tym ostatnim przypadku coraz częściej wchodzi java i inne języki czysto obiektowe). Oprogramowanie promu kosmicznego napisane jest w C, a także oprogramowanie każdego głównego silnika rakietowego. Każdy nowy kompilator dowolnego języka zazwyczaj wewnętrznie kompiluje kod żródłowy do C bo z kolei kompilator C jest wyjątkowo prosty i niewielki (kilka KB w większości kodów maszynowych).

Dnia 16.10.2005 o 12:49, NattaN napisał:

;). Ale to Twoja prywatna sprawa, więc wisi mi to. Jedyne, co mogę Tobie doradzić, to fakt, że kody ASCII poprzedzamy znakiem #.

To nie Pascal.
Kody klawiszy (i to wcale nie ASCII) najłatwiej uzyskać z dokumentacji bios, albo po prostu samemu zrobić sobie mały programi zczytujący (i np. wyświetlający) kody wciśniętych klawiszy.
Jeżeli wciśnięta kombinacja klawiszy nie jest znakiem ASCII, to pierszy otrzymany kod jest zerem. Drugi odczyt podaje kod wciśniętej kombinacji klawisza.

Najłatwiej sprawdzić sobie kody programikiem takim jak poniższy:
#include <conio.h>
#define ESC 0x1b
void main(void)
{
int c;
puts("Klawisz ESC konczy program");
do
{
if((c = getch()) == ''\0'')
printf("Kod znaku: 0h, %02Xh\n", c = getch());
else
printf("Kod ASCII znaku: %02Xh\n", c);
}while(c != ESC);
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jakiej funkcji najlepiej użyć aby program wczytał z pliku txt dowolny tekst ze znakami w asci? Oraz jak zrobić aby on takie dane zabisał.

BTW: Próbował ktoś z Was kiedyś zrobić program wypisujący liczby pierwsze w cpp używając tylko dwuch zagnierzdżonych funkcji for? :>

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

To ja się pochwalę ,,chlubnym" osiągnięciem przeszłości, kiedy jeszcze dopiero zaczynałem naukę z Delphi (było to z osiem lat temu - jak ten czas szybko leci :)). Najpierw, gwoli ścisłości, wspomnę, że miałem wtedy jeszcze komputer z procesorem Pentium 166 MMX i 32 MB RAMu. Na zakładce (Form) umieściłem procentowy pasek postępu (Gauge). Chciałem, żeby powoli się zapełniał, gdyż właśnie to ciekawe zjawisko imponowało mi wtedy w moich pierwszych grach. :)
Tak więc zacząłem od napisania stu (!!!) stanów paska:
Gauge1.Progress:=1;
Gauge1.Progress:=2;
Gauge1.Progress:=3;
itd.
Cóż, kompilator/debugger (Delphi 4 Standart) żadnych błędw nie wyłapał, ale nie byłem zadowolony. Czemu? Bo procesor nie był zupełnym ,,trupem" i poradził sobie z tym wszystkim jednocześnie - i po uruchomieniu programu (gdyż całość wpisałem od razu do zdarzenia Form1.OnCreate) od razu pokazał mi pasek zapełniony w stu procentach. Zaradny programista w takich sytuacjach się nie poddaje, lecz szuka sposobu rozwiązania. Ja też nie chciałem wyjść na ciamajdę, więc błyskawicznie znalazłem sposób na załatwienie sprawy.
Wyrok zapadł: procesor trzeba obciążyć. Osiągnąłem to, kopiując każdą (!) z linii tysiąc (!!) razy - naprawdę ja to liczyłem (!!!). Straciłem na to ponad dwie godziny, ale postęp był widoczny. Oprócz stu proc. dało się przyłapać program na pokazywaniu jeszcze dwóch wcześniejszych stanów. To znaczy, że stosuję właściwą metodę tylko w zbyt mały stopniu.
Zatem po kolei każdy tysiać zacząłem zaznaczać i wklejać 80 (okrągłe 50 uznałem za liczbę zbyt małą) razy. Daje to 80 x 1000 x 100 = 800000 (słownie: osiemset tysięcy) linii w komendzie. Swoje dzieło zapisałem i uruchomiłem... no, prawie. Komputer się przy tym zawiesił (ciekawe, czemu? :)). Ponieważ w folderze z programem nadal znajdował się exec (liczący sobie 3 MB, co można porównać do typowego kodu ,,prostego", ,,szkolnego" programu - ok. 290 KB) więc uruchomiłem go. Komputer wyświetlił okno z paskiem, na pasku 3% i... Już tak został. Zawiesił się.
Porażka. Ograniczenia techniczne pokonały mnie. Poddałem się. Usunąłem ten program oraz wszystkie inne, które wtedy napisałem. To jeszcze nie jest najgorsze. Można by rzec, że ,,obraziłem się" na całe to ,,programowanie" i już do niego nie wracałem. Zrobiłem to dopiero w ostatnich dniach sierpnia tego roku. Zacząłem od nauki Pascala, teraz spokojnie oswajam się na nowo z Delphi.
Kontakty z programowaniem powinno się mieć od lat najmłodszych i nie poddawać się z powodu porażek, czego Wam i sobie życzę. :]

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.10.2005 o 16:22, Don Lizak napisał:

Jakiej funkcji najlepiej użyć aby program wczytał z pliku txt dowolny tekst ze znakami w asci? Oraz jak zrobić aby on takie
dane zabisał.

#include fstream
#include iostream
#include string
using namespace std;

int main()
{
ifstream wejscie ("wejscie.txt");
ofstream wyjscie ("wyjscie.txt");
string line;
while (getline(wejscie, line))
wyjscie<<line<<endl;
}
Ten program po prostu przepisuje dane z jednego pliku do drugiego. Ale można to również zapisać do zmiennej, wyświetlić na ekranie. Ważne jest strumien ifline i ofline.
Jeśli Ci chodziło o c++ rzecz jasna.

Dnia 17.10.2005 o 16:22, Don Lizak napisał:

BTW: Próbował ktoś z Was kiedyś zrobić program wypisujący liczby pierwsze w cpp używając tylko dwuch zagnierzdżonych
funkcji for? :>

Chyba tak. Wystarczy skorzystać z jakiejś zmiennej, która zmienia stan, jeśli liczba ma dzielniki (sprawdzamy, czy jest reszta - nie pamiętam tego słowa kluczowego w tej chwili, chyba MOD?). Albo jedziemy na koniec i sprawdzamy czy jest większa od 2, nic się nie dzieje, inaczej pisze lub jeśli bool za wcześnie osiągnie jedynkę breakujemy zanim dojdziemy do linijki cout.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować