• 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.

VPS Starter Arubacloud
0 głosów
930 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,020 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ź 291 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez reken Początkujący (390 p.)
0 głosów
2 odpowiedzi 554 wizyt
pytanie zadane 14 lipca 2020 w C i C++ przez Kxmil Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 2,028 wizyt
pytanie zadane 31 października 2015 w C i C++ przez radek024 Szeryf (77,160 p.)

92,975 zapytań

141,938 odpowiedzi

321,181 komentarzy

62,302 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...