Potęgowanie - pętla

0

Cześć,
Mam problem z wykonaniem zadania z języka C. O to jego treść: Napisz program, który pobiera górną oraz dolną granicę pewnego przedziału liczbowego. Następnie oblicza sumę wszystkich kwadratów liczb całkowitych z tego przedziału, począwszy od kwadratu najmniejszej, a skończywszy na kwadracie największej z nich. Program powinien ponownie pytać o granice przedziału i wyświetlać wynik, dopóki podane zakresy przedziału nie bedą równe albo górny zakres bedzie mniejszy od dolnego.

Na razie skupiam się na takim czymś, że pobiera tylko raz dwie liczby od użytkownika i sumuje ich kwadraty (i nie stosuje na razie warunków), ale niestety suma mi nie działa i nie mam kompletnie pojęcia gdzie robię błąd.

int main()
{
 int liczba_gorna, liczba_dolna,i,j;
 int suma=0;
 int wynik=1;
 printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
 scanf("%d%d", &liczba_gorna, &liczba_dolna);

    for(i=liczba_gorna;i<=liczba_dolna;i++)
 {
    for(j=1; j<=2; j++)
    wynik=wynik*i;

    suma=suma+wynik;
 }

    printf("Suma kwadratow od %d do %d wynosi %d\n",liczba_gorna*liczba_gorna, liczba_dolna*liczba_dolna, suma);

 return 0;
}


0

Namieszałeś w pętlach. Załóżmy, że mamy taki przedział <4, 7>. Musisz policzyć: 4x4 + 5x5 + 6x6 + 7x7. Pętla więc zacznie iterować od i=4 i zakończy na i=7. W każdym jej biegu zwiększasz sumę o i^2. Pseudokod:

od i=4 do i=7
suma += i*i
0
Pyxis napisał(a):

Namieszałeś w pętlach. Załóżmy, że mamy taki przedział <4, 7>. Musisz policzyć: 4x4 + 5x5 + 6x6 + 7x7. Pętla więc zacznie iterować od i=4 i zakończy na i=7. W każdym jej biegu zwiększasz sumę o i^2. Pseudokod:

od i=4 do i=7
suma += i*i

Czyli takie coś będzie?

for(i=liczba_gorna;i<=liczba_dolna;i++)
 {
    for(j=1; j<=2; j++)
    wynik=wynik*i;

    suma=suma+(i*i);
 }
0
Zwierz napisał(a):

Czyli takie coś będzie?

Ile razy wykona się pierwsza pętla, jeśli liczba_gorna=7 i liczba_dolna=4?

0
Pyxis napisał(a):
Zwierz napisał(a):

Czyli takie coś będzie?

Ile razy wykona się pierwsza pętla, jeśli liczba_gorna=7 i liczba_dolna=4?

Myślę, że się nie wykona.
Poza tym usunąłem wewnętrzną pętlę, bo była niepotrzebna.

0

Ponadto tutaj jest przykład niekonsekwencji i błędnego nazewnictwa zmiennych:

printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
scanf("%d%d", &liczba_gorna, &liczba_dolna);

Jeśli usunąłeś wewnętrzną pętlę, to zmień jeszcze sumowanie na:

suma += i*i;

Teraz powinno być dobrze.

0
Pyxis napisał(a):

Ponadto tutaj jest przykład niekonsekwencji i błędnego nazewnictwa zmiennych:

printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
scanf("%d%d", &liczba_gorna, &liczba_dolna);

Jeśli usunąłeś wewnętrzną pętlę, to zmień jeszcze sumowanie na:

suma += i*i;

Teraz powinno być dobrze.

Ok.
suma=suma+(ii) nie może być?
A dałoby się to dwiema pętlami zrobić? bez użycia i
i?

0

Może być i tak, myślałem że znasz oba przypadki. Co do dwóch pętli, to nie wiem co chciałbyś osiągnąć. Na pewno skomplikujesz tylko rozwiązanie.

0
Pyxis napisał(a):

Może być i tak, myślałem że znasz oba przypadki. Co do dwóch pętli, to nie wiem co chciałbyś osiągnąć. Na pewno skomplikujesz tylko rozwiązanie.

Znam oba przypadki, ale jakoś wygodniej mi stosować tą mniej profesjonalną. Ok, rozumiem. A wiesz może czy w instrukcji warunkowej if, może być pętla?

0

W bloku może być pętla. W warunku nie może.

if (warunek) {
    // blok
    // mozna dac petle
}
0

Jeśli chodzi o całe zadanie to mam taką propozycję jego zrobienia (niestety nie działa mi), nie mam pojęcia czy różnego rodzaju pętlę mogą się ze sobą łączyć, ale nie mogłem na nic innego wpaść. Jak mogę w takim razie zrobić aby po wpisaniu tych liczb pętla się nie kończyła tylko prosiła o wpisanie kolejnej?

