Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

anonyus

[ANSI C] Proszę o wytłumaczenie działania tej pętli

Rekomendowane odpowiedzi

Witam otóż mam pętlę w ANSI C, której nie rozumiem do końca w związku z czym proszę wytłumaczenie jej działania.

 

#include<stdio.h>

int main(void)
int i= -1, j=3;
for(i++;i++;i++)
j++;
printf("%d", i+j);
return 0;
}

 

proszę o wytłumaczenie o co chodzi w tym for bo jego warunku kompletnie nie rozumiem :(

 

Pozdrawiam :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam otóż mam pętlę w ANSI C, której nie rozumiem do końca w związku z czym proszę wytłumaczenie jej działania.

 

#include<stdio.h>

int main(void)
int i= -1, j=3;
for(i++;i++;i++)
j++;
printf("%d", i+j);
return 0;
}

 

proszę o wytłumaczenie o co chodzi w tym for bo jego warunku kompletnie nie rozumiem :(

 

Pozdrawiam :)

 

:o:hmm::E

Weź ty ten przykład dobrze przepisz :E

 

Ja też tego nie rozumiem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

:o:hmm::E

Weź ty ten przykład dobrze przepisz :E

#include <stdio.h>

int main(void){
int i= -1, j=3;
for(i++;i++;i++)
       j++;
printf("%d", i+j);
return 0;
}

to jest tak jak było na kartce. Po kompilacji daje 4 ale skąd??

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#include <stdio.h>

int main(void){
int i= -1, j=3;
for(i++;i++;i++)
       j++;
printf("%d", i+j);
return 0;
}

to jest tak jak było na kartce. Po kompilacji daje 4 ale skąd??

 

Przez for, pierwszy argument oznacza stan początkowy, drugi warunek, a trzeci powtarzające się działanie dopóki spełniony jest warunek, ponadto j++; wykona się tyle samo razy dopóki będzie spełniony warunek. A później wyświetlasz rezultat.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przez for, pierwszy argument oznacza stan początkowy, drugi warunek, a trzeci powtarzające się działanie dopóki spełniony jest warunek, ponadto j++; wykona się tyle samo razy dopóki będzie spełniony warunek. A później wyświetlasz rezultat.

 

czyli jeśli dobrze rozumiem wejdzie raz pętle wtedy

i=0

oraz

j=4

i

printf("%d", i+j);

da wynik 4 tak???

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

czyli jeśli dobrze rozumiem wejdzie raz pętle wtedy

i=0

oraz

j=4

i

printf("%d", i+j);

da wynik 4 tak???

Wydaje mi się, że warunek powinien być interpretowany że jeżeli i != 0 to powinno się wykonywać cały czas. Idę debugger odpalić :E

 

Po ukończeniu "forka" i=1, j=3 z czego i na początku jest inicjalizowane wartośćią 0

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wydaje mi się, że warunek powinien być interpretowany że jeżeli i != 0 to powinno się wykonywać cały czas. Idę debugger odpalić :E

 

Po ukończeniu "forka" i=1, j=3 z czego i na początku jest inicjalizowane wartośćią 0

Ok dzięki za pomoc mam nadzieję, że tego jutro na egzaminie nie będzie trzeba użyć XD

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok dzięki za pomoc mam nadzieję, że tego jutro na egzaminie nie będzie trzeba użyć XD

Ja bym 2 z miejsca dostał za kolosa gdybym takiego potwora napisał :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja bym 2 z miejsca dostał za kolosa gdybym takiego potwora napisał :E

:D XD to było dziś jutro z ćwiczeń kolos :C

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie no raczej to tylko jako ciekawostka powinno istnieć, nie wyobrażam sobie odpytywania z czegoś takiego :E, a jak nie to zmień uczelnie :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie no raczej to tylko jako ciekawostka powinno istnieć, nie wyobrażam sobie odpytywania z czegoś takiego :E, a jak nie to zmień uczelnie :E

Powiedz to naszemu profesorowi bo to on skopiował z kursu robionego przez Cisco(w trakcie budowy dostępny nie oficjalnie) XD najciekawsze jest to, że każdy dał odp 6 lub 8 :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Powiedz to naszemu profesorowi bo to on skopiował z kursu robionego przez Cisco(w trakcie budowy dostępny nie oficjalnie) XD najciekawsze jest to, że każdy dał odp 6 lub 8 :P

No z tym, że takiego kodu to raczej w żadnym programie nie uświadczysz. A ten przykład raczej miał za zadanie pokazać jak dokładnie działa for i tyle, nie wierzę, że miało by to służyć czemukolwiek innemu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zdziwilibyście się co ludzie w shortcode'ach albo innych obfuscated code contest potrafią zrobić... :E

Nie no, w realnym kodzie produkcyjnym też takie potworki czasem można zobaczyć, szczególnie z ręki starych wyjadaczy dla których krótszy kod = lepszy kod.

 

 

A w samym kodzie nic trudnego nie ma - sprawdza tylko czy rozumiesz pętlę for, oraz czy wiesz na czym polega postinkrementacja.

