[Lập trình C] Bài tập lập trình C 3

Posted on January 14th, 2021

Tiếp tục series để ôn tập và rèn luyện kỹ năng lập trình, bài tập lập trình C 3 giới thiệu với bạn những bài tập lập trình C cơ bản giúp bạn ôn tập toàn bộ kiến thức đã học.

Chú ý: những bài tập sau đây sẽ liên quan đến nhau nên lời giải sẽ đặt chung ở dưới cùng bài viết.

Bài 1

Định nghĩa một cấu trúc như sau:

  • struct book_st: char name[30], char category[30], int price, int year

  • Trong hàm main(), khai báo một mảng gồm 3 phần tử kiểu book_st tên là bookList.

Bài 2

Viết menu chương trình như sau:

1. Input data of book 
2. Sort, display details information and statistic of all books 
3. Find the book of category 
4. Save to binary file book.dat
5. Exit

Bài 3

Triển khai ý 1 trong menu bài 2: "Nhập dữ liệu về book".

Khi người dùng chọn 1, hiển thị ra như sau (với phần ghi đậm là dữ liệu nhập từ bàn phím):

Enter data of book 1:

  • Name: Tham tu lung danh
  • Category: Truyen tranh
  • Price: 50000
  • Year: 2010

Phần này phải được viết trong một hàm với yêu cầu như sau:

  • Có 1 tham số là array của struct book_st
  • Khi thực hiện hàm này xong, thông tin người dùng nhập sẽ được lưu vào mảng bookList.

Bài 4

Triển khai ý 2 trong menu bài 2: "Sắp xếp và hiển thị thông tin của các book đã nhập".

Khi người dùng chọn 2, thực hiện việc sắp xếp lại mảng bookList theo thứ tự từ a-z (ascending) của category. Nếu 2 cuốn sách cùng thể loại thì sắp xếp theo Price tăng dần.

Sau đó hiển thị mảng theo định dạng sau:

No ||Name               ||Category          ||Price  ||Year  ||
001||Than Dieu Dai Hiep ||Truyen Kiem Hiep  ||30000  ||2008  ||
002||Anh Hung Xa Dieu   ||Truyen Kiem Hiep  ||35000  ||2010  ||
003||Tham Tu Lung Danh  ||Truyen Tranh      ||50000  ||2010  ||

Tiếp theo là hiển thị thống kê các cuốn sách theo năm xuất bản như sau:

The year of 2008 has 1 book.
The year of 2010 has 2 books.

Phần này phải được viết trong một hàm với yêu cầu như sau:

  • Có 1 tham số là array của struct book_st

Bài 5

Triển khai ý 3 trong menu bài 2: "Tìm book theo category".

Khi người dùng chọn 3 thì làm như sau:

  • Hiển thị Enter category for search :
  • Sau khi người dùng nhập vào tên một category thì tiến hành tìm kiếm thông tin các book của category tương ứng. Trường hợp không tìm thấy book nào thỏa mãn thì hiển thị: There are no book of this category.

Phần này phải được viết trong một hàm với yêu cầu như sau:

  • Có 1 tham số là array của struct book_st

Bài 6

Triển khai ý 4 trong menu bài 2: "Lưu thông tin các book ra file nhị phân book.dat"

Khi người dùng chọn 4, thực hiện lưu tất cả thông tin của mỗi book vào file text book.dat

Phần này phải được viết trong một hàm với yêu cầu như sau:

  • Có 1 tham số là con trỏ của struct book_st
  • Tạo 1 file book.dat dạng binary mode
  • Lưu tất cả thông tin của mỗi book vào file trên
  • Sau khi lưu xong thì đóng file lại

Bài 7

Triển khai ý 5 trong menu bài 2: "Thoát chương trình"

Khi người dùng chọn 5 thì chương trình kết thúc.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	char name[28];
	char category[25];
	int price;
	int year;
} book_st;

void inputData(book_st arr[3])
{
	int i;
	for(i = 0; i < 3; i++) {
		printf("\nEnter data of book %d:\n", i + 1);
		printf("+ Name: ");
		gets(arr[i].name);
		printf("+ Category: ");
		gets(arr[i].category);
		printf("+ Price: ");
		scanf("%d", &arr[i].price);
		printf("+ Year: ");
		scanf("%d", &arr[i].year);
		fflush(stdin);
	}
}

