Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Od wczoraj zacząłem bawić się w C++. Korzystam z Dev-C++ (mam płytkę z tym z 2005 roku :D). Napisałem pętle for, aby obliczała mi sumę n kolejnych liczb, ale chcem aby podawała mi też średnią sumy tych liczb (znaczy się dodatkowo ma podzielić tą sumę przez n (liczbę podaną na początku przez użytkownika). Kod mam taki (na samą sumę):

float s = 0;
int i;

for (cin >> i; i > 0; i--) {
s += i;
}
cout << "Wynik wynosi: " << s << endl;

W tym kodzie mi liczy tylko sumę. A nie wiem jak dopisać cuś, żeby policzyło mi średnią. Próbowałem np. tak:

float s = 0;
int i;
int x = i;
for (cin >> i; i > 0; i--) {
s += i;
}
cout << "N = " << x << endl; //// Napisałem to, aby pokazywało mi ile wynosi x
cout << "Wynik wynosi: " << s / x << endl;

Dodawałem drugą trzecią zmienną (pewnie w złym miejscu, bo użytkownik dopiero później podaje ''i'').
BTW Jak zapisać stałą liczbę? Z książeczki (z 2005r. xD) pisze o stałych i zmiennych. Stała - const; zmienna - int. Ale podali na stałą tylko przykład "const string..." i to był tekst. Wydaje mi się, że trzeba napisać: "const int -liczba-"?
A i jeszcze jedno, z tego wszystkiego co próbowałem na średnią (wszystkie próby całkiem podobne do tej), to właśnie ten x wynosił 46. Mam nadzieję, że mój tekst jest do zrozumienia ^^.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

zrób tak:
float s = 0;
int i;
int x;
cin>>x;
for ( i=x; i > 0; i--) {
s += i;
}
cout << "N = " << x << endl; //// Napisałem to, aby pokazywało mi ile wynosi x
cout << "Wynik wynosi: " << s / x << endl;


ja ogólnie uważam, że jeśli podajesz jakąś zmienną z klawiatury to lepiej podpiąć ją osobno a dopiero potem używać jej w pętli. Tak poza tym to pętla powinna posiadać własną zmienną żeby przypadkiem nie zmieniła wartości innej, którą założyłeś że nie zmieni.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.10.2007 o 13:19, Wasizi napisał:

for (cin >> i; i > 0; i--) {
s += i;
}

W tej pętli dodaj jeszcze jedną instrukcję: x++;. Oczywiście nie zapomnij jej zainicjować wartością 0.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.10.2007 o 16:11, Treant napisał:

W tej pętli dodaj jeszcze jedną instrukcję: x++;. Oczywiście nie zapomnij jej zainicjować
wartością 0.


IMO lepiej zrobić przypisanie niż w każdej pętli obciżać procesor kolejną instrukcją inkrementacji, można też zrobić coś takiego:
cin >> x;
for(i=0;i<=x; i++)
(...)
a potem dzielić przez i

Wasizi
Tak spojrzałem w twój kod i najłatwiej średnią będzie podać przez podzielenie wprowadzonej liczby na 2

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.10.2007 o 16:24, Nufiko napisał:

Wasizi
Tak spojrzałem w twój kod i najłatwiej średnią będzie podać przez podzielenie wprowadzonej
liczby na 2


Na dwa? To wyjdzie mi połowa. Suma kolejnych liczb n, jeśli podstawimy 5 to będzie wynosić 15. A dzielone przez 2 da mi 7,5; a odpowiedzią będzie 3...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mhmh... Ty mi mówisz co ja chcę?

"Dopóki"? To taka komenda jest C++? A od kiedy, jeśli można wiedzieć, w C++ pisze się po polsku?
BTW Napisałeś to tak po polsku, że mi po dni nauki C++ ciężko to zrozumieć...

A i zadam jeszcze pytanie ogólnie (do każdego?)
Jak napisać (nie musi być dokładnie, ale jakie komendy) program aby losował liczbę? Na przykład (ale to już będzie chyba bardziej zaawansowane) komputer losuje liczbę, a my musimy ją zgadnąć.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.10.2007 o 19:12, Wasizi napisał:

Na dwa? To wyjdzie mi połowa. Suma kolejnych liczb n, jeśli podstawimy 5 to będzie wynosić
15. A dzielone przez 2 da mi 7,5; a odpowiedzią będzie 3...


Fakt zapomniałem że nie sumujesz 0 więc w twoim wypadku żeby uzyskać średnią to trzeba do wprowadzonej liczby (nie sumy tylko tej co podstawiasz za zmienną pętli) dodać 1 i wtedy podzielić na 2. Uzasadnienie: suma ostatniej i pierwszej liczby jest równa sumie przedostatniej i drugiej itd. Więc średnia każdej z tych sum jest taka sama i wynosi (max+1)/2 i jest jednocześnie średnią wszystkich liczb.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Poniżej jest programik sumujący n kolejnych liczb i podający wynik sumowania oraz średnią.
#include <iostream>
using namespace std;

int main()
{
int suma = 0, i;
float srednia = 0.0;

cin >> i;
for (int j = 0; j < i; j++)
suma += j;
srednia = (float)suma/i;

cout << "suma: " << suma << endl;
cout << "srednia: " << srednia << endl;
cout << "srednia: " << suma/i << endl;

system("pause");
return 0;
}

Tutaj zaś masz quiz, w którym trzeba zgadnąć liczbę z przedziału [0,9].
#include <iostream>
using namespace std;

int main()
{
int x, odp;
bool spr;

srand(time(0));
x = rand()%10;

while (!spr)
{
cout << "Zgadnij liczbe: ";
cin >> odp;

if (odp != x)
cout << "Zle! Sprobuj keszcze raz.\n\n";
else
spr = true;
}
cout << "Zgadles!" << endl;

system("pause");
return 0;
}

Jeśli coś będzie niejasne, to chętnie odpowiem na wszelkie pytania. :)
Oba programy pisałem pod Dev-C++ ver. 4.9.9.2.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.10.2007 o 20:05, Wasizi napisał:

