Cześć :)
Jestem początkującym programistą (pierwszy rok studiów) i powiem szczerze - trochę się gubię. Mam napisać program, który oblicza za pomocą pętli „do”, 30 początkowych wyrazów ciągu zadanego wzorem rekurencyjnym a(n)=a(1)+a(2)+...+a(n-1), gdzie a(1)=1. Napisałam program w C, ale on nie działa. Ponieważ najwydajniej uczę się, porównując programy mam prośbę - czy mógłby mi ktoś pomóc z tym zadaniem? Albo chociaż linijkę kodu jak obliczyć sumę? (w tym miejscu kompilator wyrzuca błąd) Próbowałam z tablicami, ale coś nie pykło.
0
0
Wystarczy wypisać ręcznie parę wartości, a wszystko staje się oczywiste
i | a[i] |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 4 |
5 | 8 |
6 | 16 |
1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, suma=0, a[n];
do
{
a[1]=1;
suma=a[n-1]+a[n];
}
while (n>=1 && n<=30)
printf("suma wynosi %d", suma);
return 0;
}
1
Przede wszystkim - na razie zapomnij o tablicach. Nie są Ci jeszcze do niczego potrzebne.
Podpowiedzi:
// Ważne, prawie zawsze chcesz żeby Twoje zmienne miały zdefiniowaną wartość początkową
int suma = 0;
// Zwiększasz sumę o 5
suma += 5;
// Można też zapisać tak
suma = suma + 5;
// Jeśli potrafisz napisać pętlę, to możesz zrobić coś takiego
do {
// ...
suma += ... ;
} while (...);
2
- Zmienna
n
nie jest u Ciebie zainicjalizowana, więc może w niej być potencjalnie wszystko. - Tablice muszą mieć rozmiar znany w czasie kompilacji, u Ciebie
n
jest nieokreślone, więc ia[n]
nie jest poprawnie zadane. - Nigdzie nie zmieniasz wartości
n
, zatem Twoja pętla albo nie wykona się ani razu, albo będzie nieskończona.
1
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;//<---------------- TUTAJ TRZEBA COŚ WPISAĆ
int suma = 0;
int a[30];
//Pierwszy element tablicy to a[0]
//Wiemy, że pierwszy element tablicy to 1, więc przypisujemy
a[0] = 1;
//specjalnie usunąłem pętlę
//w pętli zmienna ma być >=1 i <30
//specjalnie nie napisałem jaka zmienna
printf("suma wynosi %d", suma);
return 0;
}
@Samhain Trochę Ci podpowiadamy. Nie chcemy dawać gotowca, bo lepiej będzie jak zrozumiesz i na zaliczeniu odpowiesz bez ściągania. Sprawdź co masz do zmiany i napisz jakie masz pomysły.
1
Nie potrzebujesz tu tablicy:
#include <stdio.h>
int main()
{
int i=0;
do {} while((++i<=30)&&(printf("a[%d]=%d\n",i,i>1?1<<(i-2):1)));
return 0;
}
Lub ewentualnie:
#include <stdio.h>
int main()
{
int i=0,s=1;
do {} while((++i<=30)&&(printf("a[%d]=%d\n",i,s+=(i>2?s:0))));
return 0;
}
EDIT specjalnie dla @Althorion, mega trudny dowód, którego licealista nie umie przeprowadzić:
a(n)=a(1)+a(2)+...+a(n-1) // z treści zadania
a(n+1)=a(1)+a(2)+...+a(n-1)+a(n)
a(n+1)={a(1)+a(2)+...+a(n-1)}+a(n) // w klamrowych to a(n) z treści zadania
a(n+1)=a(n)+a(n)
a(n)=a(n-1)+a(n-1) // wykorzystano w drugim przykładzie
a(n)=2*a(n-1)
a(n)=2*2*a(n-2)
a(n)=2*2*2*2* .... a(1) // czyli potęga dwójki, wykorzystano w pierwszym przykładzie