1. 程式人生 > >☆ C/C++中使用結構體陣列->排序(姓名+學號+分數)

☆ C/C++中使用結構體陣列->排序(姓名+學號+分數)

使用單鏈表進行排序見上一篇文章,這兩篇文章相輔相承;

 

傳送門:點我即達(。・ω・。)

 

****************************************************************************************************************************************

 

★首先附上一系列執行結果截圖:

1:學生資訊的初始化

2:排序功能列表 

——使用了system("cls") 和 gotoxy() 等函式;

3:排序介面-姓名

4:排序介面-學號


5:排序介面-分數

 

*檔案會被寫到同級目錄下的這四個檔案中,下面程式碼中也可以分析得出。

 

 

 

★原始碼:

 由於程式碼基於某些要求進行編寫,可能有些複雜,但是基本原理仍然未變,只是多了些表示方法;

// 學生排序(函式作為引數傳入).cpp : 定義控制檯應用程式的入口點。
// 需要使用檔案進行輸出
// 要求函式結構void student_sort(STUDENT *pStu, int n, int(*pFunc)(STUDENT &, STUDENT &));

#include <string.h>
#include <iostream>

//檔案的操作
#include <fstream>

//呼叫Sleep()/system()函式
#include <windows.h>

using namespace std;

typedef struct stu
{
	char name[20];
	int id;
	float score;
}STUDENT;

STUDENT * Init_Stu( int number)
{
	ofstream out("學生資訊.txt");
	out << "姓名  學號  分數\n";
	STUDENT *pStu = (STUDENT *)malloc(sizeof(STUDENT) * number);    //開闢number個空間
	cout << "Please Enter the stu'infomation: " << endl;
	cout << "姓名  學號  分數" << endl;;
	for (int i = 0; i < number; i++)
	{
		cin >> (pStu + i)->name;
		cin >> (pStu + i)->id;
		cin >> (pStu + i)->score;
	}
	cout << "\n開始寫入檔案" << endl;
	for (int i = 0; i < number; i++)
	{
		out << (pStu + i)->name << "  ";
		out << (pStu + i)->id << "  ";
		out << (pStu + i)->score << "\n";
	}
	out.close();
	cout << "……" << endl; Sleep(1000);
	cout << "……" << endl; Sleep(1000);
	cout << "檔案成功寫入!" << endl;
	cout << "檔名為“Student_by_name.txt”" << endl << endl;
	system("pause");
	return pStu;
}

