Pomoc dla początkującego

0

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

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
  1. Zmienna n nie jest u Ciebie zainicjalizowana, więc może w niej być potencjalnie wszystko.
  2. Tablice muszą mieć rozmiar znany w czasie kompilacji, u Ciebie n jest nieokreślone, więc i a[n] nie jest poprawnie zadane.
  3. 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

1 użytkowników online, w tym zalogowanych: 0, gości: 1