Tài liệu học tập môn Thực tập lập trình cơ bản (Phần 2) - Phùng Thị Thu Hiền

pdf 106 trang Gia Huy 17/05/2022 2760
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu học tập môn Thực tập lập trình cơ bản (Phần 2) - Phùng Thị Thu Hiền", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftai_lieu_hoc_tap_mon_thuc_tap_lap_trinh_co_ban_phan_2_phung.pdf

Nội dung text: Tài liệu học tập môn Thực tập lập trình cơ bản (Phần 2) - Phùng Thị Thu Hiền

  1. LAB 7: BÀI TẬP MẢNG MỘT CHIỀU A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình cơ bản trong C++: + Khai báo mảng + Các thao tác trên mảng + Viết chương trình sử dụng mảng 1 chiều + Phát hiện và sửa lỗi B. NỘI DUNG Mảng một chiều a. Khai báo Có các dạng sau: Dạng 1: Khai báo mảng với số phần tử xác định [số thành phần] ; //không khởi tạo Dạng 2: Vừa khai báo vừa gán giá trị [số thành phần] = { dãy giá trị } ; //có khởi tạo Dạng 3: Khai báo mảng với số phần tử không xác định và gán giá trị [ ] = { dãy giá trị } ; //có khởi tạo b. Truy xuất các phần tử của mảng Các phần tử mảng được đánh số thứ tự bắt đầu từ 0, số thứ tự này gọi là chỉ số mảng. Các phần tử mảng có thể được truy xuất như sau: [chỉ số] C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hành Windows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên thành thạo cách khai báo và định nghĩa mảng một chiều, viết chương trình sử dụng mảng một chiều áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 1. Cho một mảng A gồm 100 phần tử thuộc kiểu thực, hãy xây dựng hàm viết chương trình nhập mảng và xuất mảng. Hướng dẫn: #include 76
  2. #include int main() { float a[100], n, tg; int i, j; cout > n ; for (i=0; i > a[i] ;} // nhap DL for (i=0; i a[j]) { tg = a[i]; a[i] = a[j]; a[j] = tg; } // Doi cho } for (i=0; i #include int main() { float a[100], n, tg; int i, j; 77
  3. cout > n ; for (i=0; i > a[i] ;} // nhap DL for (i=0; i a[j]) { tg = a[i]; a[i] = a[j]; a[j] = tg; } // Doi cho } for (i=0; i #include #include #include int main() { int a[100],i,n,j,tam; cout >n; for(i=0;i<n;i++) {// nhap mang 78
  4. cout >a[i]; } int dem; cout a[j]) { tam=a[i]; a[i]=a[j]; a[j]=tam; } cout<<endl; cout<<"day thu tu duoc sap xep tang dan la:"; for(i=0;i<n;i++)cout<<a[i]<<" "; return 0; } Kết quả chạy chương trình: 79
  5. 4. Viết chương trình nhập vào mảng có n phần tử. Xây dựng hàm đếm các phần tử âm, đếm các phần tử dương có trong mảng. Hướng dẫn: #include #include #define MAX 100 using namespace std; void NhapMang(int a[], int n) { for(int i=0; i > a[i]; } } void MangNgauNhien(int a[], int n) { srand((unsigned)time(NULL)); for(int i=0; i<n; i++) a[i]=rand()%100 - rand()%100; } void XuatMang(int a[], int n) { for(int i=0; i<n; i++) cout<< a[i] <<"\t"; } void DemAmDemDuong90(int a[], int n) { int DemAm=0, DemDuong=0; for(int i=0; i<n; i++) { 80
  6. if(a[i] >n; //NhapMang(a,n); MangNgauNhien(a,n); XuatMang(a,n); DemAmDemDuong90(a,n); cout using namespace std; int mins(int a[],int &n,int &x) { int min=0; 81
  7. for(int i=1;i >n; for(int i=1;i >a[i]; } cout >x; cout<<"Phan tu "<<x<<"trong day o vi tri thu "<<mins(a,n,x); return 0; } Kết quả chạy chương trình: 6. Xây dựng hàm viết chương trình nhập vào mảng A có n phần tử yêu cầu: 82
  8. - Sắp xếp các phần tử của mảng theo thứ tự tăng dần. - Sắp xếp các phần tử của mảng theo thứ tự giảm dần. Hướng dẫn: #include using namespace std; void nhapmang(int a[],int n) { for(int i=1;i >a[i]; } } void giamdan(int a[],int n) { int tam; for(int i=1;i a[j]) { tam=a[i]; a[i]=a[j]; a[j]=tam; } } } void tangdan(int a[],int n) { int tam ; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) 83
  9. if(a[i] >n; nhapmang(a,n); tangdan(a,n); cout<<"Sap xep mang theo thu tu tang dan "<<endl; xuatmang(a,n); cout<<endl; giamdan(a,n); cout<<"Sap xep mang theo thu tu giam dan "<<endl; xuatmang(a,n); return 0; } Kết quả chạy chương trình: 84
  10. 7. Xây dựng các hàm viết chương trình tìm giá trị đầu tiên trong mảng có chữ số đầu tiên là chữ số lẻ. Hướng dẫn: #include #include using namespace std; void NhapMang(int a[], int n) { for (int i = 0; i > a[i]; } } bool check(int n) { n = abs(n); while (n > 9) { n /= 9; } if (n % 2 == 1) return true; return false; } int Fun(int a[], int n) { for (int i = 0; i < n; i++) { 85
  11. if (check(a[i])) return a[i]; } return 0; } int main() { int a[100]; int n; cout > n; NhapMang(a, n); if (Fun(a, n) == 0) cout #include #define max 100 int main() { 86
  12. int i,j,n; float a[max],tbc,pmax,pmin; clrscr(); cout >n; cout >a[i]; } pmax=pmin=tbc=a[0]; for(i=1;i a[i])pmin=a[i]; } tbc=tbc/n; cout TBC:\n"; for (i=0;i tbc) cout 87
  13. #include #define max 100 void nhap(int[],int); void sapxep(int[],int); void xuat(int[],int); int main() { int a[max],n; cout >n; nhap(a,n); cout >a[i]; } } void xuat(int a[],int n) { int i,j; for (i=0;i<n;i++) cout<<a[i]<<" "; } void sapxep(int a[],int n) { int i,j,tg; 88
  14. for (i=0;i a[j]) { tg=a[i]; a[i]=a[j]; a[j]=tg; } } Kết quả chạy chương trình: 10. Viết chương trình nhập vào mảng A có n phần tử sắp xếp các phần tử của mảng theo thứ tự tăng dần (sử dụng hàm). Hướng dẫn: #include using namespace std; #define MAX 100 void Nhap_Mang(int A[],int n) { for(int i=0;i >A[i]; } } void Xuat_Mang(int A[],int n) { for(int i=0;i<n;i++) cout<<A[i]<<" "; 89
  15. } void Xap_Xep(int A[],int n) { bool kt=false; while(kt==false) { for(int i=0;i A[i+1]) { int y=A[i]; A[i]=A[i+1]; A[i+1]=y; } } kt=true; for(int i=0;i A[i+1]) { kt=false; break; } } } int main() { int A[MAX]; int n; cout >n; Nhap_Mang(A,n); Xap_Xep(A,n); Xuat_Mang(A,n); 90
  16. system("pause"); return 0; } Kết quả chạy chương trình: 11. Viết chương trình nhập vào một dãy số. In ra màn hình tổng các số chia hết cho 3. Hướng dẫn: #include #include using namespace std; int main() { int a[50],n,i,tong=0; cout >n; for(i=0;i >a[i]; } for(i=0;i<n;i++) { if(a[i]%3==0) tong+=a[i]; } cout<<"Day so ban nhap la:"; for(i=0;i<n;i++) cout<<a[i]<<" , "; 91
  17. cout using namespace std; int main() { int n; int s=0; int dem=0; int tam; int a[100]; cout >n; for (int i=1;i >a[i]; } for(int i=1;i<=n;i++) { if(a[i]%n!=0) { 92
  18. s=s+a[i];dem++; } } cout using namespace std; #define MAX 100 93
  19. void Nhap_Mang(int a[],int n) { for(int i=0;i >a[i]; } } void Xuat_Mang(int a[],int n) { for(int i=0;i<n;i++) { cout<<a[i]<<" "; } } int Tinh_Tong(int a[],int n) { int S=0; for(int i=0;i<n;i++) { S+=a[i]; } return S; } int Tinh_Tong_Chan(int a[],int n) { int S=0; for(int i=0;i<n;i++) if(a[i]%2==0) S+=a[i]; return S; } int Tinh_Tong_Le(int a[],int n) 94
  20. { int S=0; for(int i=0;i >n; Nhap_Mang(a,n); Xuat_Mang(a,n); cout<<"\nTong day la S ="<<Tinh_Tong(a,n); cout<<"\nTrung binh TB= "<<Tinh_Tong(a,n)*1.0/n; cout<<"\nTong Chan la S1= "<<Tinh_Tong_Chan(a,n); cout<<"\nTong Le la S2= "<<Tinh_Tong_Le(a,n); system("pause"); return 0; } Kết quả chạy chương trình: 14. Dùng hàm viết chương trình nhập vào mảng A có n phần tử yêu cầu: - Tính tổng các phần tử trong mảng. 95
  21. - Tính tổng các phần tử dương trong mảng. - Tính tổng các phần tử âm trong mảng. - Tính tổng các phần tử ở vị trí chẵn trong mảng. - Tính tổng các phần tử ở vị trí lẻ trong mảng. Hướng dẫn: #include #include using namespace std; void nhapmang(int a[],int n) { for(int i=1;i >a[i]; } } int tongday(int a[],int n) { int s=0; for(int i=1;i<=n;i++) { s=s+a[i]; } return s; } int tongsoam(int a[],int n) { int k=0; for(int i=1;i<=n;i++) { if(a[i]<0) { k=k+a[i]; 96
  22. } } return k; } int tongsoduong(int a[],int n) { int p=0; for(int i=1;i 0) { p=p+a[i]; } } return p; } int tongcacvitrichan(int a[],int n) { int tc=0; for(int i=1;i<=n;i++) { if(i%2==0) { tc=tc+a[i]; } } return tc; } int tongcacvitrile(int a[],int n) { int tl=0; for(int i=1;i<=n;i++) { 97
  23. if(i%2!=0) { tl=tl+a[i]; } } return tl; } int main() { int n;int k;int mins=99999;int t; int a[100]; cout >n; nhapmang(a,n); cout<<"Tong day la:"<<tongday(a,n)<<endl; cout<<"Tong so am la:"<<tongsoam(a,n)<<endl; cout<<"Tong so duong la:"<<tongsoduong(a,n)<<endl; cout<<"Tong cac vi tri chan la:"<<tongcacvitrichan(a,n)<<endl; cout<<"Tong cac vi tri le la "<<tongcacvitrile(a,n)<<endl; k=(tongday(a,n))/n; for(int i=1;i<=n;i++) { if(fabs(k-a[i])<mins) { mins=fabs(k-a[i]); t=a[i]; } } cout<<"Phan tu gan so trung binh nhat la "<<t; return 0; } Kết quả chạy chương trình: 98
  24. F. BÀI TẬP THỰC HÀNH TRÊN PHÒNG MÁY 1. Viết chương trình nhập n số và in ra theo thứ tự ngược lại. Ví dụ nhập 3, 5, 7 thì in ra 7, 5, 3. 2. Viết chương trình nhập dãy n số và in ra tổng các số lẻ trong dãy số vừa nhập. 3. Viết chương trình nhập n số, xoá số thứ k trong n số vừa nhập. In ra n-1 số còn lại. 4. Viết chương trình cho phép nhập một dãy gồm n số nguyên. Nhập thêm một số và chèn thêm vào dãy sau phần tử k. 5. Viết chương trình nhập một dãy n số nguyên (n: hằng số). In ra màn hình các giá trị khác nhau của dãy số này. Ví dụ: - Nhập vào 5 20 15 5 20 17 - In ra: 5 20 15 17 6. Cho một dãy gồm n số nguyên dương có 3 chữ số, hãy sắp xếp dãy theo thứ tự tăng dần của chữ số hàng đơn vị; hàng đơn vị bằng nhau thì sắp xếp theo thứ tự tăng dần của hàng chục; hàng đơn vị và hàng chục bằng nhau thì sắp theo thứ tự tăng dần của hàng trăm. 7. Cho 2 mảng A, B đã được sắp xếp theo thứ tự tăng dần. Hãy trộn hai mảng đó lại với nhau để có mảng thứ 3 là mảng C với điều kiện mảng C cũng được sắp xếp theo thứ tự tăng dần ngay sau khi trộn. 8. Cho dãy đã được sắp tăng dần. Chèn thêm vào dãy phần tử x sao cho dãy vẫn sắp xếp tăng dần. 9. Viết chương trình nhập ma trận A và in ra ma trận đối xứng của nó. 10. Viết chương trình cho phép nhập n số và cho biết số nhỏ nhất trong các số vừa nhập là số thứ mấy. 11. Viết chương trình in ra màn hình tam giác. Ví dụ, với n=4 sẽ in ra hình sau: 1 1 1 2 1 1 3 3 1 1 4 6 4 1 99
  25. LAB 8: BÀI TẬP MẢNG HAI CHIỀU A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình cơ bản trong C++: + Khai báo mảng + Các thao tác trên mảng + Viết chương trình sử dụng mảng 2 chiều + Phát hiện và sửa lỗi B. NỘI DUNG a. Khai báo [ ] [ ]; b. Truy xuất các phần tử của mảng 2 chiều Các phần tử mảng có thể được truy xuất như sau: Tênmảng[chỉ_số_hàng][chỉ_số_cột] C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hành Windows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên thành thạo cách khai báo và định nghĩa mảng hai chiều, viết chương trình sử dụng mảng hai chiều áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 1. Viết chương trình nhập một ma trận vuông 4x4, tính tổng các phần tử trên đường chéo và sau đó in kết quả. Hướng dẫn: #include #include #include using namespace std; int main() { int x, y; int A[4][4],sum=0; //doc ma tran. 100
  26. cout >A[x][y]; } //Tinh tong duong cheo. for(x=0;x<4;x++) for(int y=0;y<4;y++) {if(x==y) sum+=A[x][y]; else if(y==4-(1+1)); sum+=A[x][y]; } cout << "Tong cua mot trong hai duong cheo la : " << sum; return 0; } Kết quả chạy chương trình: 2. Viết chương trình nhập và hiển thị một ma trận có kích thước là 5x5, trong đó: các phần tử trên đường chéo được điền giá trị 0, các phần tử của tam giác dưới đường chéo được điền các giá trị -1, và ở tam giác trên là được điền với các giá trị 1. Hướng dẫn: 101
  27. #include #include #include using namespace std; int main() { int matrix[5][5]; int i,j; for(i=0;i thi dien 0 else if(i>j) matrix[i][j]=-1; //neu hang>cot=> thi dien -1 else matrix[i][j]=1; //neu hang thì dien 1 } for(i=0;i 102
  28. #include #include using namespace std; int main() { int A[10][10],m,n,x,y,sum=0; //Tao mot ma tran A cout >n>>m; cout >A[x][y]; //Tim tong gia tri cua hang for(x=1;x<n+1;++x) { A[x][m+1]=0; for(y=1;y<m+1;++y) A[x][m+1]=A[x][m+1]+A[x][y]; } //Tim tong gia tri cua cot for(y=1;y<m+1;++y) { A[n+1][y]=0; for(x=1;x<n+1;++x) A[n+1][y]+=A[x][y]; } cout << "\nMa tran A: Tong hang (cot cuoi)" << " va Tong cot (hang cuoi) : \n"; for(x=1;x<n+1;++x) { for(y=1;y<m+2;++y) cout << A[x][y] << " "; cout << "\n"; 103
  29. } //In tong moi hang x=n+1; for(y=1;y<m+1;++y) cout << A[x][y] << " "; cout << "\n"; if(m==n) { for(x=1;x<m+1;x++) for(y=1;y<n+1;y++) if(x==y) sum+=A[x][y]; else if(y==m-(x+1)) sum+=A[x][y]; } cout << "Tong cac phan tu tren duong cheo la : " << sum << endl; return 0; } Kết quả chạy chương trình: 4. Viết chương trình sử dụng mảng hai chiều có kích cỡ là 3x3 để hiển thị một bảng các số như dưới đây: 1 2 3 4 5 6 7 8 9 104
  30. Hướng dẫn: #include #include using namespace std; int main() { int tArr[3][3]; int i,j; for(i=0;i 0 && j==0) tArr[i][j]=tArr[i-1][2]+1; //lay cac gia tri cua o cuoi cung trong hang truoc do else tArr[i][j]=tArr[i][j-1]+1; //dien vao cac o ke tiep } for(i=0;i<3;i++){ //in mang ket qua for(j=0;j<3;j++) cout<<tArr[i][j]<<"\t"; cout<<endl; } return 0; } Kết quả chạy chương trình: 5. Viết chương trình nhập dữ liệu gồm số hàng, số cột và giá trị của mỗi phần tử trong mảng hai chiều sau đó thực hiện xóa một dòng trong mảng 2 chiều. Hướng dẫn: 105
  31. #include #include using namespace std; int main() { int myArr[100][100]; int num_of_row, num_of_col; cout > num_of_row; cout > num_of_col; for (int row = 0; row > myArr[row][col]; } } int removeRow; cout > removeRow; //Overide the next row onto the previous row for (int row = removeRow; row < num_of_row - 1; row++) { for (int col = 0; col < num_of_col; col++) { myArr[row][col] = myArr[row + 1][col]; } } num_of_row ; //output for (int row = 0; row < num_of_row; row++) { for (int col = 0; col < num_of_col; col++) { 106
  32. cout using namespace std; #define MAX 100 int main() { int A[MAX][MAX],B[MAX][MAX]; int n,m; cout<<"Nhap so hang so cot cua mang A,B"; cout<<"\n So hang n= "; 107
  33. cin>>n; cout >m; cout >A[i][j]; } cout >B[i][j]; } cout<<"Mang B vua nhap la:\n"; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cout<<B[i][j]<<" "; cout<<"\n"; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) 108
  34. { A[i][j]+=B[i][j]; } cout using namespace std; 109
  35. #define MAX 100 int main() { int A[MAX][MAX]; int n,m; cout >n; cout >m; cout >A[i][j]; } cout >k; if(k>=n) cout =n); 110
  36. cout using namespace std; #define MAX 100 int main() { int A[MAX][MAX]; int n,m; 111
  37. cout >n; cout >m; for(int i=0;i >A[i][j]; } cout >x; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) if(A[i][j]==x) { cout<<"Vi tri x= "<<x<<" xuat hien lan dau tien la hang thu "<<i+1<<" cot thu "<<j+1; kt=false; break; } } 112
  38. if(kt) cout using namespace std; #define MAX 100 int main() { int A[MAX][MAX]; int n,m; cout >n; cout >m; cout<<"\nNhap mang :\n"; for(int i=0;i<n;i++) 113
  39. for(int j=0;j >A[i][j]; } cout Max) Max=A[i][m-1]; } cout<<"\nMax= "<<Max; cout<<"\nMin= "<<Min; system("pause"); return 0; } Kết quả chạy chương trình: 114
  40. 10. Viết chương trình nhập mảng hai chiều sau đó thực hiện in ra: - Số phần tử dương, và có giá trị chẵn trên từng cột. - Số phần tử dương trên từng hàng. Hướng dẫn: #include using namespace std; #define MAX 100 int main() { int A[MAX][MAX]; int n,m; cout >n; cout >m; cout >A[i][j]; } cout<<"Mang vua nhap la: \n"; for(int i=0;i<n;i++) 115
  41. { for(int j=0;j =0&&A[j][i]%2==0) { cout =0) { cout<<A[i][j]<<" "; } } } system("pause"); return 0; } Kết quả chạy chương trình: 116
  42. 11. Viết chương trình nhập mảng hai chiều, in ra màn hình mảng các phần tử âm và các phần tử dương của mảng. Hướng dẫn: #include using namespace std; #define MAX 100 int main() { int A[MAX][MAX]; int n,m; cout >n; cout >m; for(int i=0;i >A[i][j]; 117
  43. } cout =0) cout<<A[i][j]<<" "; } cout<<"\n"; } cout<<"\nCac phan tu am cua day.\n"; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(A[i][j]<0) cout<<A[i][j]<<" "; } cout<<"\n"; } system("pause"); return 0; } Kết quả chạy chương trình: 118
  44. F. BÀI TẬP THỰC HÀNH TRÊN PHÒNG MÁY 1. Cho một ma trận thực kích thước m*n. Tìm: - Số nhỏ nhất, lớn nhất (kèm chỉ số) của ma trận. - Số nhỏ nhất, lớn nhất (kèm chỉ số) của đường chéo chính của ma trận. 2. Viết chương trình in ra các phần tử nằm phía dưới đường chéo chính của ma trận vuông các số nguyên. 3. Viết chương trình khởi tạo giá trị các phần tử là ngẫu nhiên cho ma trận các số nguyên kích thước m x n. 4. Viết hàm tạo ma trận a các số nguyên gồm 9 dòng 14 cột. Trong đó phần tử a[i][j] = i * j. 5. Viết chương trình nhập mảng a dạng n*n phần tử: xuất các phần tử là số nguyên tố 6. Viết chương trình tìm vị trí phần tử nhỏ nhất trong ma trận các số nguyên. 7. Viết hàm tìm vị trí phần tử chẵn cuối cùng trong ma trận các số nguyên. 8. Viết chương trình nhập 2 ma trận vuông cấp n A và B. Tính A + B, A − B, A * B. 9. Viết chương trình nhập, in và tìm phần tử lớn nhất của một ma trận. 10. Viết chương trình nhập dữ liệu gồm số hàng, số cột và giá trị của mỗi phần tử trong mảng hai chiều sau đó thực hiện xóa một cột trong mảng 2 chiều. 11. Viết chương trình nhập mảng a dạng n*n phần tử: xuất các phần tử là số nguyên tố nhỏ nhất. 12. Viết một chương trình hiển thị một menu cho phép người dùng lựa chọn hoặc xem tất cả bản ghi của sinh viên hoặc chỉ xem các bản ghi của một sinh viên cụ thể bởi lựa 119
  45. chọn id của sinh viên đó. (Sử dụng các mảng hai chiều để lưu trữ các bản ghi liên quan tới sinh viên.) MENU 1. Xem tat ca ban ghi cua sinh vien 2. Xem mot ban ghi cua sinh vien boi ID 3. Hien thi diem thi cuoi ky cao nhat va thap nhat Nhap lua chon cua ban (1-3): 1 120
  46. LAB 9: BÀI TẬP XÂU KÝ TỰ A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình cơ bản trong C++: + Cách khai báo một xâu ký tự + Các thao tác trên xâu ký tự + Viết chương trình sử dụng xâu ký tự + Phát hiện và sửa lỗi B. NỘI DUNG Cách khai báo một xâu ký tự char [độ dài] ; // không khởi tạo char [độ dài] = xâu kí tự ; // có khởi tạo char [] = xâu kí tự ; // có khởi tạo string ; C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hành Windows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên thành thạo cách khai báo một xâu ký tự và các thao tác trên xâu ký tự để áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 1. Cho xâu ký tự S, hãy đếm số lần xuất hiện của các ký tự trong xâu. #include "iostream" #include "string" using namespace std; int main() { string s = ""; int dem[26]; cout<<" nhap xau ky tu: "; getline(cin,s); // khoi gian mang dem for(int i=0; i<26; i++) 121
  47. dem[i]=0; // dem so ky tu trong xau cout =0; i ) s1=s1+s[i]; cout<<" xau dao nguoc: "<<s1<<endl; } 122
  48. Kết quả chạy chương trình: 3. Cho xâu ký tự S1, S2, hãy in ra vị trí xuất hiện sau cùng của xâu S2 trong S1. #include "iostream" #include "string" using namespace std; int main() { string s1, s2; int pos=0; cout<<" nhap xau s1: "; getline(cin, s1); cout<<" nhap xau s2: "; getline(cin,s2); pos=s1.rfind(s2); cout<<" Vi tri xuat hien sau cung cua xau "<<s2 <<" trong xau "<<s1<<" la "<<pos<<endl; } Kết quả chạy chương trình: 4. Cho một xâu ký tự chỉ gồm các ký tự ‘(‘ và ‘)’ hãy kiểm tra xem xâu ký tự đó có là một biểu thức đúng hay không. Biết rằng các biểu thức đúng có dạng sau: (), (biểu thức đúng)(biểu thức đúng), (biểu thức đúng). #include "iostream" #include "string" using namespace std; int main() { string s = ""; int n=0; cout<<" nhap bieu thuc: "; 123
  49. getline(cin,s); for(int i=0; i<s.length(); i++){ if (s[i]=='(') n=n+1; if (s[i]==')') n=n-1; if (n<0) break; } if (n!=0) cout<<" bieu thuc khong dung!"; else cout<<" bieu thuc dung!"; } Kết quả chạy chương trình: 5. Cho hai xâu ký tự S1, S2, hãy kiểm tra xem có thể xóa đi một số các ký tự của xâu S1 thì ta được xâu S2 hay không. #include "iostream" #include "string" using namespace std; int main() { string s1, s2; bool rs= true, found=false; cout<<" nhap xau s1: "; getline(cin, s1); cout<<" nhap xau s2: "; getline(cin, s2); for(int i=0; i<s2.length(); i++) { found=false; for (int j =0; j<s1.length(); j++) if (s2[i]==s1[j]) 124
  50. { found = true; s1.erase(j,1); break; } if (found==false) { rs=false; break; } } if (rs) cout<<"co the xoa mot so ky tu o S1 de thanh s2"<<endl; else cout<<"khong the xoa mot so ky tu o S1 de thanh s2"<<endl; } Kết quả chạy chương trình: 6. Cho họ và tên một sinh viên, hãy trích ra tên của sinh viên đó. Ví dụ: S=”Tran Van Hoa”, in ra màn hình “Ten sinh vien: Hoa”. #include "iostream" #include "string" using namespace std; string TrichTen(string s) { string Ten =""; int pos=s.length(); while (s[pos]!=' ') pos= pos-1; for(int i=pos+1; i<s.length(); i++) Ten=Ten+s[i]; return Ten; } 125
  51. int main() { string HoTen ="" , Ten=""; int pos=0; cout<<" nhap ho ten: "; getline(cin, HoTen); cout<<" Ten : "<<TrichTen(HoTen)<<endl; } Kết quả chạy chương trình: 7. Một xâu ở dạng chuẩn nếu đầu và cuối xâu không có dấu cách, trong xâu không có hai dấu cách liền nhau. Viết chương trình chuẩn hóa một xâu ký tự. #include "iostream" #include "string" using namespace std; string ChuanHoa(string s) { while (s[0]==' ') s.erase(0,1); while (s[s.length()-1]==' ') s.erase(s.length()-1,1); int i=0; while (i<s.length()-1) { if ((s[i]==' ')&&(s[i+1]==' ')) s.erase(i,1); else i=i+1; } return s; } int main() { string s = ""; cout<<" nhap xau ky tu: "; 126
  52. getline(cin,s); cout >k; cout<<" co "<<DemKyTu(s, k)<<" ky tu "<<k<<" trong xau"<<endl; } Kết quả chạy chương trình: 127
  53. 9. Cho một xâu ký tự S, hãy đếm xem trong xâu có bao nhiều từ. #include "iostream" #include "string" using namespace std; string ChuanHoa(string s) { while (s[0]==' ') s.erase(0,1); while (s[s.length()-1]==' ') s.erase(s.length()-1,1); int i=0; while (i<s.length()-1) { if ((s[i]==' ')&&(s[i+1]==' ')) s.erase(i,1); else i=i+1; } return s; } int DemTu(string s) { int dem=0; for (int i=0; i<s.length(); i++) if (s[i]==' ') dem= dem +1; if (dem!=0) dem =dem +1; return dem; } int main() { string s = ""; int dem =0; cout<<" nhap xau ky tu: "; getline(cin,s); 128
  54. s= ChuanHoa(s); cout #include #include using namespace std; int TinhTong(string s) { int n= s.length(); if (n==0) return 0; else { int vt = 0; while ((s[vt]!=' ')&&(vt<n)) vt=vt+1; if ((vt==0)||(vt==n)) return atoi(s.c_str()); else { string tem=""; for(int i=0; i<vt; i++) tem=tem+s[i]; s.erase(0,vt+1); return atoi(tem.c_str())+ TinhTong(s); } } } 129
  55. int main() { string s; cout kq: 2) 6. Nhập một chuỗi bất kì, yêu cầu nhập 1 kí tự muốn xóa. Thực hiện xóa tất cả những kí tự đó trong chuỗi. 7. Cho chuỗi str, nhập vào vị trí vt và số kí tự cần xóa n, hãy xóa n kí tự tính từ vị trí vt trong chuỗi str. 8. Cho một xâu, nhập vào một từ, viết chương trình xoá từ đó trong xâu đã cho. 9. Viết chương trình tìm kiếm xem ký tự nào xuất nhiện nhiều nhất trong chuỗi 10. Nhập 1 chuỗi bất kì, liệt kê xem mỗi ký tự xuất hiện mấy lần. 130
  56. LAB 10: LẬP TRÌNH VỚI CON TRỎ (1,2) A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình với con trỏ trong C++: + Hiểu về toán tử &, toán tử * + Các phép toán với con trỏ + Cấp phát động + Viết chương trình sử dụng con trỏ + Con trỏ mảng, con trỏ xâu + Phát hiện và sửa lỗi B. NỘI DUNG Cú pháp khai báo một con trỏ như sau: * ; Dùng con trỏ để lưu địa chỉ của biến = & ; Phép lấy giá trị của biến do con trỏ trỏđến được * ; C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hành Windows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên sử dụng thành thạo biến con trỏ, con trỏ mảng và con trỏ xâu để áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 1. Viết chương trình thục hiện các công việc sau: - Khai báo một biến nguyên và một biến con trỏ - Lưu trữ địa chỉ của biến nguyên vào biến con trỏ - Hiển thị giá trị của biến nguyên và in địa chỉ được lưu trữ trong biến con trỏ - Truy cập giá trị có sẵn tại địa chỉ của biến con trỏ Hướng dẫn: #include using namespace std; int main() 131
  57. { int a = 15; // khai bao bien nguyen. int *p; // bien con tro p p = &a; // luu tru dia chi cua a vao bien con tro p cout #include using namespace std; int main() 132
  58. { int i, j ; // khai báo 2 biến nguyên i, j int *p, *q ; // khai báo 2 con trỏ nguyên p, q p = &i; // cho p trỏ tới i q = &j; // cho q trỏ tới j cout #include using namespace std; int main() { int a = 20; int b = 15; 133
  59. int *ptr1, *ptr2; ptr1 = &a; ptr2 = &b; int num; num = *ptr1 + *ptr2; cout #include using namespace std; void hoanvi(float x,float y) { float *tg; tg=*x; *x=*y; *y=tg; } int main() { float a,b,*x,*y; cout >a; cout >b; cout<<endl; x=&a; 134
  60. y=&b; cout #include #include using namespace std; void Gptb2(float *a, float *b, float *c) { float delta,x1,x2; delta=pow((*b),2)-4*(*a)*(*c); if(delta<0) cout<<"phuong trinh vo nghiem :"; else if(delta==0) cout<<"phuong trinh co nghiem kep x1=x2="<<-(*b)/(2*(*a)) ; else { cout<<"phuong trinh co 2 nghiem phan biet :"; 135
  61. cout >a>>b>>c; } while(a==0); Gptb2(&a,&b,&c); cout using namespace std; const int MAX = 3; int main() { int A[MAX] = {10, 100, 200}; int *contro[MAX]; 136
  62. for (int i = 0; i #include using namespace std; int main() { int A[5],i; int *p=A; cout >*(p+i); } 137
  63. cout #include using namespace std; int *MaxA(int data[],int n){ int *max=data; int i; for(i=1;i >n; int A[n]; for(i=0;i<n;i++) { 138
  64. cout >A[i]; } p=MaxA(A,n); cout using namespace std; void NhapMang(int *a, int *n) { cout >(*n); for(int i=0; i >a[i]; } } void HienThi(int *a, int n) { for(int i=0; i<n; i++) 139
  65. cout >k; XoaK(a, &n, k); HienThi(a, n); return 0; } Kết quả chạy chương trình: 140
  66. 10. Sử dụng con trỏ trong, viết chương trình nhập 2 chuỗi s1 và s2, sau đó so sánh xem s1 và s2 có giống nhau không. Hướng dẫn: #include using namespace std; int main() { char *s1, *s2; s1 = (char *) calloc( 50, sizeof( char )); s2 = (char *) calloc( 50, sizeof( char )); cout<<" nhap xau thu nhat: "; cin.getline(s1,50); cout<<" nhap xau thu hai: "; cin.getline(s2,50); if (strcmp(s1,s2)==0) cout<<"hai xau giong nhau "<<endl; else cout<<" hai xau khac nhau "<<endl; return 0; } Kết quả chạy chương trình: F. BÀI TẬP THỰC HÀNH TRÊN PHÒNG MÁY 1. Hãy viết đoạn chương trình để khai báo biến số nguyên a và xuất ra địa chỉ ô nhớ được cấp phát cho biến này khi chương trình chạy. 2. Sử dụng biến con trỏ viết chương trình nhập vào 3 số nguyên a,b,c và tìm số lớn nhất trong 3 số nguyên vừa nhập. 3. Hãy khai báo biến con trỏ p các số nguyên và viết lệnh cấp phát không gian bộ nhớ để biến con trỏ p có thể chứa 100 số nguyên. Sau đó viết lệnh thu hồi lại không gian bộ nhớ đã cấp phát cho con trỏ. 4. Viết chương trình để giải phương trình bậc nhất có sử dụng biến con trỏ. 141
  67. 5. Viết chương trình tính giai thừa của một số có sử dụng biến con trỏ. 6. Khởi tạo mảng và nhập danh sách tên người và sử dụng con trỏ để trỏ tới vị trí thứ n thì sẽ ra tên người đó. 7. Sử dụng con trỏ viết chương trình nhập một dãy số từ bàn phím và đếm xem trong dãy có bao nhiêu số chẵn. 8. Sử dụng con trỏ viết chương trình nhập một dãy số từ bàn phím và đếm xem trong dãy có bao nhiêu số nguyên tố. 9. Sử dụng con trỏ viết chương trình nhập một xâu ký tự từ bàn phím và thực hiện chuẩn hóa xâu ký tự vừa nhập. 10. Sử dụng con trỏ viết chương trình nhập một xâu ký tự từ bàn phím và thực hiện đếm xem trong xâu có bao nhiêu từ. 142
  68. LAB 11: LẬP TRÌNH VỚI BIẾN CẤU TRÚC (1,2) A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình cơ bản trong C++: + Khai báo và định nghĩa cấu trúc + Từ khoá typedef + Viết chương trình sử dụng cấu trúc + Phát hiện và sửa lỗi B. NỘI DUNG 1. Khai báo cấu trúc struct { ; ; ; }; 2. Đặt tên kiểu dữ liệu bằng typedef typedef struct { ; ; ; } ; C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hành Windows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên thành thạo cách khai báo và định nghĩa kiểu dữ liệu cấu trúc, viết chương trình sử dụng kiểu dữ liệu cấu trúc áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 143
  69. 1. Viết chương trình tạo một cấu trúc kiểu sản phẩm gồm các trường: mã sản phẩm, tên sản phẩm, đơn giá sản phẩm. In ra màn hình danh sách sản phẩm vừa nhập,và danh sách những mặt hàng có giá bán using namespace std; struct sanpham { char MsSP[50]; char tenSP[20]; int dongiaSP; }; int main() { sanpham sp[10]; int n,i; cout >n; for(i=0;i >(sp[i].dongiaSP); } cout<<"\n\n Danh sach san pham vua nhap la: \n\n"; for (i=0;i<n;i++) { cout<<sp[i].MsSP<<"\t"<<sp[i].tenSP<<"\t"<<sp[i].dongiaSP<<"\n"; } cout<<"\n Danh sach mat hang co gia ban <20000 la: \n"; for(i=0;i<n;i++) { if (sp[i].dongiaSP<=20000) 144
  70. { cout using namespace std; struct giangvien { char MaGV[50]; char hoten[20]; int somonday; float hocky; }; int main() { 145
  71. giangvien gv[10]; int n,i; cout >n; for(i=0;i >(gv[i].somonday); cout >(gv[i].hocky); } cout =5) { cout<<gv[i].MaGV<<"\t"<<gv[i].hoten<<"\t"<<gv[i].somonday<<"\t"<<gv[i].hocky<<"\n"; } } } Kết quả chạy chương trình: 146
  72. 3. Viết chương trình tạo một cấu trúc kiểu sinh viên gồm các trường: mã sinh viên, họ tên sinh viên, điểm lý thuyết, điểm thực hành. In ra màn hình danh sách sinh viên vừa nhập, và danh sách sinh viên bị trượt lý thuyết (khi điểm lý thuyết using namespace std; struct sinhvien { char MaSV[50]; char hotenSV[50]; int DiemLT; int DiemTH; }; int main() { sinhvien sv[10]; int n,i; cout >n; for(i=0;i<n;i++) 147
  73. { cout >(sv[i].DiemLT); cout >(sv[i].DiemTH); } cout<<"\n\n Danh sach sinh vien vua nhap la: \n\n"; for (i=0;i<n;i++) { cout<<sv[i].MaSV<<"\t"<<sv[i].hotenSV<<"\t"<<sv[i].DiemLT<<"\t"<<sv[i].Diem TH<<"\n"; } cout<<"\n Danh sach sinh vien truot ly thuyet: \n"; for (i=0;i<n;i++) { if (sv[i].DiemLT<=5) { cout<<sv[i].MaSV<<"\t"<<sv[i].hotenSV<<"\t"<<sv[i].DiemLT<<"\t"<<sv[i].Diem TH<<"\n"; } } cout<<"\n Danh sach sinh vien truot thuc hanh: \n"; for (i=0;i<n;i++) { if (sv[i].DiemTH<=5) { cout<<sv[i].MaSV<<"\t"<<sv[i].hotenSV<<"\t"<<sv[i].DiemLT<<"\t"<<sv[i].Diem TH<<"\n"; } } } 148
  74. Kết quả chạy chương trình: 4. Viết chương trình tạo một cấu trúc kiểu hình tròn, nhập vào n hình tròn (n #define PI 3.14 #define MAX 100 using namespace std; struct HinhTron { float r; float s; float p; }; void Nhap(HinhTron &X) { cout >X.r; 149
  75. } void TinhDienTich(HinhTron &X) { X.s=PI*X.r*X.r; } void TinhChuVi(HinhTron &X) { X.p=PI*X.r*2; } void Xuat(HinhTron X) { cout Arr[j].s) Swap(Arr[i],Arr[j]); } } 150
  76. } void XapXepTheoP(HinhTron Arr[],int n) { for(int i=0;i >n; for(int i=0;i<n;i++) { cout<<"\nNhap ban kinh hinh tron thu "<<i+1<<": "; Nhap(Arr[i]); cout<<endl; } for(int i=0;i<n;i++) { TinhDienTich(Arr[i]); TinhChuVi(Arr[i]); } XapXepTheoS(Arr,n); cout<<"\nThu tu cac hinh tron theo S tu thap toi cao la:\n"; for(int i=0;i<n;i++) { cout<<"\nHinh "<<i+1<<":"; 151
  77. Xuat(Arr[i]); cout 152
  78. #include #include using namespace std; struct cuonsach { char masach[5]; char tensach[40]; int sotrang; char tentg[30]; int nam; }; int main() { int n;cuonsach sach[1000]; cout >n; for (int i=1;i >sach[i].sotrang; fflush(stdin); cout >sach[i].nam; } for(int i=1;i<=n;i++) { if(sach[i].masach==" A0001 ") 153
  79. { cout #include using namespace std; struct DIEM { int td; int hd; }; void NhapToaDo(DIEM &d) { cout > d.hd; cout > d.td; 154
  80. } void XuatToaDo(DIEM d) { cout<<"("<<d.hd<<","<<d.td<<")"; } double KhoangCach116(DIEM d1, DIEM d2) { double kc; kc=sqrt(double(d1.hd-d2.hd)*(d1.hd-d2.hd)+(d1.td-d2.td)*(d1.td-d2.td)); return kc; } int main() { DIEM Diem1, Diem2; double KhoangCach; cout<<"Diem A:\n"; NhapToaDo(Diem1); cout<<"\nDiem B: \n"; NhapToaDo(Diem2); cout<<"\nToa do A la: "; XuatToaDo(Diem1); cout<<"\nToa do B la: "; XuatToaDo(Diem2); KhoangCach=KhoangCach116(Diem1,Diem2); cout<<"\nKhoang cach giua diem A va diem B la: "<<KhoangCach; cout<<endl; } Kết quả chạy chương trình: 155
  81. 7. Viết chương trình tạo một cấu trúc biểu diễn thông tin của một phân số gồm các trường: tử số, mẫu số. Tính tổng, tính hiệu, tính tích và tính thương của các phân số. Hướng dẫn: #include using namespace std; struct PHANSO { int TS; int MS; }; void NhapPS(PHANSO &x) { cout >x.TS; do { cout >x.MS; if(x.MS==0) cout<<"Nhap sai, yeu cau nhap lai mau so: "; }while(x.MS==0); } void XuatPS(PHANSO x) { cout<<x.TS<<"/"<<x.MS; } 156
  82. float TongPS(PHANSO x1, PHANSO x2) { int Tu, Mau; Tu = x1.TS*x2.MS + x1.MS*x2.TS; Mau = x1.MS*x2.MS; return (float)Tu/Mau; } float HieuPS(PHANSO x1, PHANSO x2) { int Tu, Mau; Tu = x1.TS*x2.MS - x1.MS*x2.TS; Mau = x1.MS*x2.MS; return (float)Tu/Mau; } float TichPS(PHANSO x1, PHANSO x2) { int Tu, Mau; Tu = x1.TS * x2.TS; Mau = x1.MS * x2.MS; return (float)Tu/Mau; } float ThuongPS(PHANSO x1, PHANSO x2) { int Tu, Mau; Tu = x1.TS * x2.MS; Mau = x1.MS * x2.TS; return (float)Tu/Mau; } int main() { PHANSO ps1, ps2; cout<<"Nhap phan so: "; NhapPS(ps1); 157
  83. NhapPS(ps2); cout using namespace std; struct Thoigian { int gio, phut, giay; }; void NhapTG(Thoigian &t) { do { cout<<"\nNhap vao gio: "; 158
  84. cin>>t.gio; if(t.gio 24) cout 24); do { cout >t.phut; if(t.phut 60) cout 60); do { cout >t.giay; if(t.giay 60) cout 60); } void XuatTG(Thoigian t) { cout<< t.gio << ":" << t.phut << ":" << t.giay; } long DoiThoiGian(Thoigian t) { return (t.gio*3600 + t.phut*60 + t.giay); } int main() { Thoigian t1, t2; cout<<"Nhap thoi gian 1: "; NhapTG(t1); 159
  85. cout kq2) cout<<"\nThoi gian 1 lon hon thoi gian 2!"; else if(kq1<kq2) cout<<"\nThoi gian 1 nho hon thoi gian 2!"; else cout<<"\nHai thoi gian nhap vao banh nhau"; cout<<endl; } Kết quả chạy chương trình: 9. Khai báo cấu trúc biểu diễn thông tin về vận động viên của một đội bóng gồm các trường: mã vận động viên, tên vận động viên, tuổi, vị trí (hậu vệ, tiền đạo .). Viết chương trình thực hiện các công việc sau: - Khai báo dữ liệu kiểu cấu trúc lưu trữ thông tin cho một vận động viên. - Nhập vào từ bàn phím một danh sách các vận động viên của đội bóng. - Tìm và in ra thông tin của các vận động viên ở vị trí Hậu vệ. 160
  86. Hướng dẫn: #include #include using namespace std; struct vandongvien { char hoten[25],vitri[10],mavdv[5]; int tuoi; }; int main() { int n=0; cout >n; vandongvien vdv[100]; for(int i=0;i >vdv[i].tuoi; } cout<<" \n"; cout<<"danh sach hau ve la:"; for( int i=0;i<n;i++) 161
  87. { if(vdv[i].vitri,"tiendao") { cout #include 162
  88. #include #define MAX 100 using namespace std; struct Sinhvien1// { string TenSV; float DiemToan; float DiemLy; float DiemHoa; }; void Nhap(Sinhvien1 &sv) { cout >sv.DiemToan; cout >sv.DiemLy; cout >sv.DiemHoa; } void Xuat(Sinhvien1 sv) { cout<<setw(15)<<sv.TenSV<<setw(15)<<sv.DiemToan<<setw(15)<<sv.DiemLy <<setw(15)<<sv.DiemHoa<<endl; } bool KiemTra(Sinhvien1 Arr[],int index) { for(int i=0;i<index;i++) { if(Arr[i].DiemHoa<5||Arr[i].DiemToan<5||Arr[i].DiemLy<5) { 163
  89. return true; } } return false; } void MENU() { Sinhvien1 Arr[MAX]; int x,index=0,n; do { system("cls"); cout >x; switch (x) { case 1: { system("cls"); cout >n; int dem=0; for(int i=index;i<n+index;i++) { cout<<"\nNhap vao thong tin cua sv thu "<<i+1<<endl; Nhap(Arr[i]); dem++; } 164
  90. index+=dem; cout<<"\nDa nhap xong!"; system("pause"); } break; case 2: { system("cls"); cout<<"\n\t\tDanh Sach sinh vien\n"; cout<<setw(15)<<"Ten SV"<<setw(15)<<"Diem Toan"<<setw(15)<<"Diem Ly"<<setw(15)<<"Diem Hoa"<<endl; for(int i=0;i<index;i++) { Xuat(Arr[i]); } system("pause"); } break; case 3: { system("cls"); if(KiemTra(Arr,index)) { cout<<"\nDanh sach sinh vien phai thi lai la:\n"; cout<<setw(15)<<"Ten SV"<<setw(15)<<"Diem Toan"<<setw(15)<<"Diem Ly"<<setw(15)<<"Diem Hoa"<<endl; for(int i=0;i<index;i++) { if(Arr[i].DiemHoa<5||Arr[i].DiemToan<5||Arr[i].DiemLy<5) { Xuat(Arr[i]); } } 165
  91. } else cout<<"\nKhong co sinh vien nao phai thi lai."; system("pause"); } break; default: break; } } while(x!=4); } int main() { MENU(); system("pause"); return 0; } Kết quả chạy chương trình: F. BÀI TẬP THỰC HÀNH TRÊN PHÒNG MÁY 1. Viết chương trình thực hiện phân tích thống kê một lớp học khoảng 20 sinh viên. Thông tin của mỗi sinh viên bao gồm ID, tên, tuổi, điểm tổng kết học kì 1, điểm tổng kết học kì 2. Những thông tin cần thống kê bao gồm: Điểm trung bình cuối năm của cả lớp. Điểm tổng kết cuối năm của sinh viên nào là cao nhất. 166
  92. Liệt kê danh sách những sinh viên có tiến bộ trong học tập (điểm tổng kết học kì 2 cao hơn điểm tổng kết học kì 1). 2. Viết chương trình tạo struct công nhân gồm các trường: họ tên, năm sinh và giờ làm. - Nhập một số n, tạo và nhập một mảng n công nhân. - Liệt kê tên các công nhân nhận thưởng biết rằng công nhân nhận thưởng là các công nhân có giờ làm > 40 giờ. 3. Để quản lý các hộ dân của một phường, người ta lưu trữ các thông tin sau: mã hộ, tên chủ hộ, số thành viên, mức thu nhập. Viết chương trình thực hiện các công việc sau: - Khai báo dữ liệu kiểu cấu trúc lưu trữ thông tin cho một hộ dân. - Nhập vào từ bàn phím một danh sách các hộ dân - Hiển thị thông tin những hộ dân có số thành viên lớn hơn 5 (với đầy đủ thông tin, dưới dạng bảng). 4. Cho một danh sách n sinh viên. Thông tin về mỗi sinh viên gồm: mã sv, họ tên, năm sinh, điểm trung bình. Viết chương trình thực hiện các công việc sau: - Khai báo dữ liệu kiểu cấu trúc lưu trữ thông tin cho một sinh viên. - Nhập vào từ bàn phím một danh sách sinh viên. - Sắp xếp danh sách sinh viên theo thứ tự giảm dần của tuổi, in ra danh sách sau khi đã sắp xếp (với đầy đủ thông tin dưới dạng bảng). 5. Để quản lý hàng hóa, mỗi một mặt hàng được lưu trữ các thông tin: mã hàng, tên hàng, số lượng, đơn giá. Hãy lập chương trình thực hiện các yêu cầu sau: - Khai báo kiểu dữ liệu cấu trúc lưu trữ thông tin cho một mặt hàng - Nhập vào từ bàn phím một danh sách n mặt hàng - Hiển thị thông tin những mặt hàng có đơn giá lớn hơn 40000. 6. Viết chương trình khai báo kiểu dữ liệu để biểu diễn một điểm trong hệ tọa độ Oxy. Hãy viết hàm thực hiện các công việc sau: - Tìm những điểm đối xứng của nó qua tung độ, hoành độ, toạ độ tâm. - Hãy tính tổng, hiệu, tích của hai điểm trong mặt phẳng toạ độ 0xy. 7. 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: - Rút gọn phân số. - So sánh hai phân số. 167
  93. 8. Để quản lý nhân viên của một cơ quan, người ta lưu trữ các thông tin: mã nhân viên, tên nhân viên, hệ số lương, phụ cấp, tổng lương. Hãy lập chương trình thực hiện các yêu cầu sau: - Khai báo kiểu dữ liệu cấu trúc lưu trữ thông tin cho một nhân viên - Nhập vào từ bàn phím một danh sách n nhân viên - Tính tổng lương cho các nhân viên biết: Tổng lương = hệ số lương*14900 + phụ cấp. 9. Để quản lý các mặt hàng của một siêu thị, mỗi một mặt hàng được lưu trữ các thông tin: mã hàng, tên hàng, số lượng, đơn giá, thành tiền. Hãy lập chương trình thực hiện các yêu cầu sau: - Khai báo kiểu dữ liệu cấu trúc lưu trữ thông tin cho một mặt hàng. - Nhập vào từ bàn phím một danh sách n mặt hàng. - Tính thành tiền cho các mặt hang biết: thành tiền = số lượng * đơn giá. 10. Để quản lý sách trong thư viện, mỗi cuốn sách được lưu trữ các thông tin: mã sách, tên sách, số trang, tên tác giả, năm xuất bản. Hãy lập trình thực hiện các yêu cầu sau: - Khai báo kiểu dữ liệu cấu trúc (struct) lưu trữ thông tin cho một cuốn sách. - Nhập vào từ bàn phím một danh sách n cuốn sách. - Hiển thị thông tin những cuốn sách có Tên tác giả là “Nguyễn Văn Anh” (với đầy đủ thông). 168
  94. LAB 12: LẬP TRÌNH VỚI BIẾN TỆP (1,2) A. MỤC TIÊU Trang bị cho sinh viên ky ̃ năng lập trình cơ bản trong C++: + Đọc tệp văn bản + Ghi tệp văn bản + Đọc tệp nhị phân + Ghi tệp nhị phân + Viết chương trình sử dụng tệp + Phát hiện và sửa lỗi B. NỘI DUNG Các kiến thức cơ bản Mở một File: Đối tượng ofstream hoặc đối tượng fstream có thể được sử dụng để mở một file. Cú pháp hàm open(): void open(const char *ten_file, ios::che_do); Đóng một File: void close(); Con trỏ vị trí File:cả hai đối tượng istream và ostream đều cung cấp các hàm thành viên để xác định lại vị trí của con trỏ vị trí file (file-position pointer). Các hàm thành viên này là seekg (viết tắt của seek get) cho istream và seekp (viết tắt của seek put) cho ostream. Hàm đọc file nhị phân là hai hàm read và write của hai lớp ostream và istream. write (memory_block, size) read (memory_block, size) C. YÊU CẦ U PHẦ N CỨNG, PHẦ N MỀM Máy tính cài hệ điều hànhWindows, RAM tối thiểu 256MB. Phần mềm C FREE 5.0. D. KẾT QUẢ SAU KHI HOÀN THÀNH Sinh viên thành thạo cách khai báo và định nghĩa dữ liệu kiểu tệp, viết chương trình sử dụng dữ liệu kiểu tệp, áp dụng giải các bài tập từ đơn giản đến phức tạp. E. HƯỚNG DẪN CHI TIẾT 1. Viết chương trình đọc một dãy số từ bàn phím và ghi lên file. File được xem như file văn bản (ngầm định), các số được ghi cách nhau 1 dấu cách. 169
  95. Hướng dẫn: #include #include #include int main() { ofstream f; // khai báo (tạo đối tượng f) int x; f.open("DAYSO"); // mở file DAYSO và gán với f) for (int i = 1; i > x; f #include using namespace std; int main() { char data[100]; ofstream outfile; outfile.open("my_documnet.dat"); 170
  96. cout > data; cin.ignore(); outfile > data; // ghi du lieu tren man hinh. cout > data; cout << data << endl; // dong file da mo. infile.close(); return 0; } Kết quả chạy chương trình: 171
  97. 3. Viết chương trình kiểm tra sự tồn tại của 1 file. (Ví dụ minh họa kiểm tra file lập trình về số hoàn hảo và sắp xếp dãy số theo thứ tự tăng dần) Hướng dẫn: #include #include #include using namespace std; bool CheckFileExisting() { bool is_exist = true; fstream data_file; data_file.open("value.txt", ios::in); bool ret = data_file.fail(); if (ret == true) { is_exist = false; } data_file.close(); return is_exist; } Kết quả chạy chương trình: 4. Viết chương trình ghi data vào 1 file. (Nếu file chưa có thì sẽ thực hiện tạo file). Hướng dẫn: #include #include #include 172
  98. using namespace std; void GhiFile(char* file_name) { if (file_name != NULL) { fstream data_file; data_file.open(file_name, ios::out); data_file #include #include using namespace std; void DocFileOpen(char* fileName) { char ch; char input[100]; 173
  99. fstream fsFile; fsFile.open(fileName, ios::in); if (fsFile == 0) { cout #include #include using namespace std; void ReadFile(char* fileName) 174
  100. { char input[100]; fstream fsFile; fsFile.open(fileName, ios::in); if (fsFile == 0) //hoac dùng if (!fsFile.is_open()) { cout #include #include using namespace std; int main() 175
  101. { long begin = 0; long end = 0; ifstream my_file ("sample.txt"); begin = my_file.tellg(); my_file.seekg(0, ios::end); end = my_file.tellg(); long size = end - begin; cout #include 176
  102. #include #include #include #include #include int main() { int stt ; char *hoten, *fname, traloi; int tuoi; float diem; fstream f; cout > fname; f.open(fname, ios::in | ios::out | ios::noreplace) ; if (f.bad()) { cout > tuoi; cout > diem; f << setw(24) << hoten << endl; 177
  103. f > tuoi >> diem; f.ignore(); cout 100. Hướng dẫn: #include #include #include using namespace std; void ghiSoChan(ofstream &GhiSo) { int dem = 0; GhiSo 100 \n"; 178
  104. for(int a = 1; a 100 \n"; for(int i = 1; i <= 100; i++) { if(i%2 != 0) { dem ++; GhiSo<<i; if(dem % 5 == 0) { GhiSo<<"\n"; } if(dem % 5 != 0) 179
  105. { GhiSo<<"\t"; } } } cout<<"\n So Le: "<<dem; } int main() { ofstream GhiSo("Ghi So Chan Le.txt"); ghiSoChan(GhiSo); ghiSoLe(GhiSo); GhiSo<<"\n; GhiSo.close(); system("pause"); return 0; } F. BÀI TẬP THỰC HÀNH TRÊN PHÒNG MÁY 1. Viết chương trình đọc in từng kí tự của file văn bản ra màn hình. 2. Viết chương trình tạo tập tin văn bản chứa 1 dãy số nguyên bất kỳ. 3. Viết chương trình tạo tập tin nhị phân chứa 1000 số nguyên bất kỳ ghi vào file SO.INP. Mỗi dòng 10 số, sau đó viết chương trình đọc file SO.INP, sắp xếp theo thứ tự tăng dần và lưu kết quả vào file SO.OUT. 4. Viết chương trình tạo một file chứa 10000 số nguyên ngẫu nhiên đôi một khác nhau trong phạm vi từ 1 đến 32767 và đặt tên là SO1.INP. 5. Tổ chức quản lý file sinh viên (Họ tên, ngày sinh, giới tính, điểm) với các chức năng: nhập, xem, xóa, sửa, tính điểm trung bình chung. 6. Thông tin về một nhân viên trong cơ quan bao gồm: họ và tên, nghề nghiệp, số điện thoại, địa chỉ nhà riêng. Viết hàm nhập từ bàn phím thông tin của 7 nhân viên và ghi vào file INPUT.DAT. Viết hàm tìm trong file INPUT.DAT và in ra thông tin của 1 nhân viên theo số điện thoại được nhập từ bàn phím. 180
  106. TÀI LIỆU THAM KHẢO [1]. PGS.TS. Trần Đình Quế và KS. Nguyễn Mạnh Hùng, Ngôn ngữ lập trình C++, Học viện bưu chính viễn thông, năm 2006. [2]. Phạm Hồng Thái, Bài giảng ngôn ngữ lập trình C/C++, Đại học quốc gia Hà nội, Khoa Công nghệ Thông tin , Hà Nội – 2003. [3]. David Vandevoorde, Nicolai M. Josuttis and Douglas Gregor, “C++ Templates: The Complete Guide 2nd Edition”, Addison-Wesley Professional; 2 edition, September 18, 2017. [4]. Joel Adams & Larry Nyhoff, “C++ An Introduction to Computing”, Prentice Hall 2002, Third Edition. [5]. Paul J. Deitel and Harvey Deitel , “C++ How to Program10th Edition”, Pearson; 10 edition (March 10, 2016). [6]. Joel Adams and Larry Nyhoff, “C++: An Introduction to Computing”, Prentice Hall Companion Website, 2005. 181