structurii

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
cosmyn17th
Junior
Junior
Posts: 16
Joined: 28 Nov 2008, 21:39
Judet: Neamţ

structurii

Post by cosmyn17th » 06 Jan 2009, 20:45

buna am si e o mica intrebare...si chiar nu inteleg care e problema..
deci cam asa sta treaba:
La o statie meteo se alcatuieste un buletin meteorologic care contine: numele meteorologului de serviciu, presiunea si temperatura atmosferica din ziua respectiva. Se citesc buletinele meteo pe parcursula a, n zile. Sa se afiseze temperatura maxima atinsa si zilele in care s-a inregistrat maxima, impreuna cu numele meteorologilor de serviciu si presiunea din zilele respective.

eu am rezolvat problema, DAR nu pot sa imi deau seama dc nu ma pune sa Scriu NUMELE METEOROLOGULUI, folosesc functia gets.
uitati codul:

Code: Select all

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
using namespace std;

typedef struct
{
	char nume[20];
	float temp, pres;
}METEO;

METEO b[50];

int main()
{
	int i,n;
	float max;
	cout<<"\n Numarul de zile:";
	cin>>n;
	for(i=0; i<=n-1; i++)
	{
		cout<<"\n Ziua "<<i<<";";
		cout<<"\n Numele Meteorologului:";
		gets(b[i].nume);
		cout<<"\n Temperatura:";
		cin>>b[i].temp;
		cout<<"\n Presiunea:";
		cin>>b[i].pres;
	}
	max=b[i].temp;
	for(i=1; i<=n-1; i++)
		if(b[i].temp>max)
			max=b[i].temp;
	cout<<"\n Temperatura maxima este:"<<max;
	for(i=0; i<=n-1; i++)
		if(b[i].temp==max)
			cout<<"\nZiua:"<<i<<"Meteorolog:"<<b[i].nume<<"Presiunea:"<<b[i].pres;
	getch();
	return 0;
}
si am uitat sa specific ca asta am incercat in Visuat C++ 2008,
poate in borland merge...?

Uitati asa arat o rulare a programului :

Numarul de zile: 2

Ziua 1;
Numele Meteorologului:
Temperatura:43

Presiunea:3

Ziua 2;
Numele Meteorologului:
Temperatura:32

Presiunea: 5

Temperatura maxima este:43
ziua:1Meteorolog:Presiunea:3



bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: structurii

Post by bytefield » 07 Jan 2009, 02:50

Nu stiu de ce nu folosesti cin in loc de gets...
Vezi ca in partea asta de cod

Code: Select all

for(i=1; i<=n-1; i++)
      if(b[i].temp>max)
il initializezi pe i cu 1, ceea ce face sa sara testul peste b[0], care nu va fii evaluat niciodata.
Am si eu o mica intrebare, in ce limbaj ai scris programul acesta? :biggrin:

cosmyn17th
Junior
Junior
Posts: 16
Joined: 28 Nov 2008, 21:39
Judet: Neamţ

Re: structurii

Post by cosmyn17th » 07 Jan 2009, 16:54

in C++

tot nu mere..lam initializat pe i=0; i<=n-1; i++)
si tot degeaba

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: structurii

Post by bytefield » 07 Jan 2009, 17:37

Nu doar initializarea lui "i" era corectia, ti-am mai spus (nu in mod direct) sa folosesti "cin" in loc de "gets".
Remarca legata de ce limbajul de programare era datorita faptului ca mixezi libraria standard din C cu cea din C++. Te poti hotara asupra caruia vrei sa o folosesti si ramai cu aia, adica nu folosi cin impreuna cu gets(ori una ori cealalta), de asemenea getch() este o extensie a compilatorului, nu o functie in biblioteca standard. Daca folosesti "cin" in loc de "gets" trebuie sa-ti functioneze corect. Eu am compilat programul cu VC++2008.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: structurii

Post by neagu_laurentiu » 07 Jan 2009, 17:53

E o problema daca citesti intai cu cin apoi cu gets() (invers merge). Asa ca folosesti ori una ori alta.

