WEiTI M3 - 2007


#1 2007-04-14 18:09:11

zordon

Ukryty talent

6821953
Skąd: Riviera/Biała Podlaska
Zarejestrowany: 2007-03-20
Posty: 87
Punktów :   -1 

Projekt PRM

Aby sprawdzić czy zmienna nie wychodzi poza zakres wystarczy napisać takie coś:

Kod:

            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

 

#2 2007-04-18 21:40:56

zordon

Ukryty talent

6821953
Skąd: Riviera/Biała Podlaska
Zarejestrowany: 2007-03-20
Posty: 87
Punktów :   -1 

Re: Projekt PRM

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:

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

 

#3 2007-04-19 16:33:07

zordon

Ukryty talent

6821953
Skąd: Riviera/Biała Podlaska
Zarejestrowany: 2007-03-20
Posty: 87
Punktów :   -1 

Re: Projekt PRM

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!

Kod:

 //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

 

#4 2007-04-19 20:18:28

omel

Nowicjusz

6655340
Skąd: Brzeziny
Zarejestrowany: 2007-03-20
Posty: 53
Punktów :   

Re: Projekt PRM

Wielkie dzieki za ten kawalek o losowaniu liczb zmiennoprzecinkowych!!!

Offline

 

#5 2007-04-19 22:06:22

martus

Władca much

8795851
Zarejestrowany: 2007-03-20
Posty: 61
Punktów :   -2 

Re: Projekt PRM

Ok to teraz prośba od kogoś z grupy Sutkowskiego. Jak już ktoś napisał projekt to niech podpowie albo pokaże jak rozwiązał sprawę literek i liczb mniejszych od zera;/

Offline

 

#6 2007-04-20 21:34:11

chriss

Wstydniś

9597613
Skąd: RIVIERA
Zarejestrowany: 2007-03-26
Posty: 18
Punktów :   

Re: Projekt PRM

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!!


***być zagadką, której nie zgadnie nikt nim minie czas***

Offline

 

#7 2007-04-21 18:07:58

p@weł

Osesek

2233545
Skąd: Płock Podolszyce/Wwa Ochota
Zarejestrowany: 2007-03-29
Posty: 38
Punktów :   
WWW

Re: Projekt PRM

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;
}


Wasza nienawiść umacnia naszą wiarę
HOOLIGANS
Aby zostać kimś,najpierw musisz pozostać sobą

Offline

 

#8 2007-04-21 19:23:34

doman

Osesek

Zarejestrowany: 2007-03-22
Posty: 25
Punktów :   

Re: Projekt PRM

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

 

#9 2007-04-21 21:11:34

martus

Władca much

8795851
Zarejestrowany: 2007-03-20
Posty: 61
Punktów :   -2 

Re: Projekt PRM

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

 

#10 2007-04-21 22:04:09

doman

Osesek

Zarejestrowany: 2007-03-22
Posty: 25
Punktów :   

Re: Projekt PRM

dzieki, a jeszcze mam pytanko czy ktos liczy dla n - ilosci kondensatorow/oporow czy tylko to co jest w ukladzie bo chyba nie zrozumialem cwiczeniowca...

Offline

 

#11 2007-04-21 22:41:29

marekf

Niemowa

8270719
Call me!
Zarejestrowany: 2007-03-19
Posty: 3
Punktów :   

Re: Projekt PRM

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

 

#12 2007-04-21 23:13:01

p@weł

Osesek

2233545
Skąd: Płock Podolszyce/Wwa Ochota
Zarejestrowany: 2007-03-29
Posty: 38
Punktów :   
WWW

Re: Projekt PRM

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)


Wasza nienawiść umacnia naszą wiarę
HOOLIGANS
Aby zostać kimś,najpierw musisz pozostać sobą

Offline

 

#13 2007-04-21 23:44:49

omel

Nowicjusz

6655340
Skąd: Brzeziny
Zarejestrowany: 2007-03-20
Posty: 53
Punktów :   

Re: Projekt PRM

Odnosnie sprawdzania literek i liczb ujemnych, to ja jestem leniwy :-) i staralem sie napisac jak najmniej kodu:
fflush(stdin) - czysci bufor klawiatury

Kod:

/*
	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

 

#14 2007-04-22 14:09:44

p@weł

Osesek

2233545
Skąd: Płock Podolszyce/Wwa Ochota
Zarejestrowany: 2007-03-29
Posty: 38
Punktów :   
WWW

Re: Projekt PRM

sprawdzałes tego działanie? chyba niee bo cos sie wykrzcaczA:D


Wasza nienawiść umacnia naszą wiarę
HOOLIGANS
Aby zostać kimś,najpierw musisz pozostać sobą

Offline

 

#15 2007-04-22 14:38:53

omel

Nowicjusz

6655340
Skąd: Brzeziny
Zarejestrowany: 2007-03-20
Posty: 53
Punktów :   

Re: Projekt PRM

U mnie na windowsie xp (na kompilatorze Dev-Cpp) dziala bez zarzutu...
Tylko to jest do liczb zmiennoprzecinkowych

Offline

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
www.magiawyobrazni.pun.pl www.dragonslayers.pun.pl www.trojporozumienie.pun.pl www.colobot.pun.pl www.rawsmackdown.pun.pl