Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 9 lut 2025, o 06:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
 Tytuł: Język C
PostNapisane: 13 mar 2013, o 14:11 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Ucze się języka C z ksiązki z Sthephena Praty. Oczywiście główny cel to AVR ale narazie poznaje C

Wykonuje zadania na końcu każdego z rozdziałów i mam teraz zagwozdkę. Zadanie polega na użyciu pętli while do przeliczania temperatur. Co do wzoru to banał chodzi mi o inną rzecz. Autor powiedziął że program ma prosić o podanie temperatury tyle razy dopóki nie pojawi się litera zamiast cyfry. Nietety nie wiem jak to rozwiązac przy pomocy petli while.

podstawowa działająca pętla wygląda tak



Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Problem w tym że nie wiem jak zrobić by pętla zakończyła działanie po podaniu litery. ( teraz jak podam literę to wyświetla całe kolumny tekstu i leci tak w nieskończonośc)


pozdrawiam
Piotrek

Kod wstawiamy przy pomocy [syntax=c] - Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 13 mar 2013, o 14:31 

Pomógł: 0

Doczytaj o opcji Break, dla pętli while.....



Ostatnio edytowano 13 mar 2013, o 14:36 przez rezasurmar, łącznie edytowano 1 raz

Góra
  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 13 mar 2013, o 14:52 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Dzięki. W tym rozdziale nie było o Break ani Do while, dlatego się zastanawiałem. Inne petle będa w nastepnym rozdziale, jak widze komenda break też. Pętle sa podzielone na 3 rozdziały, ja skończyłem 1 z nich i się zawiesiłem na ostatnim cwiczeniu. Nie było tez nic o przyjmowaniu tylko wybranych znaków także jeszcze nie wiem jak sie ustala aby przyjmowane były tylko liczby, dlatego miałem taką zagwozdkę. Pozatym własnie nie mam jeszcze break opanowanego. Jade zgodnie z książką.


Pozdrawiam
Piotrek

P.S.

Mam książke Mirka o C dla AVR ale niestety nie miałem pojecia o C i trochę to dla mnie za szybko było, gubiłem się. Stephen jednak znacznie wolniej jedzie z tematem. Daje radę mniej więcej ogarniać temat. Z tym że zostało mi jeszcze jakieś 550 stron do końca. W tym tempie, na które moge sobie pozwolić do wakacji może skończe. potem wezme się za AVR



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 13 mar 2013, o 17:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 gru 2012
Posty: 161
Pomógł: 9

Proszę bardzo, z komentarzami :)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak są pytania pytaj :)
BEZ BREAK :)

co do tego poniżej.. scanf wywala 1 jeśli poda mu się zły argument, trzeba "tylko" umieć ten błąd (tą 1) odczytać.

Oczywiście można bez zmiennej i to zrobić :)


Autor postu otrzymał pochwałę

