DANH SÁCH BÀI VIẾT Giải bài tập thực hành 1 – Các thành phần trong ngôn ngữ C Giải bài tập thực hành 2 – Cấu trúc rẽ nhánh Giải bài tập thực hành 3 – Cấu trúc lặp for Giải bài thực hành 4 – Cấu trúc lặp While, do…while Giải bài thực hành 5 – HÀM Giải bài thực hành 6 – Truyền tham số cho hàm Giải bài thực hành 7 – Mảng Giải bài thực hành 8 – Chuỗi ký tự Giải bài thực hành 9 – Kiểu cấu trúc Giải bài thực hành 10 – Tập tin
Bài thực hành 9 – Kiểu cấu trúc
1. Các bài tập thực hành cơ bản
Bài 2. Cho một lớp học gồm n học sinh (n≤50). Thông tin của một học sinh bao gồm
- Mã số học sinh (MSHS): chuỗi có tối đa 5 ký tự.
- Họ tên (hoten): chuỗi có tối đa 30 ký tự.
- Ngày tháng năm sinh (ngaysinh): kiểu DATE.
- Địa chỉ (diachi): chuỗi có tối đa 50 ký tự.
- Giới tính (gioitinh): chuỗi có tối đa 3 ký tự.
- Điểm trung bình (diemtb): số thực.
. Hãy viết chương trình nhập và xuất danh sách học sinh sau đó đếm xem có bao nhiêu học sinh được lên lớp (Điều kiện được lên lớp là điểm trung bình ≥ 5.0).
Cách làm:
- Trước hết ta phải xây dựng hàm nhập và xuất cho 1 học sinh.
- Xây dựng hàm nhập và xuất ngày tháng năm (Kiểu dữ liệu DATE).
- Sau đó mới xây dựng hàm nhập và xuất cho danh sách học sinh
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
struct DATE{
int ngay;
int thang;
int nam;
};
struct HOCSINH{
char MSHS[5];
char hoten[30];
DATE ngaysinh;
char diachi[50];
char gioiting[3];
float diemtb;
};
void nhap(HOCSINH HS[], int n)
{
printf("\n-----------------NHAP DANH SACH SINH VIEN----------\n");
for(int i = 0;i<n;i++)
{
printf("Nhap Ma so hoc sinh: "); fflush(stdin); gets(HS[i].MSHS);
printf("Nhap Ho ten hoc sinh: "); fflush(stdin); gets(HS[i].hoten);
printf("Nhap ngay thang nam sinh \n Ngay:"); scanf("%d",&HS[i].ngaysinh.ngay );
printf(" Thang:"); scanf("%d",&HS[i].ngaysinh.thang );
printf(" Nam:"); scanf("%d",&HS[i].ngaysinh.nam );
printf("Nhap Dia chi hoc sinh: "); fflush(stdin); gets(HS[i].diachi);
printf("Nhap diem trung binh: "); scanf("%f",&HS[i].diemtb );
printf("\n\n");
}
}
void xuat(HOCSINH HS[], int n)
{
printf("\n-----------------DANH SACH SINH VIEN----------\n");
for(int i = 0;i<n;i++){
printf("%s %s %d/%d/%d %s %f\n",HS[i].MSHS,HS[i].hoten,HS[i].ngaysinh.ngay,HS[i].ngaysinh.thang,HS[i].ngaysinh.nam,HS[i].diachi,HS[i].diemtb );
printf("---------------------------------------------------------------------------\n");
}
}
void trenTrungBinh(HOCSINH HS[], int n)
{
int dem = 0;
for(int i = 0;i<n;i++){
if(HS[i].diemtb >= 5.0)
{
dem++;
}
}
printf("\n So Hoc sinh duoc len lop la: %d", dem);
}
int main()
{
int n;
do{
printf("Nhap so Hoc Sinh: ");
scanf("%d",&n);
}while(n<1 || n>50);
HOCSINH HS[n];
nhap(HS, n);
xuat(HS,n);
trenTrungBinh(HS,n);
}
Bài 3. Cho một mảng các phân số (PHANSO) gồm n phần tử (n≤50). Hãy viết
chương trình nhập và xuất danh sách các phân số sau đó tìm phân số có giá trị lớn
nhất, tổng và tích các phân số và nghịch đảo giá trị các phân số trong mảng.
Cách làm:
- Trước hết ta phải xây dựng hàm nhập và xuất cho 1 phân số.
- Xây dựng hàm tính tổng, hiệu, tích, thương, rút gọn, so sánh và nghịch đảo
cho 2 phân số. - Sau đó mới xây dựng hàm nhập, xuất, tính tổng, tích cho mảng các phân số.
Code mẫu
#include<stdio.h>
#include<string.h>
struct PHANSO{
int tu;
int mau;
};
int UCLN(int a, int b)
{
if(a==0) return b;
UCLN(b%a, a);
}
PHANSO rutGon(PHANSO A)
{
int uc = UCLN(A.tu, A.mau);
A.tu = A.tu/uc;
A.mau = A.mau/uc;
return A;
}
PHANSO nghichDao(PHANSO A)
{
int temp = A.tu;
A.tu = A.mau;
A.mau = temp;
return A;
}
PHANSO tinhTong(PHANSO A, PHANSO B)
{
PHANSO C;
C.tu = A.tu*B.mau + B.tu*A.mau;
C.mau = A.mau * B.mau;
return rutGon(C);
}
PHANSO tinhTich(PHANSO A, PHANSO B)
{
PHANSO C;
C.tu = A.tu*B.tu;
C.mau = A.mau*B.mau;
return rutGon(C);
}
void xuat(PHANSO PS)
{
printf("%d/%d ",PS.tu,PS.mau);
}
void nhapDanhSachPhanSo(PHANSO PS[], int n)
{
printf("\n---------------NHAP MANG PHAN SO----------\n");
for(int i = 0;i<n;i++)
{
printf("Nhap phan so thu %d\n Tu: ", i+1); scanf("%d", &PS[i].tu);
printf(" Mau: ", i+1); scanf("%d", &PS[i].mau);
}
}
void xuatDanhSachPhanSo(PHANSO PS[], int n)
{
printf("\n---------------XUAT MANG PHAN SO----------\n");
for(int i = 0;i<n;i++)
{
xuat(PS[i]);
}
}
void xuatMangPhanSoNghichDao(PHANSO PS[], int n)
{
printf("\n---------------XUAT MANG PHAN SO NGHICH DAO----------\n");
for(int i = 0;i<n;i++)
{
xuat(nghichDao(PS[i]));
}
}
PHANSO tongMangPhanSo(PHANSO PS[], int n)
{
PHANSO tong = PS[0];
for(int i = 1;i<n;i++)
{
tong = tinhTong(tong, PS[i]);
}
return rutGon(tong);
}
PHANSO tichMangPhanSo(PHANSO PS[], int n)
{
PHANSO tich = PS[0];
for(int i = 1;i<n;i++)
{
tich = tinhTich(tich, PS[i]);
}
return rutGon(tich);
}
int main()
{
int n;
do{
printf("Nhap so luong phan so: ");
scanf("%d", &n);
}while(n < 1 || n>50);
PHANSO PS[n];
nhapDanhSachPhanSo(PS, n);
xuatDanhSachPhanSo(PS, n);
printf("\n\n\n Tong mang phan so: "); xuat(tongMangPhanSo(PS,n));
printf("\n Tich mang phan so: "); xuat(tichMangPhanSo(PS,n));
printf("\n\n\n");
xuatMangPhanSoNghichDao(PS,n);
}
Bài 4. Nhập mảng n sinh viên gồm các thông tin: tên, giới tính, điểm toán, điểm lý,
điểm hoá. In danh sách (số thứ tự, tên, tổng điểm) các sinh viên nữ có thi lại theo
thứ tự tăng dần của tổng điểm.
Code mẫu
#include<stdio.h>
#include <conio.h>
struct SINHVIEN{
char ten[50];
bool gioitinh;
float dToan, dLy,dHoa;
float dtb;
};
void nhap(int n, SINHVIEN HS[])
{
printf("\n----------------NHAP DANH SACH SINH VIEN-----------\n");
for(int i = 0;i<n;i++)
{
printf("\nNhap Sinh vien thu %d\n Ten: ", i+1); fflush(stdin); gets(HS[i].ten);
printf(" Gioi tinh(0-nu | 1-nam): ", i+1); int gt = getchar();
if(gt == '0') HS[i].gioitinh = 0;
else HS[i].gioitinh = 1;
printf(" Nhap diem toan: "); scanf("%f",&HS[i].dToan);
printf(" Nhap diem ly:"); scanf("%f",&HS[i].dLy);
printf(" Nhap diem hoa:"); scanf("%f",&HS[i].dHoa);
HS[i].dtb = (HS[i].dToan+HS[i].dLy+HS[i].dHoa)/3;
}
}
void xuat(SINHVIEN HS[], int n)
{
printf("\n----------------XUAT DANH SACH SINH VIEN-----------\n\n");
printf("Ten | Gioi tinh(0-nu|1-nam) | Diem toan | Diem ly | Diem hoa | DTB\n");
printf("--------------------------------------------------------\n");
for(int i = 0;i<n;i++){
printf("%s %d %f %f %f %f\n",HS[i].ten, HS[i].gioitinh,HS[i].dToan,HS[i].dLy,HS[i].dHoa, HS[i].dtb );
printf("--------------------------------------------------------\n");
}
}
void inDanhSachSVNuThiLai(SINHVIEN HS[], int n)
{
int dem = 0;
printf("\n----------------DANH SACH SINH VIEN NU THI LAI(dtb < 4)-----------\n\n");
printf("STT | Ten | DTB\n");
printf("--------------------------------------------------------\n");
for(int i = 0;i<n;i++){
for(int j = i+1;j<n;j++)
{
if(HS[i].dtb > HS[j].dtb)
{
SINHVIEN temp = HS[i];
HS[i] = HS[j];
HS[j] = temp;
}
}
if(HS[i].gioitinh == 0 && HS[i].dtb < 4)
{
dem++;
printf(" %d %s %f\n",dem,HS[i].ten, HS[i].dtb );
printf("--------------------------------------------------------\n");
}
}
}
int main()
{
int n;
do{
printf("Nhap so luong phan so: ");
scanf("%d", &n);
}while(n < 1 || n>100);
SINHVIEN HS[n];
nhap(n,HS);
xuat(HS,n);
inDanhSachSVNuThiLai(HS, n);
}
Bài 5. Nhập mảng n sinh viên gồm các thông tin: tên, giới tính, điểm toán, điểm lý,
điểm hoá. In danh sách (số thứ tự, tên, tổng điểm) các sinh viên không bị thi lại môn
nào theo thứ tự giảm dần của tổng điểm.
Code mẫu
#include<stdio.h>
#include <conio.h>
struct SINHVIEN{
char ten[50];
bool gioitinh;
float dToan, dLy,dHoa;
float dtb;
};
void nhap(int n, SINHVIEN HS[])
{
printf("\n----------------NHAP DANH SACH SINH VIEN-----------\n");
for(int i = 0;i<n;i++)
{
printf("\nNhap Sinh vien thu %d\n Ten: ", i+1); fflush(stdin); gets(HS[i].ten);
printf(" Gioi tinh(0-nu | 1-nam): ", i+1); int gt = getchar();
if(gt == '0') HS[i].gioitinh = 0;
else HS[i].gioitinh = 1;
printf(" Nhap diem toan: "); scanf("%f",&HS[i].dToan);
printf(" Nhap diem ly:"); scanf("%f",&HS[i].dLy);
printf(" Nhap diem hoa:"); scanf("%f",&HS[i].dHoa);
HS[i].dtb = (HS[i].dToan+HS[i].dLy+HS[i].dHoa)/3;
}
}
void xuat(SINHVIEN HS[], int n)
{
printf("\n----------------XUAT DANH SACH SINH VIEN-----------\n\n");
printf("Ten | Gioi tinh(0-nu|1-nam) | Diem toan | Diem ly | Diem hoa | DTB\n");
printf("--------------------------------------------------------\n");
for(int i = 0;i<n;i++){
printf("%s %d %f %f %f %f\n",HS[i].ten, HS[i].gioitinh,HS[i].dToan,HS[i].dLy,HS[i].dHoa, HS[i].dtb );
printf("--------------------------------------------------------\n");
}
}
void inDanhSachSVKhongThiLaiMonNao(SINHVIEN HS[], int n)
{
int dem = 0;
printf("\n----------------DANH SACH SINH VIEN NU THI LAI(dtb < 4)-----------\n\n");
printf("STT | Ten | DTB\n");
printf("--------------------------------------------------------\n");
for(int i = 0;i<n;i++){
for(int j = i+1;j<n;j++)
{
if(HS[i].dtb < HS[j].dtb)
{
SINHVIEN temp = HS[i];
HS[i] = HS[j];
HS[j] = temp;
}
}
if(HS[i].dToan >= 4 && HS[i].dLy >= 4 && HS[i].dHoa >= 4)
{
dem++;
printf(" %d %s %f\n",dem,HS[i].ten, HS[i].dtb );
printf("--------------------------------------------------------\n");
}
}
}
int main()
{
int n;
do{
printf("Nhap so luong phan so: ");
scanf("%d", &n);
}while(n < 1 || n>100);
SINHVIEN HS[n];
nhap(n,HS);
xuat(HS,n);
inDanhSachSVKhongThiLaiMonNao(HS, n);
}
Bài 6. Cho cấu trúc:
struct dienthoai
{
int sdt; //Số điện thoại
char hoten[25]; //Họ và tên81
float sotien; //Số tiền phải nộp
} ThueBao[100];
Hãy xây dựng một hàm để nhập số liệu cho n thuê bao. Sau đó viết một chương
trình sử dụng hàm nói trên để nhập số liệu và in bảng số tiền phải nộp của các thuê
bao theo dạng ba cột: Họ tên, số điện thoại, số tiền phải nộp.
Code mẫu
#include<stdio.h>
#include <conio.h>
struct dienthoai{
int sdt;
char hoten[25];
float sotien;
}ThueBao[100];
void nhap(int n)
{
printf("\n----------------NHAP DANH SACH THUE BAO-----------\n");
for(int i = 0;i<n;i++)
{
printf("\nNhap thue bao thu %d\n std: ", i+1); scanf("%d",&ThueBao[i].sdt);
printf(" Nhap Ho ten: "); fflush(stdin); gets(ThueBao[i].hoten);
printf(" Nhap so tien:"); scanf("%f",&ThueBao[i].sotien);
}
}
void xuat(int n)
{
printf("\n----------------XUAT DANH THUE BAO-----------\n\n");
printf("-------------------------------------------------------\n");
printf("%-25s %-15s %-15s\n","Ten","So dien thoai","So tien nop");
printf("-------------------------------------------------------\n");
for(int i = 0;i<n;i++){
printf("%-25s %-15d %-15f\n",ThueBao[i].hoten,ThueBao[i].sdt,ThueBao[i].sotien);
printf("-------------------------------------------------------\n");
}
}
int main()
{
int n;
do{
printf("Nhap so luong thue bao: ");
scanf("%d", &n);
}while(n < 1 || n>100);
nhap(n);
xuat(n);
}
Bài 9. Nhập 2 số phức a, b từ bàn phím, in ra tổng, hiệu, tích và thương của a và b.
Cấu trúc số phức như sau
struct sophuc
{
float thuc, ao;
}
Code mẫu
#include<stdio.h>
#include <conio.h>
#include <math.h>
struct sophuc
{
float thuc, ao;
};
void nhap(sophuc &a)
{
printf(" Nhap phan thuc: "); scanf("%f", &a.thuc);
printf(" Nhap phan ao: "); scanf("%f", &a.ao);
}
void xuat(sophuc a)
{
printf("%.1f + %.1fi", a.thuc, a.ao);
}
sophuc phepCong(sophuc a, sophuc b)
{
sophuc c;
c.thuc= a.thuc+ b.thuc;
c.ao = a.ao+b.ao;
return c;
}
sophuc phepTru(sophuc a, sophuc b)
{
sophuc c;
c.thuc= a.thuc- b.thuc;
c.ao = a.ao-b.ao;
return c;
return c;
}
sophuc phepNhan(sophuc a, sophuc b)
{
sophuc c;
c.thuc= (a.thuc*b.thuc)-(a.ao*b.ao);
c.ao = (a.thuc*b.ao) + (a.ao*b.thuc);
return c;
}
sophuc phepChia(sophuc a, sophuc b)
{
sophuc c;
float temp = pow(b.thuc,2) + pow(b.ao,2);
c.thuc= ((a.thuc*b.thuc)-(a.ao*b.ao))/temp;
c.ao = ((a.thuc*b.ao) + (a.ao*b.thuc))/temp;
return c;
}
int main()
{
sophuc a, b;
printf("Nhap so phuc a \n");
nhap(a);
printf("\nNhap so phuc b\n");
nhap(b);
printf("\n\nA = "); xuat(a);
printf("\n\nB = "); xuat(b);
printf("\n\nPhep Cong: ");
xuat(phepCong(a,b));
printf("\nPhep Nhan: ");
xuat(phepNhan(a,b));
printf("\nPhep Tru: ");
xuat(phepTru(a,b));
printf("\nPhep Chia: ");
xuat(phepChia(a,b));
}
Bài 10. Viết chương trình khai báo kiểu dữ liệu để biểu diễn một phân số. Hãy viết
hàm thực hiện những công việc sau:
- Tính tổng, hiệu, tích, thương hai phân số.
- Rút gọn phân số.
- Qui đồng hai phân số.
- So sánh hai phân số.
#include<stdio.h>
#include<string.h>
struct PHANSO{
int tu;
int mau;
};
int UCLN(int a, int b)
{
if(a==0) return b;
UCLN(b%a, a);
}
PHANSO rutGon(PHANSO A)
{
int uc = UCLN(A.tu, A.mau);
A.tu = A.tu/uc;
A.mau = A.mau/uc;
return A;
}
PHANSO nghichDao(PHANSO A)
{
int temp = A.tu;
A.tu = A.mau;
A.mau = temp;
return A;
}
void quydong(PHANSO &A, PHANSO &B)
{
int mauA = A.mau, mauB = B.mau;
A.tu = mauB*A.tu;
A.mau = mauB*A.mau;
B.tu = mauA*B.tu;
B.mau = mauA*B.mau;
}
bool soSanh(PHANSO A, PHANSO B){
quydong(A, B);
if(A.tu == B.tu) return 0; // 2 phan so bang nhau tra ve 0
else return A.tu > B.tu ? 1:-1; // A > B tra ve 1, A<B tra ve -1
}
PHANSO tinhTong(PHANSO A, PHANSO B)
{
PHANSO C;
quydong(A,B);
C.tu = A.tu + B.tu;
C.mau = A.mau;
return rutGon(C);
}
PHANSO tinhTich(PHANSO A, PHANSO B)
{
PHANSO C;
C.tu = A.tu*B.tu;
C.mau = A.mau*B.mau;
return rutGon(C);
}
PHANSO tinhHieu(PHANSO A, PHANSO B)
{
PHANSO C;
quydong(A,B);
C.tu = A.tu - B.tu;
C.mau = A.mau;
return rutGon(C);
}
PHANSO tinhThuong(PHANSO A, PHANSO B)
{
B = nghichDao(B);
PHANSO C;
C.tu = A.tu*B.tu;
C.mau = A.mau*B.mau;
return rutGon(C);
}
void xuat(PHANSO PS)
{
printf("%d/%d ",PS.tu,PS.mau);
}
int main()
{
PHANSO A, B;
A.tu = 1; A.mau = 2;
B.tu = 3; B.mau = 8;
printf("\nTong:"); xuat(tinhTong(A,B));
printf("\nTich:"); xuat(tinhTich(A,B));
printf("\nHieu:"); xuat(tinhHieu(A,B));
printf("\nThuong:"); xuat(tinhThuong(A,B));
printf("\nSo sanh: %d", soSanh(A,B));
}