matematykaszkolna.pl
C Godzio: Trivial mógłbyś mi dawać zadania takie podobne do tych z list, które wykorzystają funkcję które są potrzebne w poszczególnych zadaniach, jak czytam taki kurs z C to próbuję napisać i nie wiem czemu nie działa ... Chyba najlepiej się nauczę pisząc od podstaw proste programy, a później łącząc je w duże dzieła
31 paź 20:24
Trivial: Napisz funkcję, która obliczy wartość ciągu:
 1 1 1 
1 +

+

+ ... +

 2 3 n 
dla zadanego n.
31 paź 21:14
Godzio: Zabieram się już
31 paź 21:32
Godzio: Myślę myślę i nie moge wpaść na to co robię źle #include <stdio.h> #include <stdlib.h> int main () { int i,n; double suma=0; printf("Podaj n \n"); scanf("%d",&n); for(i=0;i<=n;i++) \\\ to rozumiem tak: dla i = 0 rób tak długo jak i ≤ n i cały czas zwiększaj suma = suma + 1/n ; dla n = 1 suma = 0 + 1/1 = 1 , dla n = 2 czynność powtarzamy 2 razy suma = 0 + 1/1 = 1, suma = 1 + 1/2 = 1,5 itd. printf("Suma to %lf",suma); system ("PAUSE"); return 0; } Dlaczego nie działą?
31 paź 22:03
Trivial: Może dzielisz przez 0 np.
31 paź 22:06
Trivial: dla i=0 mamy: suma = suma + 1/0 = ...
31 paź 22:06
Godzio: I tak nie działa coś
31 paź 22:08
Godzio: Jak zacznę od i = 1
31 paź 22:08
Trivial: nie zrzutowałeś n na typ double.
31 paź 22:13
Godzio: A po Polsku
31 paź 22:14
Trivial: i masz n zamiast i. emotka
31 paź 22:15
Trivial: po polsku to popraw w pętli na: suma = suma + 1/(double)i
31 paź 22:15
Godzio: Jestem geniuszem działa !
31 paź 22:17
Trivial: Brawo. Teraz napisz funkcję, która to zrobi, a nie wszystko w mainie. emotka
31 paź 22:18
Godzio: Tego już nie zrobię nigdy nie wiem o co chodzi że najpierw się coś pisze, a dopiero później main ...
31 paź 22:26
Trivial: Nie ma że nie zrobisz. To podstawy są. Składnia definicji funkcji jest taka: zwracanyTyp nazwaFunkcji(typArg1 Arg1, typArg2 Arg2, ...) { /* tutaj piszemy co robi funkcja */ return ...; /* ma być wyrażenie typu zwracanyTyp */ } Jeżeli chcemy napisać funkcję, która nic nie zwraca robimy to tak: void nazwaFunkcji(typArg1 Arg1, typArg2 Arg2, ...) { /* tutaj piszemy co robi funkcja */ /* brak słowa return */ }
31 paź 22:30
Trivial: i jak idzie?
31 paź 22:44
Godzio: #include <stdio.h> #include <stdlib.h> double sumowanie(double suma, double i, int n){ scanf("%d",&n); for(i=1;i<=n;i++) suma = suma + 1/i; return suma; } int main () { system ("PAUSE"); return 0; } Coś w tym stylu ?
31 paź 22:45
Trivial: Prawie dobrze. Funkcja do wyznaczenia wartości ciągu potrzebuje znać tylko n, czyli. A potem podobnie jak miałeś w mainie. Nie wczytujemy n. double sumowanie(int n) { int i; double suma=0; for (i=1; i<=n; i++) suma = suma + 1/(double)i; return suma; } teraz aby policzyć wartość tego ciągu np. dla n=9 wystarczy w mainie napisać: int main(void) { double wynik = sumowanie(9); printf("wynik = %lf", wynik); return 0; }
31 paź 22:49
Trivial: czyli na jej liście argumentów powinno być tylko n.*
31 paź 22:49
Godzio: Zanotuje sobie to
31 paź 22:51
Godzio: A można od razu zadeklarować double i,suma = 0; ?
31 paź 22:55
Trivial: i jest typu int. emotka
31 paź 22:56
Trivial: To co napisałeś to jest równoważność czegoś takiego: double i; double suma = 0; i nie ma wartości.
31 paź 22:57
Godzio: To w takim razie czemu piszemy: 1/(double)i
31 paź 22:57
Trivial: Zapis (typ) przed zmienną oznacza rzutowanie danej zmiennej na typ w nawiasie. Wiąże się to z pewnymi konsekwencjami przechowywania liczb i innej arytmetyki dla liczb całkowitych, a innej dla liczb zmiennoprzecinkowych.
31 paź 23:00
Godzio: Ok, rozumiem, to co następne jakieś zadanko czy kończymy ?
31 paź 23:01
Trivial: Czyli zapis: suma = suma + 1/(double)i przekształci nam zmienną i w typ zmiennoprzecinkowy przed wykonaniem operacji dzielenia. Oryginalna zmienna i nie jest modyfikowana.
31 paź 23:02
Trivial: Mam zadanko. emotka
31 paź 23:02
Trivial:
 1 
Napisz funkcję o nazwie 'odwrotnosc', która dla danego rzeczywistego x zwróci

.
 x 
