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

Posted on January 12th, 2021

Nếu như đọc đến bài viết này, nghĩa là bạn đã học qua một lượt hết tất cả những kiến thức cơ bản về ngôn ngữ lập trình C. Nếu có phần nào bạn chưa nắm rõ, thì tốt nhất là hãy quay về những bài học liên quan để xem lại lý thuyết và thực hành, rồi tiếp tục bài viết này sau.

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 motorbike_st: char name[20], char manufacturer[10], char madein[12], long int price

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

Bài 2

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

1. Input data of motorbike 
2. Sort, display details information and statistic of all motorbikes 
3. Find the motorbike of manufacturer 
4. Save to text file motorbike.txt
5. Exit

Bài 3

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

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 motorbike 1:

  • Name: Air Blade
  • Manufacturer: Honda
  • Made In: Viet nam
  • Price: 40000000

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 motorbike_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 motorbikeList.

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 motorbike đã nhập".

Khi người dùng chọn 2, thực hiện việc sắp xếp lại mảng motorbikeList theo thứ tự từ z-a (descending) của manufacturer.

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

No ||Name       ||Manufacturer  ||Made In   ||Price     ||
001||Sirius     ||Yamaha        ||Viet nam  ||28000000  ||
002||Air Blade  ||Honda         ||Viet nam  ||40000000  ||
003||Dyland     ||Honda         ||Thai Lan  ||150000000 ||

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 motorbike_st

Bài 5

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

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

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

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 motorbike_st

Bài 6

Triển khai ý 4 trong menu bài 2: "Lưu thông tin các motorbike ra file text motorbike.txt"

Khi người dùng chọn 4, thực hiện lưu namemanufacturer của mỗi motorbike vào file text motorbike.txt

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 motorbike_st
  • Tạo 1 file motorbike.txt dạng text mode
  • Lưu name, manufactor của mỗi xe 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 <string.h>

// Khai bao struct motobike_st
typedef struct {
	char name[20];
	char manufacturer[10];
	char madein[12];
	long int price;
} motorbike_st;

void inputData(motorbike_st arr[3]) {
	int i;
	for(i = 0; i < 3; i++) {
		printf("\nEnter data of motorbike %d:\n", i + 1);
		printf("+ Name: ");
		gets(arr[i].name);
		printf("+ Manufacturer: ");
		gets(arr[i].manufacturer);
		printf("+ Made in: ");
		gets(arr[i].madein);
		printf("+ Price: ");
		scanf("%ld", &arr[i].price);
		fflush(stdin);
	}
}

void displayRow(motorbike_st arr[3], int index) {
	printf("%03d||", index + 1);
	printf("%-20s||", arr[index].name);
	printf("%-14s||", arr[index].manufacturer);
	printf("%-10s||", arr[index].madein);
	printf("%-10ld||\n", arr[index].price);
}

void sortDisplay(motorbike_st arr[3]) {
	// Sort z-a
	int i, j;
	for (i = 0; i < 2; i++) {
		for (j = i + 1; j < 3; j++) {
			if(strcmp(arr[i].manufacturer, arr[j].manufacturer) < 0) {
				motorbike_st temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

	// Print header
	printf("\n");
	printf("%-3s||", "No");
	printf("%-20s||", "Name");
	printf("%-14s||", "Manufacturer");
	printf("%-10s||", "Made In");
	printf("%-10s||", "Price");
	printf("\n");

	// Print content
	for(i = 0; i < 3; i++) {
		displayRow(arr, i);
	}
}

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

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

void saveToFile(motorbike_st *p) {
	FILE *fp = fopen("motorbike.txt", "w");
	
	int i;
	for (i = 0; i < 3; i++) {
		fprintf(fp, "%s %s\n", (p+i)->name, (p+i)->manufacturer);
	}
	
	fclose(fp);
}

int main() {
	// Khai bao mang struct motobike_st gom 3 phan tu
	motorbike_st motorbikeList[3];
	int entry;

	while(1) {
		// Menu chuong trinh
		printf("\n");
		printf("1. Input data of motorbike \n");
		printf("2. Sort, display details information and statistic of all motorbikes \n");
		printf("3. Find the motorbike of manufacturer \n");
		printf("4. Save to text file motorbike.txt \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(motorbikeList);
		} else if (entry == 2) {
			sortDisplay(motorbikeList);
		} else if (entry == 3) {
			searchDisplay(motorbikeList);
		} else if (entry == 4) {
			saveToFile(motorbikeList);
		} else {
			break;
		}
	}
	
	return 0;
}