Bo w warunku powtarzania pętli nie musi być jakiś operator logiczny! Może być cokolwiek, co się tylko daje sprowadzić do wartości logicznej (prawda/fałsz). Wartości liczbowe też się sprowadzają do logicznych - zero = fałsz, wszystko inne - prawda.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zdziwilibyście się co ludzie w shortcode'ach albo innych obfuscated code contest potrafią zrobić... :E

Nie no, w realnym kodzie produkcyjnym też takie potworki czasem można zobaczyć, szczególnie z ręki starych wyjadaczy dla których krótszy kod = lepszy kod.

 

 

A w samym kodzie nic trudnego nie ma - sprawdza tylko czy rozumiesz pętlę for, oraz czy wiesz na czym polega postinkrementacja.

Bo w warunku powtarzania pętli nie musi być jakiś operator logiczny! Może być cokolwiek, co się tylko daje sprowadzić do wartości logicznej (prawda/fałsz). Wartości liczbowe też się sprowadzają do logicznych - zero = fałsz, wszystko inne - prawda.

Ale kto normalny uczy kogoś przez przykład na zaciemnionym kodzie :E poważnie takie potworki istnieją?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale kto normalny uczy kogoś przez przykład na zaciemnionym kodzie :E

Akurat środowisko akademickie uwielbia niepraktycznie, trickowe i zaciemnione przykłady, byle tylko robić budyń z mózgu studentom ;)

Egzamin bez takich wstawek byłby przecież nudny...

 

Potem ci sami studenci po zajęciach "programowania", często w czymś co niby miało być c++, uważa ten język za przestarzały i niepraktyczny, bo masa zajęć polega na ręcznym pisaniu od zera rzeczy które już są. A gdy się zajęcia kończą, prowadzący już nie wspomina którego gotowego komponentu się używa, no bo po co :E

 

O, taki kod, w sumie prosty. Co to robi? :D

#include<stdio.h>
int main(void)
{
int x, y=0;
for(;scanf("%d",&x);y+=x);
printf("%d", y);
}

 

A na deser - klasyk short code'ów. Ogarnij co to robi bez odpalania ;)

main(x,y){for(;x++ for(y=2;x%y;)printf( ++y/x+"\0%d\n",x);}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Akurat środowisko akademickie uwielbia niepraktycznie, trickowe i zaciemnione przykłady, byle tylko robić budyń z mózgu studentom ;)

Egzamin bez takich wstawek byłby przecież nudny...

 

Potem ci sami studenci po zajęciach "programowania", często w czymś co niby miało być c++, uważa ten język za przestarzały i niepraktyczny, bo masa zajęć polega na ręcznym pisaniu od zera rzeczy które już są. A gdy się zajęcia kończą, prowadzący już nie wspomina którego gotowego komponentu się używa, no bo po co :E

 

O, taki kod, w sumie prosty. Co to robi? :D

#include<stdio.h>
int main(void)
{
int x, y=0;
for(;scanf("%d",&x);y+=x);
printf("%d", y);
}

 

A na deser - klasyk short code'ów. Ogarnij co to robi bez odpalania ;)

main(x,y){for(;x++ for(y=2;x%y;)printf( ++y/x+"\0%d\n",x);}

Nam jeszcze nic na zaciemnionym kodzie tłumaczyć nie próbowali :)

 

Pierwszy przykład ogarnąłem po przegrzebaniu dokumentacji scanfa, będziemy sumować wprowadzone l. całkowite dopóki użytkownik nie poda nic, to wtedy scanf zwróci 0. I wyświetlimy wynik.

 

Co do drugiego to "x" - to chyba będzie liczba argumentów przy odpaleniu programu a "y" i tak bd 2. Drugi for będzie się wykonywał do czasu kiedy reszta z dzielenia "x" przez "y" będzie równa 0. "y" zwiększy się przed wyświetleniem go użytkownikowi, "x" odwrotnie. Nie jestem pewien co ten plusik zrobi i czy po "\0" cokolwiek się wyświetli bo to bodajże znak końca ciągu, ale czy to tak działą :E , ten print zagmatwany jak chłolera :lol2:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dopóki użytkownik nie poda nic

Doczytaj jeszcze raz, bo uprościłeś to do rangi błędu ;)

 

 

Odpal to zobaczysz co robi tamten shortcode :)

Co do printfa - po prostu trzeba wiedzieć do czego się w kodzie sprowadza "napis". No właśnie, do czego? :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Doczytaj jeszcze raz, bo uprościłeś to do rangi błędu ;)

Dopóki nie poda czegoś różnego od liczby* bo właśnie testowałem :E

 

Drugiego nie rozgryzłem xd

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A więc jaka suma będzie jak user wpisze

12
1
100lec

? :E

 

 

Co wypisze

printf("cheeseburger"+6);

? :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wgryzałem się i nie łapię jak zinterpretować tego printfa. Strzelam, że coś związanego z liczbami pierwszymi lub względnie pierwszymi.

 

Przez for, pierwszy argument oznacza stan początkowy, drugi warunek, a trzeci powtarzające się działanie dopóki spełniony jest warunek, ponadto j++; wykona się tyle samo razy dopóki będzie spełniony warunek. A później wyświetlasz rezultat.