_________________
sig off ;(



Ostatnio edytowano 13 mar 2013, o 17:49 przez Domanoid, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 13 mar 2013, o 17:47 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Nie wiem jak bardzo chcesz zeby ci pomoc, wiec narazie podpowiedz.
Scanf ze standardowego wejscia (stdin) odczyta tylko znaki ktore odpowiadaja formatowi jaki mu podasz. I tu jest problem.
Teraz twoj program dziala tak:

[poczatek]
- monit o podanie liczby
- proba odczytu liczb w formacie float z bufora
petla nieskonczona()
- wyliczenie i przedstawienie wyniku
- monit o podanie liczby
- proba odczytu liczby w formacie float z bufora
koniec dzialan w petli, powroc do pierwszego dzialania w petli
- oczekiwanie na znak
- zakonczenie programu

Na konsoli bedzie nastepujacy efekt po uruchomieniu programu i caly czas podawaniu mu poprawnego formatu liczby:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I tak az do przerwania programu albo pomylki i podania nieliczby.
Jesli podamy nie liczbe, scanf nie odczyta jej z bufora i bedzie w tym buforze siedziec i kazda kolejna proba znalezienia tam liczby bedzie nieudana.

Tak przynajmniej zachowuje sie to u mnie, inny kompilator moze inaczej obslugiwac scanf i nawet przy podaniu prawidlowej liczby (prawidlowej tzn zgodnej z zadanym formatem) moze wariowac poniewaz znak konca linia bedzie mu wisial caly czas w buforze.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 14 mar 2013, o 16:01 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Dziekuje bardzo za pomoc.

Tutaj miałem inny problem bo np petla if jest w rozdziale 7 czyli mam jeszcze 45 stron do przebrnięcia tak samo jak do break.

W rozdziale 6 jest jest to co napisał Domanoid - użycie wyniku z scanf. Już sobie poradziłem tak:

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Problem w tym że informacja na temat mozliwości zastosowania while (zmienne == 1) pokawiła się później, w następnym rozdziale a ja lece po kolei

Dzieki za pomoc

Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 24 mar 2013, o 02:06 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Mojej walki ciąg dalszy

mam następujące zadanie : Napisz program, który tworzy tablice n elementów , zapisuje w niej n małych liter i wyświetla jej zawartość.


napisałem kod
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Problem w tym że po kompilacji program wyskakuje ale po wpisaniu 1 literki mam taki error w Visual Studio. Jak daje identyczny schemat tyle że nie używam tablicy char a int/double to wszystko jest ok

Prosiłbym o pomoc co robie nie tak


Pozdrawiam
Piotrek


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 24 mar 2013, o 14:50 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8605
Pomógł: 337

Funkcje odczytują dane zgodnie z podanym formatem opisanym niżej. Funkcje scanf i vscanf odczytują dane ze standardowego
wejścia (tj. stdin); fscanf i vfscanf ze strumienia podanego jako argument; a sscanf i vsscanf z podanego ciągu znaków.
Funkcje vscanf, vfscanf i vsscanf różnią się od odpowiadających im funkcjom scanf, fscanf i sscanf tym, że zamiast
zmiennej liczby argumentów przyjmują argument typu va_list.

Argumenty
format - format odczytu danych
stream - strumień wejściowy, z którego mają być odczytane dane
str - tablica znaków, z której mają być odczytane dane
ap - wskaźnik na pierwszy argument z listy zmiennej liczby argumentów


Format składa się ze zwykłych znaków (innych niż znak '%') oraz sekwencji sterujących, zaczynających się od symbolu procenta, po którym następuje:
opcjonalna gwiazdka,
opcjonalne maksymalna szerokość pola,
opcjonalne określenie rozmiaru argumentu,
określenie formatu.
Jeżeli po znaku procenta występuje od razu drugi procent to cała sekwencja traktowana jest jak zwykły znak procenta
(tzn. jest on wypisywany na wyjście).Wystąpienie w formacie białego znaku powoduje, że funkcje z rodziny scanf będą
odczytywać i odrzucać znaki, aż do napotkania pierwszego znaku nie będącego białym znakiem.
Wszystkie inne znaki (tj. nie białe znaki oraz nie sekwencje sterujące) muszą dokładnie pasować do danych wejściowych.
Wszystkie białe znaki z wejścia są ignorowane, chyba że sekwencja sterująca określa format [, c lub n.
Jeżeli w sekwencji sterującej występuje gwiazdka to dane z wejścia zostaną pobrane zgodnie z formatem,
ale wynik konwersji nie zostanie nigdzie zapisany. W ten sposób można pomijać część danych.
Maksymalna szerokość pola przyjmuje postać dodatniej liczby całkowitej zaczynającej się od cyfry różnej od zera.
Określa ona ile maksymalnie znaków dany format może odczytać. Jest to szczególnie przydatne przy odczytywaniu ciągu znaków,
gdyż dzięki temu można podać wielkość tablicy (minus jeden) i tym samym uniknąć błędów przepełnienia bufora.

Funkcje z rodziny scanf obsługują takie formaty
d, i odczytuje liczbę całkowitą, której format jest taki sam jak oczekiwany format przy wywołaniu funkcji strtol z argumentem base równym odpowiednio 10 dla d lub 0 dla i, argument powinien być wskaźnikiem na int;
o, u, x odczytuje liczbę całkowitą, której format jest taki sam jak oczekiwany format przy wywołaniu funkcji strtoul z argumentem base równym odpowiednio 8 dla o, 10 dla u lub 16 dla x, argument powinien być wskaźnikiem na unsigned int;
a, e, f, g odczytuje liczbę rzeczywistą, nieskończoność lub NaN, których format jest taki sam jak oczekiwany przy wywołaniu funkcji strtod, argument powinien być wskaźnikiem na float;
c odczytuje dokładnie tyle znaków ile określono w maksymalnym rozmiarze pola (domyślnie 1), argument powinien być wskaźnikiem na char;
s odczytuje sekwencje znaków nie będących białymi znakami, argument powinien być wskaźnikiem na char;
[ odczytuje niepusty ciąg znaków, z których każdy musi należeć do określonego zbioru, argument powinien być wskaźnikiem na char;
p odczytuje sekwencje znaków zależną od implementacji odpowiadającą ciągowi wypisywanemu przez funkcję printf, gdy podano sekwencję %p, argument powinien być typu wskaźnik na wskaźnik na void;
n nie odczytuje żadnych znaków, ale zamiast tego zapisuje do podanej zmiennej liczbę odczytanych do tej pory znaków, argument powinien być typu wskaźnik na int.
Słówko więcej o formacie [. Po otwierającym nawiasie następuje ciąg określający znaki jakie mogą występować w odczytanym napisie i kończy się on nawiasem zamykającym tj. ]. Znaki pomiędzy nawiasami (tzw. scanlist) określają możliwe znaki, chyba że pierwszym znakiem jest ^ - wówczas w odczytanym ciągu znaków mogą występować znaki nie występujące w scanlist. Jeżeli sekwencja zaczyna się od [] lub [^] to ten pierwszy nawias zamykający nie jest traktowany jako koniec sekwencji tylko jak zwykły znak. Jeżeli wewnątrz sekwencji występuje znak - (minus), który nie jest pierwszym lub drugim jeżeli pierwszym jest ^ ani ostatnim znakiem zachowanie jest zależne od implementacji.
Formaty A, E, F, G i X są również dopuszczalne i mają takie same działanie jak a, e, f, g i x.

Funkcja zwraca EOF jeżeli nastąpi koniec danych lub błąd odczytu zanim jakiekolwiek konwersje zostaną dokonane lub liczbę poprawnie wczytanych pól (która może być równa zero).
Przykładowo można zastosować wywołanie służące do pobrania tylko i wyłącznie znaków:
- (myślnik), ' (apostrof), (spacja) oraz małych i wielkich liter - co wygląda tak

scanf(" %[-' A-Za-z]s",&zmienna);

czy teraz jaśniej ??

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 24 mar 2013, o 22:09 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Dzięki za wskazówki. Rzeczywiście głupio pomyliłem się i nie dałem &tablica.
Dzięki SunRiver za obszerny wykład. Dużo z tych rzeczy jeszcze nie przerobiłem więc nie wszystko jest dla mnie jasne ale i tak dużo mi przybliżyłes problematykę.

Jeśli chodzi o program to:

Zdurniałem do reszty. Proszę spójrzcie na te 2 zrzuty ekranu. Nie rozumiem czemu ta sama funkcja pobiera cztery znaki typu int a tylko 2 typu char( już nawet nie pisałem całego programu, tylko ten początek. Żeby pobrać 4 typy char musiałem wstawić index < 8) . jestem w kropce :( Funkcji fflush nie było mi jeszcze dane poznać więc zapewne nie będzie ona potrzebna, myślę że autor chciał to inaczej napisać.
Właściwie głupia prośba, czy mógłby ktoś mi napisać ten programik co pobiera 4 znaki char i potem je wyświetla, bo walczę i walczę i nic. Nie chodzi mi o ogólne robienie gotowców bo to tylko ćwiczenie z książki ale chciałbym wiedzieć jak wygląda działający program tego typu, nie mam pojęcia co robię źle, przecież to jakiś banalny program, pisałem już trudniejsze cwiczenia :( :( :(

Aha i słyszałem że niby to IDE Visual Studio razem z kompilatorem jest słabe. Czy to prawda? Jest sens bawić się innym( mam Eclipse ale skonfigurowane wg Mirka pod AVR i nie chce go popsuć)


Pozdrawiam
Piotrek


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 25 mar 2013, o 14:37 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

A tak oprócz tych moich kłopotów mam takie pytanie. Ile wy opanowywaliście C żeby coś zrobić. No chodzi mi może o wyższy poziom niż migająca dioda. Np. na za rok by się przydało zrobić obrotomierz( właściwie zliczacz impulsów co będzie wyświetlał to na wyswietlaczu 7-segmentowym no i ewentualnie przeliczy je w czasie czyli będzie obrotomierzem, np na czujniku Halla. Czy powiedzmy jak bede ćwiczył godzzinę dziennie C, a narazie tak robie, godzina dzienne 5 dni na tydzień( narazie PC potem AVR) to czy w ciągu powiedzmy 6 miesięcy opanuje się wyswietlacze i takie projekty będzie można tworzyć bez większych kłopotów? czy to już wymaga bardziej zaawansowanej wiedzy?


Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 25 mar 2013, o 15:15 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Przede wszystkim musisz nauczyć się rozwiązywać problemy. Bo pisanie przy każdym problemie o pomoc wiele Cie nie nauczy, no może nauczy zadawać poprawnie pytania ;)

Powiem Ci co ja bym zrobił jakbym miał taki problem. Po pierwsze zastanowiłbym się jak działa funkcja która używam i która może być podejrzana o złe zachowanie - scanf. Spójrz do dokumentacji, poczytaj dokładnie o formacie %c itp.

Jeśli czytanie dokumentacji poszłoby nie tak, albo nie mógłbyś znaleźć o co chodzi, zastanów się jak możesz zweryfikować to co napisałeś, czyi jak wykonać testy. To bardzo ważna działka programowania, której mało kto uczy.

No więc skoro zapisało się coś do tablicy to należałoby ją wyświetlić. Stwórz nową pętle:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i popatrz co tam się dzieje.

Znam oczywiście powód dla którego się to dzieje, ale nie chcę Ci dawać gotowego rozwiązania. Liczę, że sam wpadniesz na to co jest problemem, a potem spróbujesz znaleźć rozwiązanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 25 mar 2013, o 22:13 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Zadziałało!

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Z tym że nie wiem dlaczego nie działa tak jak chce z scanf("%c , str[i]). teoretycznie typ c zawiera 1 bajt. powinno się zmieścić. Nie deklaruje łańcuchów ale tablice.
Właśnie jak piszę scanf("%s" , text[x]) to deklaruje łańcuch, a jak piszę scanf("%s" , &text[x]) to deklaruje tablicę tak? Tutaj pewien nie jestem.

Siedzę trochę nad tym, jedyne co wiem to że na zakończenie łańcucha dochodzi jeszcze 0 i to może powodować niezamierzone wyniki, ale ja deklaruje tablicę( tak mi się bynajmniej wydaje)


Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 25 mar 2013, o 22:44 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Dodales sobie "debugger" jak pisalem? Co ci wyswietlil? nie zastanowilo cie dlaczego po podaniu dwoch liter a i b masz:
tablica[1] = a
tablica[2] =

tablica[3] = b
tablica[4] =

Chodzi o to, ze typ c bedzie ci czytal zawsze jeden znak, dowolny. A jak dowalny, to koniec linii tez.
Czyli przy obracaniu petli masz: odczytanie a, odczytanie enter (w koncu go wcisnales, nie? :) ), odczytanie b, odczytanie enter.

Jak rozwiazac? Ograniczyc do odpowiednich znakow (malych liter), podpowiedz koncowka wypowiedzi Sun'a.
Samo ograniczenie to nie wszystko zapewne ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 25 mar 2013, o 22:56 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

A %s nie rozpoznaje znaków białych........ I wszystko jasne.

Ale szczerze. Nie wpadłbym na to. W książce nie było jeszcze ograniczeń zapodanych przez SunRiver'a dlatego poległem. Walczę z następnymi zadaniami, ale te obliczeniowe mi wychodzą. Jakoś matematyczne bardziej kumam. Te mi przeszły bez większych problemów Teraz głowie się nad zapisem tekstu w tablicy i wyświetleniem wspak, ma być pomocna funkcja strlen(). Zobaczymy, narazie walczę. Przyznam szczerze że fajne to jest ale nieraz zaskakuje, jednak trudne, ale postawiłem sobie cel i jakoś będę dążył.

Dzięki

Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Język C
PostNapisane: 26 mar 2013, o 08:38 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8605
Pomógł: 337

hehe .. pamiętaj leechu łatwo się tylko ze schodów spada :)
Ale ogarniesz ...

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO