Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zadanie z plikiem w C

Ostatnio zmodyfikowano 2017-01-11 00:51
Autor Wiadomość
baronsob
Temat założony przez niniejszego użytkownika
Zadanie z plikiem w C
» 2017-01-10 21:09:24
Witam,

Potrzebuję pomocy z pewnym zadaniem na zaliczenie w języku C. Brzmi ono:

 Napisz program, który dla wielokąta o wierzchołkach wczytanych z pliku podanego przez użytkownika oblicza obwód, pole i współrzędne środka ciężkości tego wielokąta. Wierzchołki zapisane są w kolejności odwrotnej do ruchu wskazówek zegara w wierszach po dwie liczby.

Mój kod na razie wygląda tak:

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PUNKTOW 20



int main()
{
    char nazwa[ 100 ];
    FILE * plik;
   
    puts( "Podaj nazwe pliku" );
    scanf( "%s", nazwa );
   
   
    if(( plik = fopen( nazwa, "r" ) ) == NULL ) {
        printf( "Blad %s", nazwa );
        return 0;
    }
   
    struct punkt
    {
        float x;
        float y;
    } wspolrzedne[ MAX_PUNKTOW ];
   
    int ile = 0;
    while( ile < MAX_PUNKTOW && fscanf( plik, "%f %f", & wspolrzedne[ ile ].x, & wspolrzedne[ ile ].y ) == 2 )
    {
        ile++;
    }
   
    return 0;
}

Jeśli ktoś mógłby to sprawdzić oraz pomóc mi z funkcjami obliczającymi pole, obwód i środek ciężkości to byłbym wdzięczny.

P-156293
mokrowski
» 2017-01-10 21:34:14
P-156298
baronsob
Temat założony przez niniejszego użytkownika
» 2017-01-10 21:48:45
Wiem jak obliczyć obwód i dziękuje za wzory ale nie wiem jak to zastosować ze zmiennymi jakie mam w tym kodzie w strukturze czyli jak napisać tą funkcję i potem ją wywołać używając tych zmiennych struct. Innymi słowy wiem teraz jakie instrukcje zawrzeć w funkcji ale mam problem z argumentami. Nie wiem przecież ile będzie tych wierzchołków. Dodam, że pierwszy raz miałem styczność z programowaniem w październiku ubiegłego roku więc takie rzeczy jeszcze sprawiają mi problemy.
P-156303
mokrowski
» 2017-01-10 22:59:13
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PUNKTOW 20

typedef struct {
    float x;
    float y;
} punkt_t;

typedef struct {
    unsigned ilosc_punktow;
    punkt_t * tablica_punktow;
    double obwod;
    double pole;
    punkt_t srodek_ciezkosci;
} punkty_figury_t;

void zniszcz_punkty_figury( punkty_figury_t * punkty_figury ) {
    free( punkty_figury->tablica_punktow );
    free( punkty_figury );
}

punkty_figury_t * wczytaj_punkty( const char * nazwa_pliku ) {
    punkty_figury_t * punkty_figury = malloc( sizeof * punkty_figury );
    punkt_t * punkty = malloc(( sizeof * punkty ) * MAX_PUNKTOW );
    punkty_figury->tablica_punktow = punkty;
    FILE * plik;
    if(( plik = fopen( nazwa_pliku, "r" ) ) == NULL ) {
        fprintf( stderr, "Błąd otwarcia %s\n", nazwa_pliku );
        exit( EXIT_FAILURE );
    }
    unsigned index_punktow = 0;
    while(( index_punktow < MAX_PUNKTOW ) &&( 2 == fscanf( plik, " %f %f",
    & punkty[ index_punktow ].x, & punkty[ index_punktow ].y ) ) ) {
        ++index_punktow;
    }
    fclose( plik );
    punkty_figury->ilosc_punktow = index_punktow;
   
    return punkty_figury;
}

void pokaz_punkty( const punkty_figury_t * punkty ) {
    for( unsigned i = 0; i < punkty->ilosc_punktow; ++i ) {
        printf( "Punkt %u: x = %f\ty = %f\n", i, punkty->tablica_punktow[ i ].x, punkty->tablica_punktow[ i ].y );
    }
}

void oblicz_obwod( punkty_figury_t * punkty ) {
    // Tu algorytm obliczania obwodu...
    punkty->obwod = 0.0;
}

void oblicz_pole( punkty_figury_t * punkty ) {
    // Tu algorytm obliczania pola...
    punkty->pole = 0.0;
}

void oblicz_srodek_ciezkosci( punkty_figury_t * punkty ) {
    // Tu algorytm obliczania środka ciężkości ...
    punkty->srodek_ciezkosci.x = 0.0;
    punkty->srodek_ciezkosci.y = 0.0;
}


int main() {
    char nazwa[ 100 ];
   
    puts( "Podaj nazwe pliku: " );
    scanf( " %99s", nazwa );
    punkty_figury_t * punkty = wczytaj_punkty( nazwa );
   
    printf( "Wprowadziłem z pliku %u punktów.\n", punkty->ilosc_punktow );
    pokaz_punkty( punkty );
    oblicz_obwod( punkty );
    oblicz_pole( punkty );
    oblicz_srodek_ciezkosci( punkty );
    printf( "Obwód figury to:         %f\n", punkty->obwod );
    printf( "Pole figury to:          %f\n", punkty->pole );
    printf( "Środek ciężkości to: x = %f  y = %f\n",
    punkty->srodek_ciezkosci.x, punkty->srodek_ciezkosci.y );
   
    zniszcz_punkty_figury( punkty );
   
    return EXIT_SUCCESS;
}
P-156306
baronsob
Temat założony przez niniejszego użytkownika
» 2017-01-10 23:17:11
Dziękuje bardzo, większość rozumiem ale mógłbyś napisać komentarz co robisz? W sensie, wolałbym wszystko dokładnie wiedzieć co się dzieje, ponieważ głównie o to chodzi. Nie to żebym był niewdzięczny.
P-156309
mokrowski
» 2017-01-10 23:54:58
A która część jest niezrozumiała?
P-156310
baronsob
Temat założony przez niniejszego użytkownika
» 2017-01-11 00:03:07
Zniszcz punkty figury oraz to co się dzieje przed deklaracją FILE*. Poza tym program się nie kompiluje w GCC.
P-156312
mokrowski
» 2017-01-11 00:12:53
Przed deklaracją FILE* alokuję dynamicznie pamięć na punkty wczytywane z pliku. Jeśli alokuję je dynamicznie przez malloc(), powinienem je kiedyś usunąć z pamięci. Robi to free() w zniszcz_punkty(). Przeczytaj dokumentację do malloc() i free().
https://pl.wikibooks.org/wiki​/C/malloc
P-156313
« 1 » 2
  Strona 1 z 2 Następna strona