Jeśli x=0 to funkcja ma zwrócić 0. Nie interesuje mnie cały program, tylko sama funkcja. emotka
31 paź 23:03
Godzio: ale np. 4 => 0,25 czy ma zapisać ułamek ?
31 paź 23:04
Trivial: 0.25
31 paź 23:05
Trivial: i nie ma nic pisać, tylko zwracać wartość. emotka
31 paź 23:05
Godzio: Jasne, jasne postaram się
31 paź 23:07
Godzio: float odwrotnosc(float x){ if(x==0) return 0; if(x!=0) return 1/x;
31 paź 23:10
Trivial: Dobrze. Kolejne zadanko: Napisz funkcję, która dla danej liczby double x zwróci x2.
31 paź 23:11
Godzio: double kwadra(double x) { return x * x; } To chyba za proste ?
31 paź 23:15
Trivial: Zaraz się przyda. emotka
31 paź 23:15
Trivial: Kolejne: double x Napisz funkcję, która obliczy i zwróci wartość xn dla pewnego naturalnego n.
31 paź 23:16
Godzio: Hmm tutaj coś z pętlą będzie prawda ?
31 paź 23:22
Trivial: Tak. Skorzystaj z definicji potęgi. xn = x*x*x*...*x.
31 paź 23:23
Trivial: Może jeszcze dla ułatwienia podam: xn = 1*x*x*x*...*x.
31 paź 23:27
Godzio: double kwadrat(double x){ return x * x; } double potega(int n) { int i; double x; for (i=1;i<=n;++i) x = x * kwadrat(x); return x; } Coś takiego wymyśliłem
31 paź 23:34
Godzio: i = 0
31 paź 23:34
Trivial: To niestety nie zadziała.
31 paź 23:35
Godzio: i x = x * kwadrat(n)
31 paź 23:36
Godzio: Aha ... hmmm
31 paź 23:36
Trivial: Dlaczego? Żeby policzyć xn musimy znać: x oraz n. Czyli: double potega(double x, int n) { ... } potem w pętli for nawet nie masz niczego zależnego od i, także również nie bardzo. przykładowe rozwiązanie to: double potega(double x, int n) { int i; double wynik = 1; for (i=0; i<n; i++) wynik *= x; return wynik; }
31 paź 23:37
Godzio: A jest funkcja która po prostu potęguje ? coś w stylu ax tak jak jest na forum ?
31 paź 23:38
Trivial: wynik *= x; oznacza pomnóż wynik przez x i zapisz do wynik, czyli to samo co: wynik = wynik * x;
31 paź 23:38
Trivial: jest. #include <math.h> double pow(double a, double x); ← tak wygląda.
31 paź 23:39
Trivial: czyli mogłeś dać od razu return pow(x,n); Ale to byłoby bez sensu, no nie?emotka
31 paź 23:40
Trivial: Dam ci jeszcze jedno zadanko na koniec. Jest trochę trudniejsze, ale powinieneś sobie dać radę. emotka
31 paź 23:42
Trivial: Algorytm szybkiego potęgowania: Korzystając z zależności
 x dla n=1 
xn = (xn/2)2 dla n parzystego
 ((x(n−1)/2)2*x dla n nieparzystego 
napisz funkcję rekurencyjną, która szybko obliczy n−tą potęgę liczby x. Wykorzystaj napisaną wcześniej funkcję kwadrat(x). Nie przejmuj się sytuacją n=0.
31 paź 23:43
Godzio: Może tak: double kwadrat(double x) { return x * x; } double potega(double x, int n){ int i; double wynik = 1; if ( n = 1) return x; if (n%2==0) { for (i=0;i<n/2;i++) wynik *= kwadrat(x); return wynik } if (n%2!=0) { for (i=0;i<(n−1)/2;i++) wynik *=kwadrat(x); return wynik*x; } }
31 paź 23:57
Trivial: Komplikujesz. To nie aż tak trudne. emotka No i miało być rekurencyjnie. Podpowiem wzór: double potega(double x, int n) { if (n==1) return x; if (n%2==0) return kwadrat(...); else return kwadrat(...)*x; }
1 lis 00:01
Godzio: return kwadrat(2*n); .. return kwadrat(2*n − 1); Tak ?
1 lis 00:09
Godzio: return (2*n − 1) * x ; oczywiście
1 lis 00:11
Trivial: A gdzie tutaj rekurencja? return kwadrat( power(x, n/2) ); ... return kwadrat( power(x, (n−1)/2) )*x; Czy to nie logiczne? emotka
1 lis 00:13
Godzio: Ehhh, to trzeba było z jakiegoś powera skorzystać
1 lis 00:13
Trivial: aa nie. Miało być potega zamiast power. emotka Zapomniałem jak funkcję nazwałeś.
1 lis 00:14
Trivial: czyli: return kwadrat( potega(x, n/2) ); ... return kwadrat( potega(x, (n−1)/2) )*x;
1 lis 00:15
Godzio: Jeszcze sporo nauki przede mną, ale cieszę się że coś rozumiem
1 lis 00:16
Trivial: Nie tak znowu sporo. Jak już opanujesz funkcje to chyba tylko wskaźniki zostały z trudniejszych rzeczy. emotka
1 lis 00:19
Godzio: Dobra w takim razie na dzisiaj koniec, wrócimy do tego jeszcze w środę, piątek i sobotę, jeśli będziesz na forum i będziesz miał ochotę , a tymczasem idę porobić zadania z matmy, bo trochę tego jest ...
1 lis 00:23
Godzio: Także, dzięki i dobranoc emotka
1 lis 00:23
Trivial: noc. emotka
1 lis 00:24