wskażniki na struktury

0

witam, mam zrobić struktury i funkcje i jest to połączone ze wskaźnikami. Udało mi się takie coś zrobić, niestety nie działa nie wiem dlaczego:
(nie moge modyfikować main'a)
treść zadania:
screenshot-20190606224515.png

#include  <math.h>
//#define M_PI 3.14159265358979323846
struct Polygon  {
int angle;
double lenght;

};

double area (const struct Polygon *polygonR) {
double M_PI;
double r = (polygonR->lenght)/(double tan( (M_PI)/polygonR->angle));

return 1/2* polygonR->angle * polygonR->lenght * r;

}

double scaled (const struct Polygon *polygonR, int number){
return polygonR * pow(number,2);

}

void scale (struct Polygon *polygonM, const int number){

 polygonM* pow(number,2);
}





int main() {
const struct Polygon polygon1 = {7, 10.};
printf("%lg\n", area(&polygon1));
struct Polygon polygon2 = scaled(&polygon1, 2.);
printf("%lg\n", area(&polygon2));
scale(&polygon2, 2.);
printf("%lg\n", area(&polygon2));
return 0; }

0

Już mogłeś chociaż wrzucić coś co się kompiluje. Na początek przeczytaj errory przy kompialcji i popraw to co się da.

0

Brakuje ci konstruktora. Masz złe typy w funckajc,. Przekazujesz przecież float a ty zrobiłeś int. Nie masz zdefiniowanego operatora *.

1

const struct Polygon polygon1 = {7, 10.}; deklaruje i inicjalizuje strukturę. Nie Musisz deklarować M_PI, ono już jest w math.h. I Uporządkuj obliczenia w funkcjach, pierwsza:

double area (const struct Polygon *polygonR) {
	double r = (polygonR->lenght) / (tan (M_PI/ polygonR->angle));
	return (0.5) * polygonR->angle * polygonR->lenght * r;
}

Ta jedna druga była podejrzana, bo to byłoby zero:) i czemu tak: (double tan( (M_PI), deklaracja w locie? Co do logiki to to Twoje zadanie, Znajdź wzory i Przepisz je starannie do kodu, pamiętając o typach, math.h ma świetną dokumentację.

1

"A mam pytanie czemu mam błąd "invalids operands to binary (have 'const struct Polygon ' and long double " C jest typowane, co prawda nie jakos bardzo mocno, ale tak kompilatora nie można traktować:) scaled ma zadeklarowany drugi argument int, a Dajesz jej float, i funkcja ````pow, Próbujesz jej zapodać dwa inty, a tymczasem z dokumentacji [0]: double pow (double base, double exponent);```
[0] http://www.cplusplus.com/reference/cmath/pow/

EDIT: Zgodnie z przytomną:) sugestią @Pijak pow sobie poradzi z typami, natomiast bug jest, gdyż Mnożysz strukturę (a nie jej składową) przez liczbę, co daje type error.

0

Tak poprawiłem. Jednak nadal błąd.

#include  <math.h>
#define M_PI 3.14159265358979323846
struct Polygon  {
int angle;
double lenght;

};

double area (const struct Polygon *polygonR) {
    double r = (polygonR->lenght) / (tan (M_PI/ polygonR->angle));
    return (0.5) * polygonR->angle * polygonR->lenght * r;
}

const struct Polygon scaled (struct Polygon *polygonR, double number){
polygonR * pow(number,2);

}

const struct Polygon scale (struct Polygon *polygonM, double number){

 polygonM* pow(number,2);
}





int main() {
const struct Polygon polygon1 = {7, 10.};
printf("%lg\n", area(&polygon1));
struct Polygon polygon2 = scaled(&polygon1, 2.);
printf("%lg\n", area(&polygon2));
scale(&polygon2, 2.);
printf("%lg\n", area(&polygon2));
return 0; }
1

Może się mylę, ale chyba, żeby przeskalować wielokąt foremny, wystarczy przemnożyć długości boków przez liczbę.

struct Polygon scaled (const struct Polygon *polygonR, double number){
	struct Polygon output = {polygonR->angle,  polygonR->length * number};
	return output;
}

Funkcja ma zwrócić nową strukturę Polygon, z odpowiednio obliczonymi parametrami, czyli Masz ją stworzyć w funkcji i zwrócić. Zauważ, teraz typy się zgadzają, mnożymy liczby przez liczby, zwracamy to co w definicji metody.

1

Sygnatury powinny wyglądać tak:

double area(const Polygon* polygon);
Polygon scaled(const Polygon* polygon, double scale);
void scale(Polygon* polygon, double scale)

M_PI jest zdefiniowane w <math.h>, ale przed include powinieneś dodać #define _USE_MATH_DEFINES

Skalowanie odnosi się tylko do długości boków, więc nie próbuj mnożyć struktury tylko zmienną reprezentującą długość boku.

PS Jesteś pewny, że ten wzór na pole jest ok?

0
tajny_agent napisał(a):

Sygnatury powinny wyglądać tak:

double area(const Polygon* polygon);
Polygon scaled(const Polygon* polygon, double scale);
void scale(Polygon* polygon, double scale)

M_PI jest zdefiniowane w <math.h>, ale przed include powinieneś dodać #define _USE_MATH_DEFINES

Skalowanie odnosi się tylko do długości boków, więc nie próbuj mnożyć struktury tylko zmienną reprezentującą długość boku.

PS Jesteś pewny, że ten wzór na pole jest ok?

ogólnie wszystko mi już wyszło. Dziękuje wszystkim tu obecnym za pomoc:)
. Wzór na pole był zły też. tak powinien wyglądać
double r = (polygonR->lenght) / (2 * (tan (M_PI/ polygonR->angle)));
return (0.5) * polygonR->angle *polygonR->lenght * r;

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