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: #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. |
|
mokrowski |
» 2017-01-10 21:34:14 |
|
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. |
|
mokrowski |
» 2017-01-10 22:59:13 #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 ) { punkty->obwod = 0.0; }
void oblicz_pole( punkty_figury_t * punkty ) { punkty->pole = 0.0; }
void oblicz_srodek_ciezkosci( punkty_figury_t * punkty ) { 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; }
|
|
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. |
|
mokrowski |
» 2017-01-10 23:54:58 A która część jest niezrozumiała? |
|
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.
|
|
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 |
|
« 1 » 2 |