cosmyn17th
Junior
Junior
Posts: 16
Joined: 28 Nov 2008, 21:39
Judet: Neamţ

Re: structurii

Post by cosmyn17th » 07 Jan 2009, 18:31

ok , am pus, cin si mere relativ bine, dar in caz ca numele meteorologului e format din doua cuvinte nu merge pentru ca "cin" citeste numa caracterele pana intalneste primul spatiu. deci nu e bn , si deaceea am fol gets(),

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: structurii

Post by Andreas » 07 Jan 2009, 18:48

Problema vine de la primul cin, care dupa extragere din fluxul de intrare nu goleste buffer-ul complet astfel incat caracterul '\n' inca exista.
In momentul cand codul ajunge la gets(), buffer-ul nefiind gol se citeste doar '\n' si se trece mai departe la linie noua.
Corectia se face cu cin.ignore():

Code: Select all

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
using namespace std;

typedef struct
{
   char nume[20];
   float temp, pres;
}METEO;

METEO b[50];

int main()
{
   int i,n;
   float max;
   cout<<"\n Numarul de zile:";
   cin>>n;
   for(i=0; i<=n-1; i++)
   {
      cout<<"\n Ziua "<<i<<";";
      cout<<"\n Numele Meteorologului:";
      cin.ignore(1000,'\n');
      gets(b[i].nume);
      ...      
  return 0;
}
Succes!

Dark
Banned
Banned
Posts: 75
Joined: 21 Nov 2007, 19:29
Judet: Bucureşti

Re: structurii

Post by Dark » 07 Jan 2009, 18:50

Sau folosesti cin.getline() si nu folosesti niciodata gets(), care e o functie predispusa la buffer overflow.

cosmyn17th
Junior
Junior
Posts: 16
Joined: 28 Nov 2008, 21:39
Judet: Neamţ

Re: structurii

Post by cosmyn17th » 07 Jan 2009, 18:58

mersi mult, o mers foarte bine cu cin.ignore(1000,'\n');

acum ca miai zis chestia asta , de ai pus 1000 ...???

ca sa stiu si ce e cu ea, nu sa o folosesc aiurea , :biggrin:

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: structurii

Post by Andreas » 07 Jan 2009, 19:12

Primula parametru al lui cin.ignore() se refera la numarul maxim de caractere din stdin in care se ignora un caracter, in cazul nostru '\n'.
Default este 1. Ast inseamna ca default, adica folosind doar cin.ignore('\n'), poti introduce doar numere de un caracter (de la 0 la 9), fara a ramane '\n' in buffer.
1000 inseamna ca poti folosi numere de 1000 de caractere(cifre)!!!Hm, cam mult!? ;)

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: structurii

Post by bytefield » 07 Jan 2009, 19:14

Daca ai spus ca e C++ poti folosi string-urile si vectorii din biblioteca standard, e mai simplu si mai sigur ;).

Code: Select all

#include <iostream>
#include <vector>
#include <string>
#include <cfloat>
#include <cstdlib>

using namespace std;

struct Meteo
{
	string nume;
	float temp, pres;
};

int main()
{
	vector<Meteo> b;
	float tmax = FLT_MIN;	// tmax trebuie sa ia valoarea celei mai mici temperaturi
	int n = 0, imax = 0;
	Meteo meteo;
	char nume[256];
	
	
	cout << "\nNumarul de zile:";
	cin >> n;
	for (int i = 0; i < n; i++) {
		// in mod normal zilele nu incep de la 0, pune i+1 ca sa inceapa de la 1
		cout << "\nZiua " << i <<";\n";
		cout << "Numele Meteorologului:";
		cin.ignore();
		std::cin.get(nume, 256, '\n');
		cout << "un nume" << nume;
		meteo.nume = nume;
		cout << "\nTemperatura:";
		cin >> meteo.temp;
		cout  <<"\nPresiunea:";
		cin >> meteo.pres;
		b.push_back(meteo);
		if (tmax <= meteo.temp)
			tmax = meteo.temp;
	}
	cout << "\nTemperatura maxima este:" << tmax;
	for (int i = 0; i < b.size(); i++)
		if (b[i].temp == tmax)	// partea de mai sus cu ziua, se aplica si aici...
			cout << "\nZiua: " << i <<" Meteorolog: " << b[imax].nume << " Presiunea: " << b[imax].pres;
	cout << "\n";
	system("pause"); 	// unportable: depinde de windows
	return 0;
}
cin.ignore() se foloseste ca sa se ignore caracterele din bufferul de intrare, de obicei acesta se umple cu "gunoi" (utilizatorul apasa o tasta in timp ce ruleaza programul tau, etc)

