Aby sprawdzić czy zmienna nie wychodzi poza zakres wystarczy napisać takie coś:
scanf("%f",&zmienna); while(zmienna>=FLT_MAX) { printf("Liczba jest spoza zakresu zmiennej!"); printf(" jakis tekst czy cus: _\b"); scanf("%f",&zmienna); }
I dodać do kodu źródłowego dla typu float <float.h>
"To jest kod dla typu float dla inta jest podobnie tylko zmienia się nazwa stałej nie ma już FLT_MAX tylko: INT_MAX a jak chce się sprawdzić czy zmienna nie wychodzi poza zakres od dołu to INT_MIN i dla intów dołączamy bibliotekę <limits.h>
To jest najmniej skomplikowane i sprawdzone bo u mnie działa .
Ostatnio edytowany przez zordon (2007-04-14 18:11:27)
Offline
to przynajmniej czesci z was powinno pomoc z projektem (macie tu link do strony z metoda monte Carlo i tam jest kod zrodlowy programu obliczajacy calke ta metoda)
http://www.i-lo.tarnow.pl/edu/inf/alg/c … es/005.php
A jak komus nie chce sie tam wchodzic i szukac to to jest kod:
//**************************************************** //** Obliczanie całki oznaczonej metodą Monte Carlo ** //** ---------------------------------------------- ** //** (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie ** //**************************************************** #include <iomanip> #include <iostream> using namespace std; //******************************* //** Tutaj definiujemy funkcję ** //******************************* double f(double x) { return(x * x + 2 * x); } //******************** //** Program główny ** //******************** main() { const int N = 10000; //liczba punktów losowych double xp,xk,s,dx; int i; char c[1]; cout.precision(3); // 3 cyfry po przecinku cout.setf(ios::fixed); // format stałoprzecinkowy cout << "Obliczanie calki oznaczonej\n" " Metoda Monte Carlo\n" "---------------------------\n" "(C)2004 mgr J.Walaszek I LO\n\n" "f(x) = x * x + 2 * x\n\n" "Podaj poczatek przedzialu calkowania\n\n" "xp = "; cin >> xp; cout << "\nPodaj koniec przedzialu calkowania\n\n" "xk = "; cin >> xk; cout << endl; srand((unsigned)time(NULL)); s = 0; dx = xk - xp; for(i = 1; i <= N; i++) s += f(xp+((double)rand()/(double)(RAND_MAX+1)*dx)); s = dx * s / N; cout << "Wartosc calki wynosi : " << setw(8) << s << "\n\nNacisnij klawisz Enter"; cin.getline(c, 1); cin.getline(c, 1); }
na stronce jednak jest troche wiecej o tej metodzie !
Ostatnio edytowany przez zordon (2007-04-18 21:43:18)
Offline
Tu jest Omel i inni chetni ten programik z losowanie floatow i metoda monte carlo.
Metoda monte carlo do obliczenia pola ktora to dzisiaj napisalem ma jeszcze kilka wad ale dziala nie wiem tylko czy dla wszystkich wprowadzanych danych. Pisany w Dev pod Windowsa!
//Program oblicza pole metoda monte carlo #include <stdlib.h> //srand #include <stdio.h> #include <float.h> #define FALSE 0; struct Punkt { float x; float y; }; struct Kwadrat { struct Punkt A; struct Punkt B; struct Punkt C; }; struct Kolo { struct Punkt srod; float r; }; float spr(float,int,int); int main() { int i=0, krok=0, idx=1, wej_ok,traf=0; float S=0,stos=0; struct Kolo test; struct Punkt losuj; struct Kwadrat opisany; printf("Program oblicza pole kola metoda Monte Carlo! \n"); printf("Podaj wymiary charakteryzujace kolo ktorego pole chcesz obliczyc!\n"); getch(); system("cls"); while(idx<4) { if(idx==1) { printf("Podaj promien: _\b"); test.r=spr(test.r,wej_ok,idx); system("cls"); } else if(idx==2) { printf("Podaj wspolrzedne srodka kola! \n"); printf("Podaj x srodka: _\b"); test.srod.x=spr(test.srod.x,wej_ok,idx); system("cls"); } else if(idx==3) { printf("Podaj y srodka: _\b"); test.srod.y=spr(test.srod.y,wej_ok,idx); system("cls"); } idx++; } opisany.B.y=test.r+test.srod.y; opisany.A.y=test.r+test.srod.y; opisany.B.x=test.srod.x+test.r; opisany.C.y=test.srod.y-test.r; opisany.A.x=test.srod.x-test.r; opisany.C.x=test.srod.x-test.r; printf("Wprowadz liczbe interakcji (im wieksza liczba tym wieksza dokladnosc wyniku"); printf("Interakcje: _\b"); scanf("%d", &krok); while(krok<1000) { system("cls"); printf("Minimalna liczba interakcji to 1000\n"); getch(); system("cls"); printf("Wprowadz liczbe interakcji (im wieksza liczba tym wieksza dokladnosc wyniku)\n"); printf("Interakcje: _\b"); scanf("%d", &krok); } for (i=1;i<=krok;i++) { //losowanie pol nalezacych do kwadratu losuj.x=((float)rand()/(float)(RAND_MAX+1)*(opisany.B.x-opisany.A.x))+opisany.A.x; losuj.y=((float)rand()/(float)(RAND_MAX+1)*(opisany.A.y-opisany.C.y))+opisany.C.y; if ((pow(losuj.x,2)+pow(losuj.y,2))<=pow(test.r,2)) { traf++; } } stos=(float)traf/(float)krok; S=stos*pow(2*test.r,2); system("cls"); printf("Pole kola wynosi okolo: %f",S); getch(); return 0; } float spr(float WIEL, int in_ok, int ix) { in_ok=scanf("%f",&WIEL); if(ix==1) { while(WIEL>=FLT_MAX || in_ok!=1 || WIEL<0) { if(WIEL<0) { system("cls"); printf("\rPromien nie moze byc ujemny!"); getch(); system("cls"); WIEL=FALSE; } else if (in_ok!=1) { system("cls"); scanf("%*s"); printf("\rBez liter i znakow! "); getch(); system("cls"); } else if(WIEL>=FLT_MAX) { system("cls"); printf("\rLiczba jest spoza zakresu! "); getch(); system("cls"); } printf("Podaj promien: _\b"); in_ok=scanf("%f",&WIEL); } system("cls"); } else if (ix==2 || ix==3) { while(WIEL>=FLT_MAX || in_ok!=1) { if (in_ok!=1) { system("cls"); scanf("%*s"); printf("\rBez liter i znakow! "); getch(); } else if(WIEL>=FLT_MAX) { system("cls"); printf("\rLiczba jest spoza zakresu! "); getch(); system("cls"); } if (ix==2) { system("cls"); printf("Podaj x srodka: _\b"); } else if (ix==3) { system("cls"); printf("Podaj y srodka: _\b"); } in_ok=scanf("%f",&WIEL); } } return WIEL; }
Ostatnio edytowany przez zordon (2007-04-19 16:34:12)
Offline
Jak najbardziej podpisuje się pod prośbą Marty... Jeśli ktoś robił pojemność zastępczą kondensatorów albo opór zastępczy układu oporników, to niech wrzuci na forum jak to mniej więcej ma wyglądać, żeby Ci, którzy nie są za bardzo zorientowani w C mogli to obczaić i i rozumiejąc co się tam w tym programie ma dziać mogli ruszyć ze swoim projektem...
A w szczególności chodzi o warunki...
warunek wychodzenia zmiennej poza zakres już jest...
ale jeśli ktoś mógłby napisać jak to ma wyglądać, żeby sprawdzało czy nie wprowadzono literki, albo jakiegoś innego "fikuśnego" znaczka
i jak te wszystkie warunki mają sie połaczyć, czyli zakres, literki i mniejsze bądz równe zero...
żeby na końcu jakieś świrki z tego nie wyszły...
HELP!!
Offline
ej... co ma znaczyc cos takiego co jest miedzy srzałeczkami;/ ??
Wprowadziłes niepoprawne dane!Dokonaj korekty!
Ilość niewiadomych:4
Rownanie nr 1:
Wprowadz wspolczynnik przy 1 niewiadomej:v
>>>>>>>>>>>>>>>>>*** stack smashing detected ***: ./a.out terminated <<<<<<<<<<<<<<<<<<<
BLAD!!!Mozesz wprowadzac tylko liczby.Spróbuj jeszcze raz:>>>>>>>>>>>>>>>>>Aborted (core dumped) <<<<<<<<<<<<<<<<<<<
a tu jest kod
/* Program do rozwiazywania maksymalnie pięciu równań liniowych
metodą Gaussa. Paweł Bożyk */
#include <stdio.h>
int n,rownanie,wspolczynnik;
float wspolczynnik_wartosc;
/* nagłówek programu - cel programu oraz informacje o autorze */
int info()
{
printf("################################################\n");
printf("#Program do rozwiązywania maksymalnie 5 równań #\n");
printf("# liniowych metodą Gaussa #\n");
printf("# #\n");
printf("# autor: Paweł Bożyk #\n");
printf("################################################\n");
}
/* ilosc równań liniowych - wykorzystanie tablicy znaków ASCII i odpowiadająym im numerom
np. liczba zero w kodzie ASCII to 48, 1 to 49 ... 9 to 57. Wykorzystanie faktu,iż każda z tych
liczb to kod ASCII-48 */
int ile ()
{
char ch;
printf ("Wprowadź iloelementowy układ równań będzie rozwiązywany.\n(ilość elementów nie większa niż 5)\n");
printf ("\nIlość niewiadomych:");
scanf ("%s",&ch);
n=ch-48;
while (!(n>=2 && n<=5))
{
printf("\nWprowadziłes niepoprawne dane!Dokonaj korekty!\n");
printf("Ilość niewiadomych:");
scanf ("%s",&ch);
n=ch-48;
};
}
int wspolczynniki(float tab_wspolczynniki[n][n])
{
for (rownanie=1; rownanie<=n ;rownanie++){
printf("Rownanie nr %d:\n",rownanie);
for (wspolczynnik=1; wspolczynnik<=n ;wspolczynnik++){
printf("Wprowadz wspolczynnik przy %d niewiadomej:",wspolczynnik);
if(!scanf("%f", &wspolczynnik_wartosc))
{
printf("BLAD!!!Mozesz wprowadzac tylko liczby.Spróbuj jeszcze raz:");
scanf("%f", &wspolczynnik_wartosc);
return 0;
};
tab_wspolczynniki[rownanie][wspolczynnik]=wspolczynnik_wartosc;
printf("\n\n");
};
};
}
int main()
{ float tab_wspolczynniki[n][n];
info();
ile ();
wspolczynniki(tab_wspolczynniki);
printf("",n);
printf("",n);
return 0;
}
Offline
a ja mam pytanie do kolegow i kolezanki z grupy Sutkowskiego. Mam projekt liczenie pojemnosci kondensatorow podlaczonych szeregowo mam ich n ilosc - i teraz pytanie czy program oprocz liczenia tej pojemnosci ma robic jakies inne rzeczy w stylu rysowanie ukladu czy cus? czy wystarczy sprawdzenie czy liczba nie wychodzi poza zakres, czy jest liczba i podanie jej wyniku?
Offline
program MUSI na początku rysować dany układ, a potem to już Twoja własna konwencja twórcza.... wymagany jest wynik czyli wartość zastępcza, a wszystko inne zależy od Ciebie:) ja osobiście nie będę raczej sprawdzała zakresu, bo nie wiem, jak to zrobić, ale sprawdzanie literek i ujemnych wartości mam. A rysuneczek to najprzyjemniejsza część projektu i jedyna, którą zrobiłam sama;)) ale i tak jestem dumna:PP
Offline
P@weł przejrzałem pobieżnie Twój kod.
za coś takiego
int n,rownanie,wspolczynnik;
float wspolczynnik_wartosc;
czyli zmienne globalne, upie*dalają z miejsca punkty. Przekazuj n jako argument do funkcji i zmieniaj w niej jego wartość.
int main()
{ float tab_wspolczynniki[n][n];
[...]
}
tutaj tworzysz tablicę dwuwymiarową o rozmiarze [0][0]. n nie ma tutaj jeszcze przypisanej konkretnej wartości.
int ile ()
{
[...]
scanf ("%s",&ch);
n=ch-48;
[...]
nie wczytuj stringa do pojedynczego znaku. zrób to w ten sposób:
scanf("%c", &ch);
albo operuj na łańcuchu znaków.
natomiast
int wspolczynniki(float tab_wspolczynniki[n][n])
lepiej zamień na
int wspolczynniki(float tab_wspolczynniki[][], int n)
ponadto wypadałoby, aby m.in. funkcja
int ile ()
zwracała jakąś wartość w przeciwnym wypadku zamień ją na void ile()
Offline
o kurwa w pytke jeza:D nie ma huja na maryle trza jutro usiasc:D program bez podzialu na funkcje..... działa !! a z podziałem... NIE XD
a co moze zwracac funkcja ILE ??
Ostatnio edytowany przez p@weł (2007-04-21 23:21:25)
Offline
Odnosnie sprawdzania literek i liczb ujemnych, to ja jestem leniwy :-) i staralem sie napisac jak najmniej kodu:
fflush(stdin) - czysci bufor klawiatury
/* Wczytuje zmienna typu float wieksza od zera. Zawiera obsluge bledow. Zwraca wczytana liczbe. */ float wczytaj_float() { float f; int flaga = 1; // warunek wyjscia z petli = 0 while(flaga) { // jesli uzytkownik wpisal litere(-y) lub liczbe <=0 if(!scanf("%f", &f) || (f <= 0)) { printf("Mozesz podac TYLKO LICZBE wieksza od zera z zakresu float: "); fflush(stdin); } else flaga = 0; // wszystko OK - wychodzimy z petli } return f; } /******************************************************************************/
Offline