void displayHeader()
{
	printf("\n");
	printf("%-3s||", "No");
	printf("%-28s||", "Name");
	printf("%-25s||", "Category");
	printf("%-8s||", "Price");
	printf("%-4s||", "Year");
	printf("\n");
}

void displayRow(book_st arr[3], int index)
{
	printf("%03d||", index + 1);
	printf("%-28s||", arr[index].name);
	printf("%-25s||", arr[index].category);
	printf("%-8d||", arr[index].price);
	printf("%-4d||\n", arr[index].year);
}

void swap(book_st *book1, book_st *book2)
{
	book_st temp = *book1;
	*book1 = *book2;
	*book2 = temp;
}

void sortDisplay(book_st arr[3])
{
	// Sort a-z
	int i, j;
	for (i = 0; i < 2; i++) {
		for (j = i + 1; j < 3; j++) {
			if(strcmp(arr[i].category, arr[j].category) > 0) {
				swap(&arr[i], &arr[j]);
			} else if(strcmp(arr[i].category, arr[j].category) == 0) {
				if (arr[i].price > arr[j].price) {
					swap(&arr[i], &arr[j]);
				}
			}
		}
	}

	// Print table
	displayHeader();
	for(i = 0; i < 3; i++) {
		displayRow(arr, i);
	}
	
	// Find min year, max year
	int minYear = arr[0].year, maxYear = arr[0].year;
	for(i = 1; i < 3; i++) {
		if (arr[i].year < minYear) minYear = arr[i].year;
		if (arr[i].year > maxYear) maxYear = arr[i].year;
	}
	// Count statistic
	int* statistic = (int*)calloc(maxYear + 1, sizeof(int));
	for(i = 0; i < 3; i++) {
		int yearValue = arr[i].year;
		statistic[yearValue] += 1;
	}
	// Print statistic
	printf("\n");
	for(i = minYear; i <= maxYear; i++) {
		if (statistic[i] == 1) {
			printf("The year of %d has %d book\n", i, statistic[i]);
		}
		else if (statistic[i] > 1) {
			printf("The year of %d has %d books\n", i, statistic[i]);
		}
	}
	printf("\n");
	free(statistic);
}

void searchDisplay(book_st arr[3])
{
	// Nhap tu ban phim
	char category[10];
	printf("\nEnter category for search : ");
	gets(category);
	printf("\n");

	// Tim kiem
	int i = 0, count = 0;
	for (i = 0; i < 3; i++) {
		if (strcmp(arr[i].category, category) == 0) {
			displayRow(arr, i);
			count++;
		}
	}
	if (count == 0) {
		printf("\nThere are no book of this category\n");
	}
}

void saveToFile(book_st *p)
{
	FILE *fp = fopen("book.dat", "wb");

	int i;
	for (i = 0; i < 3; i++) {
		fwrite(p + i, sizeof(book_st), 1, fp);
	}

	fclose(fp);
}

int main()
{
	book_st bookList[3];
	int entry;

	while(1) {
		// Menu
		printf("\n");
		printf("1. Input data of book\n");
		printf("2. Sort, display details information and statistic of all books\n");
		printf("3. Find the book of category\n");
		printf("4. Save to binary file book.dat\n");
		printf("5. Exit\n");

		// Nhap 1 so tuong ung voi menu:
		printf("\nEnter a number from 1 to 5: ");
		while(1) {
			if(!scanf("%d", &entry) || entry < 1 || entry > 5) {
				fflush(stdin);
				printf("Enter a number from 1 to 5: ");
			} else {
				fflush(stdin);
				break;
			}
		}

		// Xu ly lua chon
		if (entry == 1) {
			inputData(bookList);
		} else if (entry == 2) {
			sortDisplay(bookList);
		} else if (entry == 3) {
			searchDisplay(bookList);
		} else if (entry == 4) {
			saveToFile(bookList);
		} else {
			break;
		}
	}

	return 0;
}