u0m3
Membru
Membru
Posts: 80
Joined: 21 Dec 2008, 19:11
Judet: Bucureşti
Contact:

Re: structurii

Post by u0m3 » 07 Jan 2009, 20:48

Daca este obligatorie folosirea functiilor asemanatoare celor CRT, ar mai fi scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l (link msdn: http://msdn.microsoft.com/en-us/library ... S.80).aspx), versiunile securizate ale functiilor CRT.
Mai exact:

Code: Select all

scanf_s("%s", b.nume, sizeof(b.nume)-1);
sau

Code: Select all

scanf_s("%s", b.nume, 19);
// Varianta directa
Doar ca in acest caz pentru a face array-ul/vectorul dinamic trebuie folosit in mod repetat memcpy_s... lucru relativ enervant.
Am mentionat aceasta rezolvare deoarece programul seamana cu o tema de informatica pentru liceu/facultate mai mult decat efectiv un program de sine statator, iar in aceste cazuri se folosesc versiuni destul de vechi de C++ (personal cel mai des folosit am observat a fi Borlan C++ versiunile 3-4), versiuni ce nu beneficiaza de implementarile acestea de template-uri.

Imi cer scuze daca am abera/dezinformat sau am jignit pe cineva.
Old-School: If at first you don't succeed, try and try again.
New-School: If at first you don't succeed, destroy every evidence that you have ever tried.
Citate nostime:
  1. Mintile umane sunt ca parasutele... Functioneaza doar daca sunt deschise.
  2. Light travels faster than sound, that's why some people seem Bright ...... untill they Speak...

cosmyn17th
Junior
Junior
Posts: 16
Joined: 28 Nov 2008, 21:39
Judet: Neamţ

Re: structurii

Post by cosmyn17th » 07 Jan 2009, 21:06

multumesc pt ajutor, mia iesti problema,
si am inteles si cum e q cin.ignore();
:cheers:

Dark
Banned
Banned
Posts: 75
Joined: 21 Nov 2007, 19:29
Judet: Bucureşti

Re: structurii

Post by Dark » 08 Jan 2009, 12:08

u0m3 wrote:Daca este obligatorie folosirea functiilor asemanatoare celor CRT, ar mai fi scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l , versiunile securizate ale functiilor CRT.
Alea nu-s versiuni securizate, sint niste extensii aberante pentru CRT facute de Microsoft si ignorate de restul lumii. Cel mai amuzant e ca i-am vazut pe diversi incercind sa le foloseasca pur si simplu in locul functiilor fara _s in coada. Daca nu-ti instalezi propriul "invalid parameter handler" cu _set_invalid_parameter_handler(), functiile alea crapa. E adevarat, nu mai ai buffer overflow-uri, dar programul tot crapa, asa ca n-ai rezolvat mai nimic folosindu-le.

Exista fgets() si cin.getline(). Nu e nevoie de alte inventii care nici macar nu fac exact ce trebuie pentru a citi chestii de la tastatura.

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: structurii

Post by Andreas » 08 Jan 2009, 13:37

Si totusi sufixul "_s" se refera la versiuni mai securizate ale functiilor, in sensul ca se ofera mecanisme pentru validarea vlaorilor parametrilor la runtime si, de asemenea, mecanisme de iesire mai "utile" in caz de invalidare: Security Enhancements in the CRT. Un astfel de mecanism de iesire este si "_set_invalid_parameter_handler":
Extras MSDN:
A handler for invalid parameters is also accessible to the developer. When an encountering an invalid parameter, instead of asserting and exiting the application, the CRT provides a way to check these problems with the _set_invalid_parameter_handler function.

Post Reply