Nie do końca, to wyjaśnienie standardowego postępowania z instrukcją for.

for(instrukcje wykonywane raz na początku; warunek wejścia/kontynuacji pętli; instrukcje wykonywane na koniec pętli)

Przykład:

for(a;b;c) można rozwinąć do:

a;
while(b)
{
jakieś instrukcje w pętli;

c;
}

 

Ale kto normalny uczy kogoś przez przykład na zaciemnionym kodzie :E [n]poważnie takie potworki istnieją[/b]?

You don't know the power of the dark side :jedi:

 

Niestety bywają potworki może nie takie haki jak tutaj ale np. ściana deklaracji zmiennych o dziwnych nazwach, drabinki if-ów na tysiące linii i inne artefakty.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A więc jaka suma będzie jak user wpisze

12
1
100lec

? :E

 

 

Co wypisze

printf("cheeseburger"+6);

? :D

 

Co to się stanęło niby pobiera 100lec i stówe liczy a niby zwraca, że nie pobrał nic :kwasny:

Jakieś mało to scanf() precyzyjne.

 

Wiem, że ascii <0, 255> ale jak to się ma do ciągu znaków :hmm: i czemu usunęło 6 znaków :E

 

Wiem, że można taki zabieg wykonać printf("%c", 'A'+32) ale te cuda wyżej to magia :D

Może debuger powie mi coś więcej na temat ciągu znaków.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Użyłbyś debuggera a nie zgadywał :E

W jednym przejściu poprawnie odczytał i zapisał do zmiennej 100. scanf zwrócił 1.

W następnym próbował resztę napisu zinterpretować jako liczbę, i nie udało się. Zwrócił 0.

 

 

Nic nie usunęło... uczysz się C, powinieneś widzieć gdzie są wskaźniki!

	const char* napis = "cheeseburger";
napis+=6;
printf(napis);

Wystarczająco jasno? ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. poniższy kod zapisać do plik.c

 

2. skompilować komendą

 

gcc plik.c -o plik.out -lm

 

3. krzyknąć "jajebie" :E

 

kod:

            k;double sin()
        ,cos();main(){float A=
      0,B=0,i,j,z[1760];char b[
    1760];printf("\x1b[2J");for(;;
 ){memset(b,32,1760);memset(z,0,7040)
 ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
>i;i+=0.02){float c=sin(i),d=cos(j),e=
sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
h*e+f*g+5),l=cos      (i),m=cos(B),n=s\
in(B),t=c*h*g-f*        e;int x=40+30*D*
(l*h*m-t*n),y=            12+15*D*(l*h*n
+t*m),o=x+80*y,          N=8*((f*e-c*d*g
)*m-c*d*e-f*g-l        *d*n);if(22>y&&
y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
 printf("\x1b[H");for(k=0;1761>k;k++)
  putchar(k%80?b[k]:10);A+=0.04;B+=
    0.02;}}/*****####*******!!=;:~
      ~::==!!!**********!!!==::-
        .,~~;;;========;;;:~-.
            ..,--------,*/

 

p.s. na pewno działa pod linuxem

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Użyłbyś debuggera a nie zgadywał :E

W jednym przejściu poprawnie odczytał i zapisał do zmiennej 100. scanf zwrócił 1.

W następnym próbował resztę napisu zinterpretować jako liczbę, i nie udało się. Zwrócił 0.

 

 

Nic nie usunęło... uczysz się C, powinieneś widzieć gdzie są wskaźniki!

	const char* napis = "cheeseburger";
napis+=6;
printf(napis);

Wystarczająco jasno? ;)

Teraz pojaśniało :E

 

3. krzyknąć "jajebie" :E

Ja jebie, ktoś życia nie miał przez 3 tyg :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. poniższy kod zapisać do plik.c

 

2. skompilować komendą

 

gcc plik.c -o plik.out -lm

 

3. krzyknąć "jajebie" :E

 

kod:

            k;double sin()
        ,cos();main(){float A=
      0,B=0,i,j,z[1760];char b[
    1760];printf("\x1b[2J");for(;;
 ){memset(b,32,1760);memset(z,0,7040)
 ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
>i;i+=0.02){float c=sin(i),d=cos(j),e=
sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
h*e+f*g+5),l=cos      (i),m=cos(B),n=s\
in(B),t=c*h*g-f*        e;int x=40+30*D*
(l*h*m-t*n),y=            12+15*D*(l*h*n
+t*m),o=x+80*y,          N=8*((f*e-c*d*g
)*m-c*d*e-f*g-l        *d*n);if(22>y&&
y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
 printf("\x1b[H");for(k=0;1761>k;k++)
  putchar(k%80?b[k]:10);A+=0.04;B+=
    0.02;}}/*****####*******!!=;:~
      ~::==!!!**********!!!==::-
        .,~~;;;========;;;:~-.
            ..,--------,*/

 

p.s. na pewno działa pod linuxem

pod win 10 64 z Dev-C++ gcc4.9.2 jak i pod codeblocks z Cygwin GCC 5.4.0 nie działa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...