• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Tworzenie tablicy struktur oraz odczyt z pliku.

0 głosów
1,226 wizyt
pytanie zadane 25 czerwca 2019 w C i C++ przez kenjiro244 Dyskutant (8,600 p.)

Witam mam zadanie które w skrócie brzmi. Stworzyć strukturę prostokąt z polami a, b i 2 funkcjami składowymi obwód i pole. Mamy stworzyć tablicę struktur i wypełnić ją danymi z pliku potem wszystko wyświetlić.

#include <iostream>
#include <fstream>
using namespace std;

struct rect
{
	int a;
	int b;
	void obwod();
	void pole();
};

void rect::obwod()
{
	cout << "Obwod: " << 2 * a + 2 * b;
}

void rect::pole()
{
	cout << ", pole: " << a * b;
}

int main()
{
	fstream plik;
	plik.open("dane.txt", ios::in);
	if (plik.good())
	{
		int count;
		plik >> count;
		rect* tab = new rect[count];
		for (int i = 0; i < count; i++)
		{
			plik >> tab[i].a;
			plik >> tab[i].b;
		}
		plik.close();

		//Wypisanie 
		cout << tab[1].b;
	}
}

Plik wygląda tak:

3    // ilośc prostokątów
1 4
5 6
7 8

Chciałbym się dowiedzieć czy takie rozwiązanie jest akceptowalne. 

Program faktycznie działa ale nie jestem pewien czy tak to powinno być zrobione.

komentarz 25 czerwca 2019 przez tkz Nałogowiec (42,040 p.)
Oprócz kosmetyki, typu polskie nazwy i globalna przestrzeń nazw, a i b powinny być unsigned, to jest okey. To wypisanie na próbę? Bo poleceni rozumiem tak, że masz wypisać wszystko.
komentarz 25 czerwca 2019 przez kenjiro244 Dyskutant (8,600 p.)
Tak co do kosmetyki polskie nazwy mam podane w zadaniu więc raczej wolę tak zostawić. A wypisanie to tylko sprawdzenie Bo wystarczy dodać tylko zwykła pętla wiec już nie dawałem.

1 odpowiedź

0 głosów
odpowiedź 25 czerwca 2019 przez niezalogowany
wybrane 27 czerwca 2019 przez kenjiro244
 
Najlepsza
  1. Nie używaj 'using namespace'
  2. std::fstream ---> std::ifstream.
  3. Zamiast funkcji open użyj paramterów konstruktora.
  4. std::ifstream::good() ---> std::ifstream::is_open()
  5. Zapomniałeś użyć delete[]
  6. Nie zamykaj pliku - zrobi to destruktor (RAII).
  7. a, b, count powinny być typu całkowitego

Przykład:

#include <cstddef>
#include <iostream>
#include <fstream>
#include <vector>

struct rect
{
	unsigned a;
	unsigned b;
	void obwod();
	void pole();
};

void rect::obwod()
{
	std::cout << "Obwod: " << 2 * a + 2 * b;
}

void rect::pole()
{
	std::cout << ", pole: " << a * b;
}

int main()
{
	std::ifstream plik("dane.txt");
	if (plik.is_open())
	{
		std::size_t count; 
		plik >> count;

		std::vector<rect> rects(count); // żeby nie używać ciągle delete[]
		for (std::size_t i = 0; i < count; i++)
		{
			plik >> rects[i].a >> rects[i].b;
		}

		for (auto& rect : rects) 
        {
			std::cout << rect.a << " " << rect.b << "\n";
		}
	}
}

Podobne pytania

+1 głos
1 odpowiedź 514 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez reken Początkujący (390 p.)
0 głosów
2 odpowiedzi 900 wizyt
pytanie zadane 14 lipca 2020 w C i C++ przez Kxmil Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 2,478 wizyt
pytanie zadane 31 października 2015 w C i C++ przez radek024 Szeryf (77,160 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...