Skocz do zawartości
aurel

C, Scanf, Printf I Typy Zmiennych

Rekomendowane odpowiedzi

#include <stdio.h>#include <stdlib.h>#define PI 3.141592654;int main(int argc, char *argv[]){    double d, r, pole;    scanf("%f",&r);  scanf("%f",&d);    pole=((r*r)-((d*d)/4))*PI;    printf("%.2f\n",pole);    system("PAUSE");	  return 0;}

Program w ogóle nie działa. Nie zczytuje nawet zmiennych. Jeśli typ danych zmienie na float - działa bez problemu :/

Identyczny program (z double) tyle że korzystający z cin i cout też działa bez problemu...

Ktoś wie gdzie może być błąd...?

 

/i żeby nie było głupich pytań - program MUSI być zrobiony na double.

 

//ok, juz mam :) powinno byc: scanf("%lf",&r);

Edytowane przez aurel

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

od zawsze? :)

 

#define to nie jest część C++, to jest polecenie preprocesora. Dlatego też możesz sobei zdefiniować makro, któe bedzie niepoprawne w C++, bo dla preprocesora wszystko jedno co tam podasz...

 

Drugie niebezpieczeństwo jest zwiazane z typami danych, gdyż zapis:

#define STALA 34

 

definiuje jedynie tekst 34, który będzie wstawiony w kod w miejscu gdzie wystąpi słówko STALA. A powiedz mi waćpan teraz jakiego typu jest ta STALA? :)

wszak, może być:

#define STALA 34

#define STALA 34L

#define STALA _T("34")

#define STALA L"34"

#define STALA 34f

#define STALA 34.0f

 

gdzie potem wykorzystując w programie wartosć STALA kompilator źle zrzutuje typy i prawnie niewykrywalny błąd gotowy :)

 

O wiele lepiej jest zastosować c++owe metody definiowania stałych, np:

const int STALA = 34;

const long STALA = 34;

LPCTSTR STALA = _T("34"); // typy mfc-owe

LPCWSTR STALA = L"34";

const float STALA = 34.0f;

 

Jeśli zatem ktoś stosuje #define powinien być świadom niebezpieczeńst jakie to za sobą ciągnie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

pomijajac fakt iż nie zaleca sie stosownia defajna :)

Patrząc na zaprezentowany kod (m.in to co jest w #include oraz zastosowane instrukcje) to według mnie jest to kod w ANSI C, a nie w C++, a jak pamięć mnie nie myli w ANIS C nie ma const, więc jedynym wyjściem jest define. Chociaż jak oczywiście wspomniałeś ma on swoje wady, gdyż jest on rozwijany na poziomie preprocesora.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

gcc

wyglada na to ze dziala jak sie zrobi %lld...

 

//edit - sprawdzilam jeszcze raz - jednak %llu dziala i to pod dev-c++ oO ale okazuje sie ze problem w programie lezy chyba gdzie indziej...

Edytowane przez aurel

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...