Ĺadny brzuch
Witam wszystkich, jestem początkującym, jeżeli chodzi o język C i dlatego proste rzeczy dla większości z Was mi sprawiają trudności. Mam problem z poniższym zadaniem. Zalecenia, co do niego mam takie, że mają być dwie funkcje pierwsza wczytaj, do której zmienne mają być przekazywane przez wskaśniki, a do drugiej wylicz mają być przekazywane przez wartość.(i to maj być jedyne funkje) Następne zalecenie to takie, żeby nie używać zmiennych globalnych. A oto zadanie:
Napisz program, który pozwala wprowadzać liczby z klawiatury do momentu gdy:
- suma tych liczb przekroczy 100,
- ilość podanych liczb ujemnych przekroczy 10,
- dwie kolejne podane liczby będ miały identyczą wartość
No i zadanie ma być w C(C nie C++).
Jeżeli ktoś z was może mi pomóc byłbym bardzo, bardzo wdzięczny.
Z góry dziękuję ;)
Biiigg Thx :]]
#include<iostream.h>
int main()
{
int a=0,b,suma=0,ujemne=0;
do
{
cout<<"Podaj liczbe do wpisania "<<endl;
b=a;
cin>>a;
suma=suma+a;
if (a<0) ujemne++;
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Juz chyba bardziej elegancko się nie da. Jakbyś miał do tego jakieś pytania to wal śmiało.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Ja mam pytanko do tego progrosa. Ja ucze sie programowac w C++ ale ten program w C++ chyba wyglada tak samo. Skompilowalem go i mam dwa pytanka.
(a != B) to odpowiada za to zeby program zamkna sie jak ta sama liczba zostanie wpisana dwa razy. Niewiem dlaczego tak jest przeciez != oznacza zeby rózny od czyli jak mam np
while(litera != 'K') to oznacza zeby wykonywac pętle dopuki litera jest rózna od K . to dlaczego tu program sie zamyka jak jest wpisana dwa razy taka sama liczba? Preagram nie pwoinein sie zamykac przy wpisaniu pierwszej bylejakiej cyfry przeciez w kodzie jest a = b czyli a zawsze bedzie równe b. I drugi e pytako co oznacza if(a<0) ujemna++ ?? Mysle ze oznacza to jesli a będzie mniejsze od 0 to ujemna=ujemna+1 po co to jest ?
MAM NADZIEJE ZE NIE NAKRĘCIŁEM ZAMOCNO:D DZIENKI ZA PODPOWIDZ
Jeśli myślisz ze Ąwiat jest mały, kup sobie większe okulary.
Dzięki bardzo za pomoc, musiałem trochę przerobić to co mi dałeś ale... niedziała mi tnz. to co Ty napisałeś działa bez zarzutu tylko to co ja zrobiłem mi szfankuje, zerknij na to ja mozesz i powiedz gdzie mam błąd:
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;
}
void main()
{
clrscr();
int a,b,suma,ujemne;
do
{
wczytaj(&a);
oblicz(a);
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Biiigg Thx :]]
"(a != B) to odpowiada za to zeby program zamkna sie jak ta sama liczba zostanie wpisana dwa razy. Niewiem dlaczego tak jest przeciez != oznacza zeby rózny od czyli jak mam np "
- pętla while wznawia program dopóki są spełnione jej warunki, czyli jeśli liczby są różne program leci od nowa.
"I drugi e pytako co oznacza if(a<0) ujemna++ ??"
- jeśli wartość zmiennej "a" jest mniejsza od zera zwiększ wartość zmiennej "ujemna" o 1 (inkrementacja), później w pętli while sprawdzamy czy zmienna "ujemna" ma wartość mniejszą lub równą 10.
"Preagram nie pwoinein sie zamykac przy wpisaniu pierwszej bylejakiej cyfry przeciez w kodzie jest a = b czyli a zawsze bedzie równe b."
- zwróć uwagę na kolejność operacji. Na początku zmiennej "a" przypisujemy w sekcji z deklaracjami wartość 0, później zaczynamy pętlę ("do..."). Zmiennej "b" przypisujemy wartość zmiennej "b" czyli zero i dopiero wtedy zczytujemy liczbę z klawiatury i później to porównujemy. I wtym momencie programik moim zdaniem ma małą wadę: jeśli pierwszą podaną liczbą będzie 0 to nam się wyłączy, a przecież jest to pierwsza wprowadzona liczba, a nie druga. Można by przy pomocy pętli "FOR" wyłączyć sprawdzanie za pierwszym obejściem warunku "(a!=B)". Po zastanowienu pętla IF będzie lepsza chyba.
Ale wpadłem jeszcze na taki pomysł:
#include<iostream.h>
int main()
{
int a=0,b,suma=0,ujemne=0,i=0;
do
{
cout<<"Podaj liczbe do wpisania "<<endl;
b=a;
i++;
cin>>a;
suma=suma+a;
if (a<0) ujemne++;
}
while((suma<=100) && ((a!=B) || (i!=1)) && (ujemne<=10));
Perpetum
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;}
Ten fragment jest chyba lewy, tak mi się wydaje.
return b,suma,ujemne; - chcesz wartości trzech zmiennych zwrócić z funkcji a tymczasem:
int oblicz(int a) - to pozwoli chyba na zwrócenie tylko jednej zmiennej.
Lepsze byłoby:
int oblicz(int a,b,suma,ujemne)
jeśli zadziała to jeszcze proponuję wartości zmiennych deklarować na początku programu a nie na początku funkcji, bo za każdym razem jak wywołasz funkcję zmienne ustawiają się na zero "int b,suma=0,ujemne=0;"
Jak coś nawaliłem to sorry, ale z Delphi walczę.
Perpetum
Dzięki ale prosił bym was, żebyście sprawdzali błędy w tym co mi udało się zmontować bo mam zalecenie zeby nie operować na strumieniach. :/
Biiigg Thx :]]
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;
}
void main()
{
clrscr();
int a,b,suma,ujemne;
do
{
wczytaj(&a);
oblicz(a);
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Koledzy powyżej wyjaśnili conieco, więc jakbyś miał dodatkowe pytania to pisz. Co do twojego programu, to troche nie trzyma się on kupy.
1)W tym miejscy drógi raz deklarujesz w funkcji zmienne, które są juz zadeklarowane w głównym ciele. Mało tego, przy każdym wywołaniu funkcji oblicz od nowa są deklarowane zmienne, co powoduje ich wyzerowanie.
2) Zmienne zadeklarowane w funkcji nie mają prawa jej opuścić, tzn. cokolwiek w nie wstawisz, i jakichkolwiek operacji arytmetycznych byś na nich nie wykonał, to i tak nie będzie to widoczne poza tą funkcją (byłyby potrzebne referencje, ale...).
3)Tutaj pętla nie bardzo ma co sprawdzać, bo w głównej funkcji main tylko zadeklarowałeś owe zmienne. Tak jak napisałem powyżej, główna funkcja main nie widzi tego co się dzieje z jej zmiennymi wewnątrz swoich funkcji.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Zmieniłem trochę programik, juz w funkcji oblicz sprawdza czy spełnione są te wrunki i zwraca odpowiednia wartosc(przynajmniej tak powinien robic), ale gdy podaje mu liczbe odrazu wychodzi :// C trzeba w nim zmienić???
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma,ujemne,typ;
b=a;
suma=suma+a;
if (a<0) ujemne++;
if ((suma<=100) && (a!=B) && (ujemne<=10)) typ=1;
else typ=0;
return typ;
}
void main()
{
clrscr();
int a,typ;
do
{
wczytaj(&a);
typ=oblicz(a);
}
while(typ==1);
}
Biiigg Thx :]]
Już lepiej, ale masz tam błąd (ale odkrycie co;)). W funkcji oblicz masz:
int b,suma,ujemne,typ;
b=a;
suma=suma+a;
if (a<0) ujemne++;
if ((suma<=100) && (a!=B) && (ujemne<=10)) typ=1;
else typ=0;
Nie dajesz tutaj najmniejszej szansy temu aby b było różne od a, więc od razu wyskakuje typ=0, i pętla się zamyka.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Hehe błąd jest i to jeszcze pewnie nie jeden, bo jak wymazałem to wszystko związane z b, to po skompilowaniu jak podaje jakąs liczbe to i tak wychodzi odrazu:// Cięzko cięzko :(
Biiigg Thx :]]
Zamień
int b,suma,ujemne,typ;
na
int b,suma=0,ujemne=0,typ;
Może pomoże;).
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Napisz program, który pozwala wprowadzać liczby z klawiatury do momentu gdy:
- suma tych liczb przekroczy 100,
- ilość podanych liczb ujemnych przekroczy 10,
- dwie kolejne podane liczby będ miały identyczą wartość
No i zadanie ma być w C(C nie C++).
Jeżeli ktoś z was może mi pomóc byłbym bardzo, bardzo wdzięczny.
Z góry dziękuję ;)
Biiigg Thx :]]
#include<iostream.h>
int main()
{
int a=0,b,suma=0,ujemne=0;
do
{
cout<<"Podaj liczbe do wpisania "<<endl;
b=a;
cin>>a;
suma=suma+a;
if (a<0) ujemne++;
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Juz chyba bardziej elegancko się nie da. Jakbyś miał do tego jakieś pytania to wal śmiało.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Ja mam pytanko do tego progrosa. Ja ucze sie programowac w C++ ale ten program w C++ chyba wyglada tak samo. Skompilowalem go i mam dwa pytanka.
(a != B) to odpowiada za to zeby program zamkna sie jak ta sama liczba zostanie wpisana dwa razy. Niewiem dlaczego tak jest przeciez != oznacza zeby rózny od czyli jak mam np
while(litera != 'K') to oznacza zeby wykonywac pętle dopuki litera jest rózna od K . to dlaczego tu program sie zamyka jak jest wpisana dwa razy taka sama liczba? Preagram nie pwoinein sie zamykac przy wpisaniu pierwszej bylejakiej cyfry przeciez w kodzie jest a = b czyli a zawsze bedzie równe b. I drugi e pytako co oznacza if(a<0) ujemna++ ?? Mysle ze oznacza to jesli a będzie mniejsze od 0 to ujemna=ujemna+1 po co to jest ?
MAM NADZIEJE ZE NIE NAKRĘCIŁEM ZAMOCNO:D DZIENKI ZA PODPOWIDZ
Jeśli myślisz ze Ąwiat jest mały, kup sobie większe okulary.
Dzięki bardzo za pomoc, musiałem trochę przerobić to co mi dałeś ale... niedziała mi tnz. to co Ty napisałeś działa bez zarzutu tylko to co ja zrobiłem mi szfankuje, zerknij na to ja mozesz i powiedz gdzie mam błąd:
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;
}
void main()
{
clrscr();
int a,b,suma,ujemne;
do
{
wczytaj(&a);
oblicz(a);
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Biiigg Thx :]]
"(a != B) to odpowiada za to zeby program zamkna sie jak ta sama liczba zostanie wpisana dwa razy. Niewiem dlaczego tak jest przeciez != oznacza zeby rózny od czyli jak mam np "
- pętla while wznawia program dopóki są spełnione jej warunki, czyli jeśli liczby są różne program leci od nowa.
"I drugi e pytako co oznacza if(a<0) ujemna++ ??"
- jeśli wartość zmiennej "a" jest mniejsza od zera zwiększ wartość zmiennej "ujemna" o 1 (inkrementacja), później w pętli while sprawdzamy czy zmienna "ujemna" ma wartość mniejszą lub równą 10.
"Preagram nie pwoinein sie zamykac przy wpisaniu pierwszej bylejakiej cyfry przeciez w kodzie jest a = b czyli a zawsze bedzie równe b."
- zwróć uwagę na kolejność operacji. Na początku zmiennej "a" przypisujemy w sekcji z deklaracjami wartość 0, później zaczynamy pętlę ("do..."). Zmiennej "b" przypisujemy wartość zmiennej "b" czyli zero i dopiero wtedy zczytujemy liczbę z klawiatury i później to porównujemy. I wtym momencie programik moim zdaniem ma małą wadę: jeśli pierwszą podaną liczbą będzie 0 to nam się wyłączy, a przecież jest to pierwsza wprowadzona liczba, a nie druga. Można by przy pomocy pętli "FOR" wyłączyć sprawdzanie za pierwszym obejściem warunku "(a!=B)". Po zastanowienu pętla IF będzie lepsza chyba.
Ale wpadłem jeszcze na taki pomysł:
#include<iostream.h>
int main()
{
int a=0,b,suma=0,ujemne=0,i=0;
do
{
cout<<"Podaj liczbe do wpisania "<<endl;
b=a;
i++;
cin>>a;
suma=suma+a;
if (a<0) ujemne++;
}
while((suma<=100) && ((a!=B) || (i!=1)) && (ujemne<=10));
Perpetum
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;}
Ten fragment jest chyba lewy, tak mi się wydaje.
return b,suma,ujemne; - chcesz wartości trzech zmiennych zwrócić z funkcji a tymczasem:
int oblicz(int a) - to pozwoli chyba na zwrócenie tylko jednej zmiennej.
Lepsze byłoby:
int oblicz(int a,b,suma,ujemne)
jeśli zadziała to jeszcze proponuję wartości zmiennych deklarować na początku programu a nie na początku funkcji, bo za każdym razem jak wywołasz funkcję zmienne ustawiają się na zero "int b,suma=0,ujemne=0;"
Jak coś nawaliłem to sorry, ale z Delphi walczę.
Perpetum
Dzięki ale prosił bym was, żebyście sprawdzali błędy w tym co mi udało się zmontować bo mam zalecenie zeby nie operować na strumieniach. :/
Biiigg Thx :]]
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma=0,ujemne=0;
b=a;
suma=suma+a;
if (a<0) ujemne++;
return b,suma,ujemne;
}
void main()
{
clrscr();
int a,b,suma,ujemne;
do
{
wczytaj(&a);
oblicz(a);
}
while((suma<=100) && (a!=B) && (ujemne<=10));
}
Koledzy powyżej wyjaśnili conieco, więc jakbyś miał dodatkowe pytania to pisz. Co do twojego programu, to troche nie trzyma się on kupy.
1)W tym miejscy drógi raz deklarujesz w funkcji zmienne, które są juz zadeklarowane w głównym ciele. Mało tego, przy każdym wywołaniu funkcji oblicz od nowa są deklarowane zmienne, co powoduje ich wyzerowanie.
2) Zmienne zadeklarowane w funkcji nie mają prawa jej opuścić, tzn. cokolwiek w nie wstawisz, i jakichkolwiek operacji arytmetycznych byś na nich nie wykonał, to i tak nie będzie to widoczne poza tą funkcją (byłyby potrzebne referencje, ale...).
3)Tutaj pętla nie bardzo ma co sprawdzać, bo w głównej funkcji main tylko zadeklarowałeś owe zmienne. Tak jak napisałem powyżej, główna funkcja main nie widzi tego co się dzieje z jej zmiennymi wewnątrz swoich funkcji.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Zmieniłem trochę programik, juz w funkcji oblicz sprawdza czy spełnione są te wrunki i zwraca odpowiednia wartosc(przynajmniej tak powinien robic), ale gdy podaje mu liczbe odrazu wychodzi :// C trzeba w nim zmienić???
#include<stdio.h>
#include<conio.h>
void wczytaj(int *a)
{
printf("Podaj liczbe n");
scanf("%d",a);
}
int oblicz(int a)
{
int b,suma,ujemne,typ;
b=a;
suma=suma+a;
if (a<0) ujemne++;
if ((suma<=100) && (a!=B) && (ujemne<=10)) typ=1;
else typ=0;
return typ;
}
void main()
{
clrscr();
int a,typ;
do
{
wczytaj(&a);
typ=oblicz(a);
}
while(typ==1);
}
Biiigg Thx :]]
Już lepiej, ale masz tam błąd (ale odkrycie co;)). W funkcji oblicz masz:
int b,suma,ujemne,typ;
b=a;
suma=suma+a;
if (a<0) ujemne++;
if ((suma<=100) && (a!=B) && (ujemne<=10)) typ=1;
else typ=0;
Nie dajesz tutaj najmniejszej szansy temu aby b było różne od a, więc od razu wyskakuje typ=0, i pętla się zamyka.
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---
Hehe błąd jest i to jeszcze pewnie nie jeden, bo jak wymazałem to wszystko związane z b, to po skompilowaniu jak podaje jakąs liczbe to i tak wychodzi odrazu:// Cięzko cięzko :(
Biiigg Thx :]]
Zamień
int b,suma,ujemne,typ;
na
int b,suma=0,ujemne=0,typ;
Może pomoże;).
---Aby zło zwyciężyło, wystarczy żeby dobro nie robiło nic---