Książka telefoniczna - kilka problemów

0

Witam, dopadło mnie zaliczenie z programowania i muszę napisać książkę telefoniczną na min. 50 abonentów (przekroczenie liczby tej musi zostać zgłoszone). Musi zapisywać i odczytywać z pliku i sortować dowolnym algorytmem sortowania. Wiedzę mam dosyć podstawową i mam kilka problemów:

  1. Jak ustawić limit abonentów domyślnie (50) i go edytować?
  2. Jak można posortować takie coś po danym elemencie struktury?
  3. Jak zrobić żeby program odczytywał i przypisywał z pliku poszczególne elementy abonenta poszczególnym elementom struktur?

Co udało mi się nasmarować:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<conio.h>

using namespace std;
struct ksiazka
{
	int lp;
	string imie;
	string nazwisko;
	string numer;
	ksiazka* next;
};
ksiazka* poczatek = NULL;

void dodaj_abonenta()
{
	cout << endl;
	ksiazka* nowa = new ksiazka;
	nowa->next = NULL;
	cout << "Lp: \t";
	cin >> nowa->lp;
	cout << "Podaj imię: \t";
	cin >> nowa->imie;
	cout << "Nazwisko: \t";
	cin >> nowa->nazwisko;
	cout << "Numer telefonu \t";
	cin >> nowa->numer;

	if (poczatek == NULL)
	{
		poczatek = nowa;
	}
	else
	{
		ksiazka* szukaj = poczatek;
		while (szukaj->next != NULL)
		{
			szukaj = szukaj->next;
		}
		szukaj->next = nowa;
	}
	cout << endl;
}
void wczytaj()
{
	cout << endl;
	if (poczatek != NULL)
	{
		ksiazka* pokaz = poczatek;
		while (pokaz->next != NULL)
		{
			cout << pokaz->imie << " ";
			cout << pokaz->nazwisko << " ";
			cout << pokaz->numer << " ";
		     pokaz = pokaz->next;
		}
		cout << pokaz->imie << " ";
		cout << pokaz->nazwisko << " ";
		cout << pokaz->numer << "\n\n";
	}
}

void sortuj()
{
	cout << "1. Po nazwisku" << "\n":
	cout << "2. Po imieniu" MM "\n";
	char o;
	o = _getch();
	switch (o)
	case '1':
		po_nazwisku();
	case '2':
		po_imieniu();

}
void po_nazwisku()
{

}
void po_imieniu()
{

}
void ustaw_limit()
{

}

int main()
{
	setlocale(LC_ALL, "pl_PL");
	for (;;)
	{

		int O;
		cout << "Książka telefoniczna" << "\n";
		cout << "Menu główne:" << "\n";
		cout << "1. Dodaj nowego abonenta" << "\n";
		cout << "2. Wczytaj numery na ekran" << "\n";
		cout << "3. Sortuj" << "\n";
		cout << "4. Ustaw limit abonentów (domyślnie 50)" << "\n";
		cout << "5. Wyjdź z programu" << "\n";
	
		O = _getch();
		switch (O)
		{
		case '1':
			dodaj_abonenta();
			break;
		case '2':
			wczytaj();
			break;
		case '3':
			sortuj();
			break;
		case '4':
			ustaw_limit();
			break;
		case '5':
			exit(0);
		default:
			cout << "Wybrano niepoprawną opcję" << "\n";


		}
	}

	   system("PAUSE");
}

Napisałem dodawanie i wyświetlanie z pamięci do konsoli, z zapisem do pliku sobie poradzę, gorzej z odczytem, żeby program przekonwertował elementy tekstu z pliku na kolejne elementy struktury.

3

Dlaczego nie użyjesz std::vector, tylko męczysz się z ręczną implementacją listy jednokierunkowej? Ani to wygodniejsze, szczególnie w tym zadaniu, ani szybsze. Wraz z std::sort miałbyś całe zadanie wykonane w 1/3 tego kodu. Potem tylko opakować to w klasę i masz gdzie trzymać ten soft limit.

0

Z wektorów mam wiedzę nijaką, więc spróbowałem na wskaźnikach :( Spróbuję się zatem douczyć o tym i napiszę to jeszcze raz. A jak w klasie zrobić limit i go edytować?

2

Możesz użyć std::vector? To powinno ułatwić rozwiązanie większości twoich problemów

0
Radolini3 napisał(a):

A jak w klasie zrobić limit i go edytować?

Po każdym dodaniu elementu do książki i zmianie limitu porównuj go z rozmiarem kontenera. https://pl.cppreference.com/w/cpp/container/vector/size

0

Dzięki za pomoc. Jeszcze jedno pytanie. Jak mieć znaki polskie diakrytyczne w string? Bo jak zapiszę z tymi znakami imię albo nazwisko wychodzą jakieś znaczki dziwne.

0

No dobra naskrobałem coś wektorami, natrafiłem na problem taki, że przy funkcji zapisującej do pliku zamiast dopisywać kolejny element to dopisuje pierwszy wpisany

#include<fstream>
#include <conio.h>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
using namespace std;
struct ksiazka
{
	int lp;
	string imie;
	string nazwisko;
	string numer;
};
void zapis_do_pliku(vector<ksiazka>tab)
{
	int n = 0;
	fstream file;
	file.open ("Książka_Telefoniczna.txt", ios::out | ios::app);
	
	    file << tab[n].lp << " ";
		file << tab[n].imie << " ";
		file << tab[n].nazwisko << " ";
		file << tab[n].numer << " " << endl;
	file.close();
	n++;
}
void wczytaj_na_ekran(vector<ksiazka>& tab)
 {
	string linia;
	fstream file;

	file.open("Książka_Telefoniczna.txt", ios::in);
	if (file.good() == true)
	{
		while (!file.eof())
		{
			getline(file, linia);
			cout << linia << endl;
		}
		file.close();
	}

}
int main()
{
	int lp;
	string imie, nazwisko, telefon;
	vector <ksiazka>tab;
	setlocale(LC_ALL, "pl_PL");
	for (;;)
	{

		int O;
		cout << "Książka telefoniczna" << "\n";
		cout << "Menu główne:" << "\n";
		cout << "1. Dodaj nowego abonenta" << "\n";
		cout << "2. Wczytaj numery na ekran" << "\n";
		cout << "3. Sortuj" << "\n";
		cout << "4. Ustaw limit abonentów (domyślnie 50)" << "\n";
		cout << "5. Wyjdź z programu" << "\n";
		O = _getch();
		switch(O)
		{
		case '1':
			system("cls");
			for (int n = 0; n < 1; n++)
			{
				cout << "Lp: \t";
				cin >> lp;
				cout << "Imię: \t";
				cin >> imie;
				cout << "Nazwisko: \t";
				cin >> nazwisko;
				cout << "Numer: \t";
				cin >> telefon;	
				ksiazka pozycja = { lp, imie, nazwisko, telefon };
				tab.push_back(pozycja);
				zapis_do_pliku(tab);
			}; break;
		case '2':
			wczytaj_na_ekran(tab);
			break;
		case '3':
			
			break;
		case '4':
		
			break;
		case '5':
			exit(0);
		default:
			cout << "Wybrano niepoprawną opcję" << "\n";
		

		}
	}

	system("PAUSE");
}


1 użytkowników online, w tym zalogowanych: 0, gości: 1