Εγγραφές (Structures)

Ορισμός εγγραφής

struct <όνομα εγγραφής> {
	<τύπος 1ου μέλους> <όνομα 1ου μέλους>;
	<τύπος 2ου μέλους> <όνομα 2ου μέλους>;
	...
	<τύπος Ν - οστού μέλους> <όνομα Ν - οστού μέλους>;
};

Δήλωση μεταβλητών εγγραφής

<όνομα εγγραφής> <Μεταβλητή>

π.χ.

struct product {
	int code, quantity;
	string description;
	double price;
} apple, banana, orange;
 
int main() {<br />    ....
	apple = { 101, 50, "ambrosia", 1.99 };
	banana = { 102, 40, "chiquita", 2.70 };<br />    ....
	return 0;
}

Αναφορά στα μέλη μίας εγγραφής

<όνομα μεταβλητής εγγραφής>.<όνομα μέλους εγγραφής>

Πίνακες εγγραφών

struct product { // Ορισμός εγγραφής product 
	int code, quantity; // Μέλη εγγραφής τύπου integer 
	string description; // Μέλος εγγραφής τύπου string 
	double price; // Μέλος εγγραφής τύπου double 
} fruit[3]; //δέσμευση μνήμης για τρεις εγγραφές τύπου product
 
 
product fruit[3] = { { 101, 50, "ambrosia", 1.99 },
		{ 102, 40, "chiquita", 2.70 },
		{ 103, 60, "clementine", 1.60 } };
 
 
for (int i = 0; i<3; i++) {
	cin >> fruits[i].code >> fruits[i].quantity;
	cin >> fruits[i].description >> fruits[i].price;
}

Ένθετες εγγραφές

Μία εγγραφή μπορεί να χρησιμοποιηθεί ως μέλος άλλης εγγραφής. Η πρόσβαση στα μέλη της ένθετης εγγραφής γίνεται ιεραρχικά, με τη χρήση επιπρόσθετης τελείας.

abc.manager.id = 778899;

Εγγραφές και συναρτήσεις

Οι εγγραφές μπορούν να δοθούν παραμετρικά σε συναρτήσεις όπως και οι μεταβλητές. Μία εγγραφή μπορεί να δοθεί ως παράμετρος αναφοράς, αλλά και ως παράμετρος τιμής.

 

Αναζήτηση και ταξινόμηση εγγραφών

Αναζήτηση

#include <iostream> 
#include <fstream> 
#include <string> 
 
using namespace std;
 
struct school { // Ορισμός εγγραφής school 
	int code;
	string name;
	int tel;
	string city;
};
 
// Συνάρτηση γραμμικής αναζήτησης 
int find_school(school sch[], int key, int N) {
	for (int i = 0; i < N; i++)
		if (key == sch[i].code)
			return i;
	return -1;
}
 
int main() {
	school sch[200]; // Πίνακας 200 εγγραφών 
	int target, cnt = 0;
	ifstream fin("schools.txt"); // Ορισμός αρχείου εισόδου 
	while (!fin.eof()) { // Καταχώριση στοιχείων εγγραφής 
		fin >> sch[cnt].code;
		fin >> sch[cnt].name;
		fin >> sch[cnt].tel;
		fin >> sch[cnt].city;
		cnt++; // Επόμενη εγγραφή 
	}
	cin >> target; // Κωδικός προς αναζήτηση 
	int pos = find_school(sch, target, cnt);
	if (pos == -1) // Το σχολείο δεν βρέθηκε 
		cout << "School not found" << endl;
	else { // Εμφάνιση στοιχείων 
		cout << sch[pos].code << " " << sch[pos].name << " ";
		cout << sch[pos].tel << " " << sch[pos].city << endl;
	}
	fin.close(); // Κλείσιμο αρχείου 
	return 0;
}

Ταξινόμηση

#include <fstream> 
#include <string> 
#include <iomanip> // Για τη χρήση της setw 
#include <cmath> // Για τη χρήση της round 
 
using namespace std;
 
#define N 20 // Σταθερά για το πλήθος των μαθητών 
 
struct student { // Ορισμός εγγραφής student 
	string name;
	int t1;
	int t2;
	int F;
} A3[N]; // Δήλωση πίνακα εγγραφών εκτός της κύριας συνάρτησης<br />
// Συνάρτηση ταξινόμησης εγγραφών με εισαγωγή. Η συνάρτηση δεν έχει παράμετρους αφού ο πίνακας εγγραφών έχει δηλωθεί εκτός της κύριας συνάρτησης και είναι προσβάσιμος από τη συνάρτηση ταξινόμησης
void sort_struct() {
	student temp; // Προσωρινή μεταβλητή τύπου εγγραφής temp 
	int j;
	for (int i = 1; i<N; i++) {
		temp = A3[i];
		j = i - 1;
		while (j >= 0 && A3[j].F<temp.F) {
			A3[j + 1] = A3[j];
			j--;
		}
		A3[j + 1] = temp;
	}
}
 
int main() {
	ifstream fin("students.txt"); // Ορισμός αρχείου εισόδου 
	ofstream fout("results.txt"); // Ορισμός αρχείου εξόδου 
	for (int i = 0; i<N; i++) { // Καταχώριση / Υπολογισμός 
		fin >> A3[i].name >> A3[i].t1 >> A3[i].t2;
		A3[i].F = round((A3[i].t1 + A3[i].t2) / 2.0);
	}
	sort_struct(); // Ταξινόμηση εγγραφών 
	for (int i = 0; i<N; i++) // Εμφάνιση στοιχείων 
		fout << setw(10) << A3[i].name << setw(10) << A3[i].F << endl;
	fin.close(); // Κλέισιμο αρχείων 
	fout.close();
	return 0;
}