Mhmh... Ty mi mówisz co ja chcę?

Napisałem Ci taki algorytm, jaki potrzebujesz by napisać swój program.

Dnia 21.10.2007 o 20:05, Wasizi napisał:

"Dopóki"? To taka komenda jest C++? A od kiedy, jeśli można wiedzieć, w C++ pisze się po polsku?
BTW Napisałeś to tak po polsku, że mi po dni nauki C++ ciężko to zrozumieć...

To sie nazywa pseudokod. Nie chciałem zabierać Ci przyjemności napisania programu samemu (ew. wersja 2: "nie będę za Ciebie pisał programów"). Są tam polecenia, które znajdziesz w swoim języku programowania i tylko one.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Chcę napisać program, który dla wczytanych liczb a i b wypisze cyfrę jedności liczby a^b. Kompilator komunikuje o błędzie w drugiej pętli for (nie wiem czemu) :/

#include<cstdio>
using namespace std;
int main()
{int d,a,b,c;
scanf("%d", &d);
for(d!=0;d--;)
{
scanf("%d %d", &a, &b);
a=a%10;
c=1;
for(b!=0;b%2==1;a=a*a;b=b/2)
{c=c*a;}

c=c%10;
printf("%d \n", c);
}
return 0;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Pętla for przyjmuje tylko 3 argumenty a ty zadałeś jej 4 i pewnie o tym informuje Cię kompilator. Poza tym ten twój kod jest trochę mocno skomplikowany jak na robienie a^b i w sumie to ja jak na niego patrzę to nie wiem co on robi

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 18:54, Bimbermistrz napisał:

Chcę napisać program, który dla wczytanych liczb a i b wypisze cyfrę jedności liczby a^b. Kompilator
komunikuje o błędzie w drugiej pętli for (nie wiem czemu) :/


Nufiko już Ci wyjaśnił co jest nie tak z pętlą for. Ja dodam jeszcze, że a^b można obliczyć znacznie prościej: http://www.cplusplus.com/reference/clibrary/cmath/pow.html

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziwnie wyglądają Twoje pętle tak na oko pomyliły Ci się pola.

Dnia 24.10.2007 o 18:54, Bimbermistrz napisał:

for(d!=0;d--;)

powinno być:
for (;d!=0;d--)

Dnia 24.10.2007 o 18:54, Bimbermistrz napisał:

for(b!=0;b%2==1;a=a*a;b=b/2)

powinno być:
for(;b!=0,b%2==1;a=a*a,b=b/2)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 19:40, logray napisał:

Dziwnie wyglądają Twoje pętle tak na oko pomyliły Ci się pola.
powinno być:
for (;d!=0;d--)
for(;b!=0,b%2==1;a=a*a,b=b/2)

Raczej nie, bo inne programy działają, mimo że nie stawiam średnika przed pierwszym argumentem (czyli pętla for działa w postaci np. "for (a<=0;a--)".

Klimos

Dnia 24.10.2007 o 19:40, logray napisał:

Nufiko już Ci wyjaśnił co jest nie tak z pętlą for. Ja dodam jeszcze, że a^b można obliczyć
znacznie prościej: http://www.cplusplus.com/reference/clibrary/cmath/pow.html

Wiem, ale mam za zadanie zrobić program bez innych bibliotek niż iostream i cstdio oraz ma być szybki dla bardzo dużych a i b.

Nufiko

Dnia 24.10.2007 o 19:40, logray napisał:

Poza tym ten twój kod jest trochę mocno skomplikowany jak na robienie a^b i w sumie to ja jak
na niego patrzę to nie wiem co on robi

To co napisałem - wypisuje ostatnią cyfrę a^b.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 20:03, Bimbermistrz napisał:

Nufiko
> Poza tym ten twój kod jest trochę mocno skomplikowany jak na robienie a^b i w sumie to
ja jak
> na niego patrzę to nie wiem co on robi
To co napisałem - wypisuje ostatnią cyfrę a^b.


Wiem co ma robić ale IMO prościej jest tak

int a,b,i,s;
s=1;
scanf("%d %d", a,b);
for(i=0;i<=b,i++)
s*=a;
printf("%d", s%10);

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 20:10, Nufiko napisał:

int a,b,i,s;
s=1;
scanf("%d %d", a,b);
for(i=0;i<=b,i++)
s*=a;
printf("%d", s%10);


Albo (i = 0) i (i < b), albo (i = 1) i (i <= b).

A jeśli ma wypisać cyfrę jedności, to printf("%d", s-(10*(s%10)));


@Bimbermistrz Przydałoby się wiedzieć jaki to błąd wypisuje Ci kompilator.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 20:24, Bimbermistrz napisał:

Tak jest prościej, ale dla dużych liczb (np. 999999999) program nie działa jak należy.


No to dam taki kod, który działa niezależnie od rozmiarów liczb (pod warunkiem że wprowadzane mieszczą się w zakresie inta):

nt a,b,i,s;
s=1;
scanf("%d %d", a,b);
for(i=0;i<=b,i++)
s=(s*a)%10;
printf("%d", s);

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.10.2007 o 20:03, Bimbermistrz napisał:

Raczej nie, bo inne programy działają, mimo że nie stawiam średnika przed pierwszym argumentem
(czyli pętla for działa w postaci np. "for (a<=0;a--)".

po pierwsze pętla z jednym średnikiem się nie skompiluje. zawsze muszą być dwa.
Po drugie na przykładzie pierwszej pętli:
for(d!=0;d--;)
Ten kod będzie się wykonywał dopóty dopóki d-- nie osiągnie 0. Jeśli tak miało być to nie wiem po co wstawiłeś d!=0. Równie dobrze mogłeś napisać: for(;d--;), bo ten warunek nie wpływa na działanie pętli. Dlatego założyłem, że się pomyliłeś.

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ć