int main()
{
 int liczba_gorna, liczba_dolna,i,j;
 int suma=0;
 int wynik=1;
 printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
 scanf("%d%d", &liczba_dolna, &liczba_gorna);


while(scanf("%d%d", &liczba_dolna, &liczba_gorna)==1)
{
    printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");*/

if(liczba_gorna>liczba_dolna)
{
for(i=liczba_dolna;i<=liczba_gorna;i++)
 {
suma=suma+(i*i);
 }
printf("Suma kwadratow od %d do %d wynosi %d\n",liczba_dolna*liczba_dolna, liczba_gorna*liczba_gorna, suma);
}
}



return 0;
}


0
Zwierz napisał(a):

Jeśli chodzi o całe zadanie to mam taką propozycję jego zrobienia (niestety nie działa mi), nie mam pojęcia czy różnego rodzaju pętlę mogą się ze sobą łączyć, ale nie mogłem na nic innego wpaść. Jak mogę w takim razie zrobić aby po wpisaniu tych liczb pętla się nie kończyła tylko prosiła o wpisanie kolejnej?

int main()
{
 int liczba_gorna, liczba_dolna,i,j;
 int suma=0;
 int wynik=1;
 printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
 scanf("%d%d", &liczba_dolna, &liczba_gorna);


while(scanf("%d%d", &liczba_dolna, &liczba_gorna)==1)
{
    printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");*/

if(liczba_gorna>liczba_dolna)
{
for(i=liczba_dolna;i<=liczba_gorna;i++)
 {
suma=suma+(i*i);
 }
printf("Suma kwadratow od %d do %d wynosi %d\n",liczba_dolna*liczba_dolna, liczba_gorna*liczba_gorna, suma);
}
}



return 0;
}


while(scanf("%d%d", &liczba_dolna, &liczba_gorna)==1)
{
    printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
0
Zwierz napisał(a):
Zwierz napisał(a):

Jeśli chodzi o całe zadanie to mam taką propozycję jego zrobienia (niestety nie działa mi), nie mam pojęcia czy różnego rodzaju pętlę mogą się ze sobą łączyć, ale nie mogłem na nic innego wpaść. Jak mogę w takim razie zrobić aby po wpisaniu tych liczb pętla się nie kończyła tylko prosiła o wpisanie kolejnej?

int main()
{
 int liczba_gorna, liczba_dolna,i,j;
 int suma=0;
 int wynik=1;
 printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");
 scanf("%d%d", &liczba_dolna, &liczba_gorna);


while(scanf("%d%d", &liczba_dolna, &liczba_gorna)==1)
{
    printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");*/

if(liczba_gorna>liczba_dolna)
{
for(i=liczba_dolna;i<=liczba_gorna;i++)
 {
suma=suma+(i*i);
 }
printf("Suma kwadratow od %d do %d wynosi %d\n",liczba_dolna*liczba_dolna, liczba_gorna*liczba_gorna, suma);
}
}



return 0;
}


while(scanf("%d%d", &liczba_dolna, &liczba_gorna)==1)
{
    printf("Podaj dolna i gorna granice przedzialu liczb calkowitych: ");

w C używamy operatora '+=' w takich obliczeniach.

i = i+7;

to jest pascal, albo i gorzej... atari basic z lat 80-tych.

0
int square_sum (int n) {
    return ((n+1)*(2*n+1)*n)/6;
}

printf("%d", square_sum(liczba_gorna) - square_sum(liczba_dolna - 1));
0

Brawo enedil!
Podaj jeszcze wzór na sumę dowolnych potęg całkowitych, np.: p=5: s = 1^5 + 2^5 + 3^5 + ... n^5 = ?

i z wyprowadzeniem, oczywiście: int x^n = ...

0

Miałem tylko nadzieję że wyprowadzisz te wzory... tak aby dzieci mogły zrozumieć.

Np. tak: bierzemy całkę, a potem wyznaczamy te stałe...

a i nawet prościej - z równań rekurencyjnych:

s(n) = s(n-1) + n^p -> ...
w analogii do liczb Fibonacciego, itp.

0

a jako ekstra (na 6) proponuję wyliczyć sumę typu, np:
s(n) = 1^3.5 + 2^3.5 + 3^3.5 + ... n^3.5;

i co na to pan Faulhaber powie? :)

0

W ogóle możecie powiedzieć mi gdzie mam błąd w pętli i czy w ogóle pętla w pętli może być???

0

zrób tak:

double s = 0;
for(int i = minn; i <= maxn; i++) s += i*i;

print s;

tak wygląda rozwiązanie twojego wielkiego problemu... trzy linie.

0

Od tak nie zrobię...
Dopiero się uczę, a Ty mi wyjeżdżasz z rzeczami o których nie wiem :/

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