Wywołanie funkcji za pośrednictwem wskaźników

0

Napisz program, który będzie liczył sumę ciągu arytmetycznego i geometrycznego. Obliczanie sum zaimplementuj w osobnych funkcjach, które będziesz wywoływał za pośrednictwem wskaźników.

Czy mój program działa zgodnie z poleceniem? Nie rozumiem do końca zagadnienia z tematu wątku.

#include <stdio.h>
#include <stdlib.h>

void enter(int *a, int *r, int *an){
    printf("Podaj pierwszy element ciągu: ");
    scanf("%d", a);
    printf("Podaj różnice/iloraz: ");
    scanf("%d", r);
    printf("Podaj liczbe elementów: ");
    scanf("%d", an);
}

int sumaatrytmetycznego(int a, int r, int an){
    int suma = 0;
    for(int i = 0; i < an; i++){
        suma += a;
        a += r;
    }
    return suma;
}

int sumageometrycznego(int a, int r, int an){
    int suma = 0;
    for(int i = 0; i < an; i++){
        suma += a;
        a *=r;
    }
    return suma;
}

int main() {
    int a;
    int r;
    int an;
    int nr;
    printf("[1] suma ciągu gemetrycznego\n"
           "[2] suma ciagu arytmetycznego\n"
           "Podaj numer operacji: ");
    scanf("%d", &nr);
    if(nr == 1){
        enter(&a, &r, &an);
        int (*ptr_sumageom)(int, int, int) = sumageometrycznego;
        printf("%d\n", ptr_sumageom(a, r, an));
    }
    else if(nr == 2){
        enter(&a, &r, &an);
        int (*ptr_sumaryt)(int, int, int) = sumaatrytmetycznego;
        printf("%d\n", ptr_sumaryt(a, r, an));
    }
    return 0;
}
2

Wskaźnik na funkcję

//funkcje w programie
int sumaatrytmetycznego(int a, int r, int an)
int sumageometrycznego(int a, int r, int an)

//wskaźnik na fnkcje
int (*ptr_function)(int,int,int);

4

Technicznie działa, ale skoro funkcje mają tą samą sygnaturę, sądze, że prowadzący chciał byście zrobili coś takiego

typedef int (*ptr_dzialanie_t)(int, int, int);

ptr_dzialanie_t wybierz_dzialanie(int nr)
{
    if(nr == 1)
        return sumageometrycznego;
    else if(nr == 2)
        return sumaatrytmetycznego;

    return 0;
}

int main() {
    int a;
    int r;
    int an;
    int nr;
    printf("[1] suma ciągu gemetrycznego\n"
           "[2] suma ciagu arytmetycznego\n"
           "Podaj numer operacji: ");
    scanf("%d", &nr);

    ptr_dzialanie_t dzialanie = wybierz_dzialanie(nr);
    if(dzialanie)
    {
        enter(&a, &r, &an);
        printf("\nwynik: %d", dzialanie(a, r, an));
    }
    else
        printf("\nnieprawidlowy nr dzialania");

    
    return 0;
}
2
#include <stdio.h>
#include <stdlib.h>

typedef struct {int id; char*description; int( * dzialanie )( int, int, int ); } Operation;

void enter(int *, int *, int *);
int sumaatrytmetycznego(int, int, int);
int sumageometrycznego(int, int, int);

int main()
{
    int a;
    int r;
    int an;
    int nr;
    Operation date[] =
    {
        {1, "suma ciągu gemetrycznego\n", sumageometrycznego  },
        {2, "suma ciagu arytmetycznego\n", sumaatrytmetycznego }
    };
    for(int i = 0; i < 2; ++i)
    {
        printf("%d. %s", date[i].id, date[i].description);
    }
    printf("Podaj numer operacji: ");
    scanf("%d", &nr);
    printf("Obliczamy %s", date[nr-1].description );
    enter(&a, &r, &an);
    printf("%d\n", date[nr-1].dzialanie(a, r, an));
  
    return 0;
}

void enter(int *a, int *r, int *an){
    printf("Podaj pierwszy element ciągu: ");
    scanf("%d", a);
    printf("Podaj różnice/iloraz: ");
    scanf("%d", r);
    printf("Podaj liczbe elementów: ");
    scanf("%d", an);
}

int sumaatrytmetycznego(int a, int r, int an){
    int suma = 0;
    for(int i = 0; i < an; i++){
        suma += a;
        a += r;
    }
    return suma;
}

int sumageometrycznego(int a, int r, int an){
    int suma = 0;
    for(int i = 0; i < an; i++){
        suma += a;
        a *=r;
    }
    return suma;
}

3

Mocno rznie mi oczy ten kod, więc:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct { double a,s; unsigned n; } source;

int input(const char *step,source *src)
{
    printf("Podaj pierwszy element ciągu: ");
    if(1!=scanf("%lf",&(src->a))) return 0;
    printf("Podaj %s: ",step);
    if(1!=scanf("%lf",&(src->s))) return 0;
    printf("Podaj liczbe elementów: ");
    if(1!=scanf("%d",&(src->n))) return 0;
    return 1;
}

double ArithmeticProgressionSum(const source *src)
{
	return (src->n)*(src->a)+0.5*(src->s)*(src->n)*((src->n)-1);
}

double GeometricProgressionSum(const source *src)
{
    if(src->s!=1) return (src->a)*(1-pow((src->s),(src->n)))/(1-(src->s));
	return (src->a)*(src->n);    
}

typedef double Calculate(const source *src);
struct { const char *description,*step; Calculate *calculate; } OP[]=
{
    {"gemetrycznego",  "iloraz" , &GeometricProgressionSum },
    {"arytmetycznego", "różnice", &ArithmeticProgressionSum },
};
    
int main()
{
    int nr;
    source src;
    for(int i=0;i<sizeof(OP)/sizeof(*OP);++i) printf("%d. suma ciągu %s\n",i+1,OP[i].description);
    printf("Podaj numer operacji: ");
    if((1==scanf("%d",&nr))&&(1<=nr)&&(nr<=sizeof(OP)/sizeof(*OP)))
    {
	    --nr;
	    printf("Obliczamy sumę ciągu %s\n",OP[nr].description);
	    if(input(OP[nr].step,&src)) printf("Wynik: %lg\n",OP[nr].calculate(&src));
	    else printf("Niepoprawne dane\n");
	}
	else printf("Nie ma operacji o takim numerze\n");
    return 0;
}

Większość wykładowców w przypadku zadań z sumami ciągów arytmetycznego/geometrycznego wystawia co najwyżej tróję za rozwiązanie z pętlami.
Co jak co a podstawy matematyki programista znać powinien.

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