int pFunc_name(STUDENT *x, STUDENT *y)
{
	if (strcmp(x->name, y->name) < 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
int pFunc_id(STUDENT *x, STUDENT *y)
{
	if (x->id > y->id)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int pFunc_score(STUDENT *x, STUDENT *y)
{
	if (x->score > y->score)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

void gotoxy(short x, short y)     //自定義游標定位
{
	COORD pos = {x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

void student_sort_name(STUDENT *pStu, int n, int (*pFunc)(STUDENT *x, STUDENT *y))
{
	STUDENT *p;
	p = pStu;
	STUDENT *temp;
	temp = (STUDENT*)malloc(sizeof(STUDENT));
	int k,j;    //迴圈使用
	for (int i = 1; i < n; i++)
	{
		p = pStu;
		for (j = n - 1, k = 0; j >= i; j--,k++)
		{
			if (pFunc_name((p+k), (p + k+1)))
			{
				strcpy(temp->name, (p + k)->name);
				strcpy((p + k)->name, (p + k+1)->name);
				strcpy((p + k + 1)->name,temp->name);
				p = pStu;
				temp->id = (p + k)->id;
				(p + k)->id = (p + k + 1)->id;
				(p + k + 1)->id = temp->id;
				p = pStu;
				temp->score = (p + k)->score;
				(p + k)->score = (p + k + 1)->score;
				(p + k + 1)->score = temp->score;
			}
		}
	}
	cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_name.txt”)" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << (pStu + i)->name << "  ";
		cout << (pStu + i)->id << "  ";
		cout << (pStu + i)->score << "\n";
	}
	cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl;
	if (getchar() == 'y')
	{
		ofstream out("Student_by_name.txt");
		cout << "\n開始寫入檔案" << endl;
		for (int i = 0; i < n; i++)
		{
			out << (pStu + i)->name << "  ";
			out << (pStu + i)->id << "  ";
			out << (pStu + i)->score << "\n";
		}
		out.close();
		cout << "……" << endl; Sleep(1000);
		cout << "……" << endl; Sleep(1000);
		cout << "檔案成功寫入!" << endl << endl;
	}
	else
	{
		cout << "感謝使用,Bye~" << endl;
	}
}

void student_sort_id(STUDENT *pStu, int n, int(*pFunc)(STUDENT *x, STUDENT *y))
{
	STUDENT *p;
	p = pStu;
	STUDENT *temp;
	temp = (STUDENT*)malloc(sizeof(STUDENT));
	int k, j;    //迴圈使用
	for (int i = 1; i < n; i++)
	{
		p = pStu;
		for (j = n - 1, k = 0; j >= i; j--, k++)
		{
			if (pFunc_id((p + k), (p + k + 1)))
			{
				strcpy(temp->name, (p + k)->name);
				strcpy((p + k)->name, (p + k + 1)->name);
				strcpy((p + k + 1)->name, temp->name);
				p = pStu;
				temp->id = (p + k)->id;
				(p + k)->id = (p + k + 1)->id;
				(p + k + 1)->id = temp->id;
				p = pStu;
				temp->score = (p + k)->score;
				(p + k)->score = (p + k + 1)->score;
				(p + k + 1)->score = temp->score;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		cout << (pStu + i)->name << "  ";
		cout << (pStu + i)->id << "  ";
		cout << (pStu + i)->score << "\n";
	}
	cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl;
	if (getchar() == 'y')
	{
		ofstream out ("Student_by_sno.txt");
		cout << "\n開始寫入檔案" << endl;
		for (int i = 0; i < n; i++)
		{
			out << (pStu + i)->name << "  ";
			out << (pStu + i)->id << "  ";
			out << (pStu + i)->score << "\n";
		}
		out.close();
		cout << "……" << endl; Sleep(1000);
		cout << "……" << endl; Sleep(1000);
		cout << "檔案成功寫入!" << endl << endl;
	}
	else
	{
		cout << "感謝使用,Bye~" << endl;
	}
}

void student_sort_score(STUDENT *pStu, int n, int(*pFunc)(STUDENT *x, STUDENT *y))
{
	STUDENT *p;
	p = pStu;
	STUDENT *temp;
	temp = (STUDENT*)malloc(sizeof(STUDENT));
	int k, j;    //迴圈使用
	for (int i = 1; i < n; i++)
	{
		p = pStu;
		for (j = n - 1, k = 0; j >= i; j--, k++)
		{
			if (pFunc_score((p + k), (p + k + 1)))
			{
				strcpy(temp->name, (p + k)->name);
				strcpy((p + k)->name, (p + k + 1)->name);
				strcpy((p + k + 1)->name, temp->name);
				p = pStu;
				temp->id = (p + k)->id;
				(p + k)->id = (p + k + 1)->id;
				(p + k + 1)->id = temp->id;
				p = pStu;
				temp->score = (p + k)->score;
				(p + k)->score = (p + k + 1)->score;
				(p + k + 1)->score = temp->score;
			}
		}
	}
	cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_score.txt”)" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << (pStu + i)->name << "  ";
		cout << (pStu + i)->id << "  ";
		cout << (pStu + i)->score << "\n";
	}
	cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl;
	if (getchar() == 'y')
	{
		ofstream out("Student_by_score.txt");
		cout << "\n開始寫入檔案" << endl;
		for (int i = 0; i < n; i++)
		{
			out << (pStu + i)->name << "  ";
			out << (pStu + i)->id << "  ";
			out << (pStu + i)->score << "\n";
		}
		out.close();
		cout << "……" << endl; Sleep(1000);
		cout << "……" << endl; Sleep(1000);
		cout << "檔案成功寫入!" << endl << endl;
	}
	else
	{
		cout << "感謝使用,Bye~" << endl;
	}
}

void run(STUDENT *pStu,int number)
{
	system("title 學生資訊排序");
	gotoxy(35, 2); cout << "★功能列表★";
	gotoxy(30, 3); cout << "1: 按照學生姓名排序";
	gotoxy(30, 4); cout << "2:按照學生學號排序";
	gotoxy(30, 5); cout << "3:按照學生分數排序";

	gotoxy(0, 12);
	int choice = 0;
	cout << "★請輸入您要執行的功能:";
	cin >> choice;
	getchar();    //吸收回車
	switch (choice)
	{
	case 1:
		student_sort_name(pStu, number, pFunc_name);
		break;
	case 2:
		student_sort_id(pStu, number, pFunc_id);
		break;
	case 3:
		student_sort_score(pStu, number, pFunc_score);
		break;
	default:
		cout << "選擇失敗,感謝使用,再見!" << endl << endl;
	}
}

int main()
{
	cout << "***學生資訊的初始化***" << endl;
	STUDENT * pStu;
	int number;
	cout << "How many people? " << endl;
	cin >> number;
	pStu = Init_Stu(number);
	system("cls");
	run(pStu,number);
	return 0;
}

*附加:

其實上面的執行結果排序的那幾張圖片還是有一些問題的,細心觀察就會發現,好好我及時發現了這些問題,並在程式碼中進行了相應的修改。

問題來源:

交換的只是結構體中指定的兩個資料,而不能保證在該結構體的其他資料一併交換,故我在每一段交換的程式碼中將其他資料也一併進行了交換。

(執行結果圖片並未做修改~)

 

 

 

 

 

☆僅僅記錄日常編寫程式碼 與 疑問(`・ω・´)

 

****************************************************************************************************************************************

 

             最快的腳步不是跨越,而是繼續,最慢的步伐不是小步,而是徘徊。

 

****************************************************************************************************************************************