Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dnia 14.10.2013 o 21:22, Piotrbov napisał:

Dokładnie w której linijce ci wywala i to piszesz ogólnie w asemblerze, czy już pod jakiś
mikroprocesor, lub mikrokontroler? Jeśli tak to na jaki?


Już wiem co się stało, do R0 wpisałem 1 czyli moja pętla obróci się tylko raz :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam napisać program, który poda NWW dwóch liczb naturalnych.

#include<iostream>
using namespace std;
main()
{
int x,y,z=0;
cout<<"Podaj pierwsza liczbe naturalna: ";
cin>>x;
if (x<0) cout<<"To nie jest liczba naturalna!";
cout<<"Podaj druga liczbe naturalna: ";
cin>>y;
if (y<0) cout<<"To nie jest liczba naturalna!";
if (x>y)
{
if (x%y==0) cout<<"Najmniejsza wspolna wielokrotnosc podanych liczb wynosi "<<x;
else
{
do
{
z=x+x;
}
while(z%y==0);
cout<<"Najmniejsza wspolna wielokrotnosc podanych liczb wynosi "<<z;

}

Mam problem z pogrubionym fragmentem. Załóżmy, że wybrałem liczby 130 i 11. 130 nie dzieli się przez 11 bez reszty, więc pętla powinna pod zmienną z podstawić 260. 260 także nie dzieli się przez 11, więc pętla powinna wykonywać działania dalej, tymczasem program wypisuje mi, że NWW podanych liczb wynosi 260. Gdzie mam błąd?

Tak, wiem, że program obliczający NWW można napisać w zaledwie kilku prostych linijkach ;-)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Masz zły warunek w pętli, powinno być while(z%y!=0) (w końcu ma się wykonywać aż znajdzie liczby podzielne przez siebie). Poza tym w pętli chyba powinno być z+=x bo aktualnie program będzie się zawieszał (pod z podstawiasz x+x, a x się nie zmienia).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.10.2013 o 01:03, Hoplita napisał:

Masz zły warunek w pętli, powinno być while(z%y!=0)


Myślałem o tym, ale nie wiem, czemu ostatecznie nie wypróbowałem tej opcji ;-)

Dnia 15.10.2013 o 01:03, Hoplita napisał:

Poza tym w pętli chyba powinno być z+=x


Masz rację ;-) Dziękuję bardzo za podpowiedzi.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

mam taki problem iż nie moge wykonać takiego programu
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int a;
printf("podaj liczbe a:");
scanf("%d",a);
long double y=(1/(a*=a+=1/(a*=a+=1/(a*=a+=1))));
printf("y= %d \n",y);
system("Pause");
return 0;
}
prosiłbym o pomoc w wyjaśnieniu dlaczego nie chce się wykonać

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.10.2013 o 18:59, Daronn_Darker napisał:

Moze mi ktoś wytłumaczyć o co chodzi z strukturami? Mamy coś takiego:

struct zm
{
coś tam
}ZMI;

Czy zm trzeba wpisywać? Jeśli nie wpisze jakie będą konsekwencje, a jakie jeśli wpiszę?

Jak nie wpiszesz zm, to wtedy wymienione między } a ; będą jedynymi egzemplarzami tej struktury (nie będzie można stworzyć następnych). W tym przypadku ZMI będzie jedyną.

w przypadku gdybyś wpisał, wtedy w dowolnym miejscu program przez zm [nazwa zmiennej] będziesz mógł tworzyć kolejne "egzemplarze" tej struktury.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dregorio dzięki za pomoc teraz działa ale jeszcze jedno pytanie jak zrobić żeby podawało wynik inny od 0 bo w tym momencie czego by nie podstawił za a wychodzi y=0

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.10.2013 o 18:59, Daronn_Darker napisał:

Moze mi ktoś wytłumaczyć o co chodzi z strukturami? Mamy coś takiego:

struct zm
{
coś tam
}ZMI;

Czy zm trzeba wpisywać? Jeśli nie wpisze jakie będą konsekwencje, a jakie jeśli wpiszę?


