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.
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.
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.
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.
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.
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ść.
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.
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:
x
n = 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?
31 paź 23:40
Trivial:
Dam ci jeszcze jedno zadanko na koniec. Jest trochę trudniejsze, ale powinieneś sobie dać radę.
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.

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?
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.

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.
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
1 lis 00:23
Trivial: noc.
1 lis 00:24