Pytasz o "zm" czy o "ZMI"? To pierwsze to nazwa struktury. Struktura to niemal to samo co klasa z tym, że w klasie wszystkie elementy (metody, pola) bez podanego identyfikatora dostępu (public, private) są domyślnie prywatne a w strukturze są domyślnie publiczne.

Zatem napisanie:
struct zm
{
int yolo;
zm(int i) { yolo = i;}
};

to coś jak zdefiniowanie nowej klasy. Teraz możesz w kodzie pisać:
zm mzm = new zm(5);
i to będzie działać (zauważ, że nie podałem identyfikatora dostępu dla konstruktora).

Natomiast to drugie ZMI to od razu utworzenie obiektu typu zm. Czyli zapis:
struct zm
{
int yolo;
zm(int i) { yolo = i;}
}ZMI;

jest równoznaczny z zapisem:
struct zm
{
int yolo;
zm(int i) { yolo = i;}
};
zm ZMI;

W obu przypadkach dostajemy obiekt o nazwie ZMI typu zm.

Możliwe jest także ominięcie nazwy struktury, czyli w tym przypadku "zm", i zapis tylko ZMI, tj.:
struct
{
int yolo;
zm(int i) { yolo = i;}
}ZMI;

To ma jakąś mądrą nazwę, ale sprowadza się do tego, że masz tylko jeden obiekt tej struktury. Może to być na przykład struktura odpowiadająca za implementację wzorca singleton albo na przykład będąca handlerem do bazy danych. Bo skoro typ nie ma nazwy to nie można stworzyć innego obiektu tego typu (poza tym, który już jest, czyli ZMI).

Mam nadzieję, że tego dotyczyło pytanie :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.10.2013 o 18:41, Matti299 napisał:

mam taki problem iż nie moge wykonać takiego programu
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int a;
printf("podaj liczbe a:");
scanf("%d",&a);
long double y=(1/(a*=a+=1/(a*=a+=1/(a*=a+=1))));
printf("y= %d \n",y);
system("Pause");
return 0;
}

jak sprawić żeby podawało aktualny wynik a nie 0

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.10.2013 o 21:06, Nufiko napisał:

> jak sprawić żeby podawało aktualny wynik a nie 0

Musisz użyć odpowiedniego wyszczególniacza co chcesz uzyskać w printfie - %d daje wynik
w liczbach całkowitych, uzyj np %e lub %f, zresztą o więcej poczytaj tu: http://www.cplusplus.com/reference/cstdio/printf/

wszystko fajnie tylko mi nie liczy wyrażenia coś jest w nim nie tak?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.10.2013 o 22:08, Matti299 napisał:

wszystko fajnie tylko mi nie liczy wyrażenia coś jest w nim nie tak?


Wyrażenie jest obliczane, tylko ponieważ a jest typu int to i wynik dzielenia będzie zaokrąglany do liczb całkowitych. Możesz albo przed każdym użyciem a zmieniać ją na liczbę zmiennoprzecinkową poprzez zapis (float)a lub float(a), lub ustawić jej początkowy typ na float/double.
Poza tym po co w wyrażeniu tyle operatorów przypisania (+=, *= itp)? Zaciemniają tylko wyrażenie arytmetyczne a zmiennej a i tak nigdzie potem nie wykorzystujesz, zresztą i tak ciężko by było określić jaką ma ona wartość.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 20.10.2013 o 11:24, Matti299 napisał:

ale nawet bez operatorów przypisania tylko jako wyrażenia arytmetyczne nie liczy poprawnie
bo dla a=1 pokazuje 1 i tak dla każdego innego a


Bo musisz zmienić typ a na float i będzie git. czytaj posty w całości a nie po kawałku :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 20.10.2013 o 12:56, Matti299 napisał:

zmieniłem typ a na float i wcale nie zmieniło się nic dalej tylko 1 jest jako wynik dla
każdego a


dla takiego kodu działa:
int main(int argc, char *argv[])
{
float a;
printf("podaj liczbe a:");
scanf("%d",&a);
long double y=(1/(a*=a+=1/(a*=a+=1/(a*=a+=1))));
printf("y= %e \n",y);
system("Pause");
return 0;
}

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ć