BÀI TẬP HƯỚNG DẪN THỰC HÀNH Bài 1: Làm quen với ngôn ngữ lập trình C a. Viết chương trình tính chu vi diện tích hình vuông cạnh a, với a nhập từ bàn phím. b. Viết chương trình tính chu vi diện tích hình chữ nhật có 2 cạnh a, b nhập từ bàn phím. c. Viết chương trình tính tổng điểm, ĐTB của 3 môn thi toán, lý, hóa. d. Viết chương trình biện luận và tìm nghiệm x của phương trình bậc 1 ax+b=0, với a,b nhập từ bàn phím. e. Viết chương trình biện luận và tìm nghiệm x của phương trình bậc 2 ax2+bx+c=0, với a,b,c nhập từ bàn phím. f. Nhập vào một số từ 1 đến 10, in ra chữ tương ứng (1:”Một”, 2:”Hai”,…,10:”Mười”) Gợi ý giải bài: a. Chu vi= 4a , diện tích=aa b. Chu vi= 2(a+b), diện tích=ab c. Tổng điểm=toán+lý+hóa, dtb=(toán+lý+hóa)3 d. Nếu a=0, • b=0 =>Phương trình có vô số nghiệm • b=0 =>Phương trình vô nghiệm Nếu a=0 thì nghiệm x=ba; e. Nếu a=0, delta=bb4ac Nếu delta>0, phương trình có 2 nghiệm x1=(b+sqrt(delta))(2a); x2=(bsqrt(delta))(2a) Nếu delta=0, phương trình có nghiệm kép x=b(2a) Nếu deltagiải phương trình bậc nhất f. Dùng hàm switch (expression) { case constantexpression : statement(s); break; optional case constantexpression : statement(s); break; optional default : Optional statement(s); } g. Ví dụ bài giải câu b) include stdio.h include conio.h void main () { float Dai,Rong,Chuvi,Dientich; printf(Chieu dai =); scanf(%f,Dai); printf(Chieu rong =); scanf(%f,Rong); Chuvi=(Dai+Rong)2;
Trang 1BÀI TẬP HƯỚNG DẪN THỰC HÀNH
Bài 1: Làm quen với ngôn ngữ lập trình C
a Viết chương trình tính chu vi / diện tích hình vuông cạnh a, với a nhập từ bàn phím
b Viết chương trình tính chu vi / diện tích hình chữ nhật có 2 cạnh a, b nhập từ bàn phím
c Viết chương trình tính tổng điểm, ĐTB của 3 môn thi toán, lý, hóa
d Viết chương trình biện luận và tìm nghiệm x của phương trình bậc 1 ax+b=0, với a,b nhập từ bàn phím
e Viết chương trình biện luận và tìm nghiệm x của phương trình bậc 2 ax2+bx+c=0, với a,b,c nhập từ bàn phím
f Nhập vào một số từ 1 đến 10, in ra chữ tương ứng (1:”Một”, 2:”Hai”,…,10:”Mười”)
Gợi ý giải bài:
a Chu vi= 4*a , diện tích=a*a
b Chu vi= 2*(a+b), diện tích=a*b
c Tổng điểm=toán+lý+hóa, dtb=(toán+lý+hóa)/3
d - Nếu a=0,
b=0 =>Phương trình có vô số nghiệm
b!=0 =>Phương trình vô nghiệm
- Nếu a!=0 thì nghiệm x=-b/a;
e Nếu a!=0, delta=b*b-4*a*c
- Nếu delta>0, phương trình có 2 nghiệm x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a)
- Nếu delta=0, phương trình có nghiệm kép x=-b/(2*a)
- Nếu delta<0, phương trình vô nghiệm
Nếu a=0,=>giải phương trình bậc nhất
f Dùng hàm switch (expression) {
case constant-expression : statement(s);
break; /* optional */
case constant-expression : statement(s);
break; /* optional */
default : /* Optional */ statement(s);
}
g Ví dụ bài giải câu b)
#include "stdio.h"
#include "conio.h"
void main ()
{
float Dai,Rong,Chuvi,Dientich;
printf("Chieu dai =");
scanf("%f",&Dai);
printf("Chieu rong =");
scanf("%f",&Rong);
Chuvi=(Dai+Rong)*2;
Dientich=Dai*Rong;
Trang 2printf("Chu vi HCN = %0.2f",Chuvi);
printf("Dien tich HCN = %0.2f",Dientich);
getch();
//Return 0;
}
h Ví dụ bài giải câu d)
#include "stdio.h"
#include "conio.h"
void main ()
{
float a,b,x;
printf("Chuong trinh bien luan phuong trinh bac nhat ax+b=0\n"); printf("Nhap HS a =");
scanf("%f",&a);
printf("Nhap HS b =");
scanf("%f",&b);
if (a==0)
{
if (b==0) printf("Phuong trinh co vo so nghiem\n”);
else printf("Phuong trinh vo nghiem\n”);
}
else
{
x=-b/a;
printf("Phuong trinh co nghiem duy nhat x = %0.2f",x);
}
getch();
}
i Ví dụ bài giải câu e)
#include "stdio.h"
#include "conio.h"
#include "math.h"
void main ()
{
float a,b,c,x,x1,x2,delta;
printf("Chuong trinh bien luan phuong trinh bac hai ax2+bx+c=0\n"); printf("Nhap HS a =");
scanf("%f",&a);
printf("Nhap HS b =");
scanf("%f",&b);
printf("Nhap HS c =");
scanf("%f",&c);
Trang 3if (a==0)
{
printf("Phuong trinh tro thanh phuong trinh bac nhat\n”); }
else
{
delta=b*b-4*a*c;
if(delta<0) printf("Phuong trinh vo nghiem“);
else if (delta=0)
{
printf("Phuong trinh co nghiem duy nhat \n“); x=-b/(2*a);
printf("x = %0.2f",x);
}
else
{
printf("Phuong trinh co 2 nghiem phan biet:\n “); x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
printf("x1 = %0.2f\n",x1);
printf("x2 = %0.2f\n",x2);
}
}
getch();
}
j Ví dụ bài giải câu f)
#include "stdio.h"
#include "conio.h"
void main ()
{
int n=0;
do
{
printf("Nhap vao so:");
scanf("%d",&n);
switch(n){
case 0 : printf("Khong\n");
break;
case 1 : printf("Mot\n");
break;
case 2 : printf("Hai\n");
break;
case 3 : printf("Ba\n");
Trang 4case 4 : printf("Bon\n");
break;
case 5 : printf("Nam\n");
break;
case 6 : printf("Sau\n");
break;
case 7 : printf("Bay\n");
break;
case 8 : printf("Tam\n");
break;
case 9 : printf("Chin\n");
break;
default: printf("So khong hop le\n");
}
}while (n>=0 & n<10);
//getch();
}
Viết chương trình tính tổng
S=1+2+…+n
#include "stdio.h"
#include "conio.h"
void main()
{
int n,i;
long s=0;
printf("Nhap n=");
scanf("%d",&n);
for (i=1;i<=n;i++)
s=s+i;
printf("Tong=%d",s);
getch();
}
Bài 2: Một số bài tập về đệ qui
a Viết chương trình n!
Hướng dẫn giải:
Viết chương trình không dùng đệ qui
#include<stdio.h>
#include "stdio.h"
#include "conio.h"
void main() {
int n,i;
long s=0;
printf("Nhap N=");
scanf("%d",&n);
i=1;
while(i<=n) {
s=s+i;
i++;
} printf("Tong=%d",s);
getch();
}
Dùng đệ qui
#include<stdio.h>
#include<conio.h>
long giaithua(int x);
main() {
int n;
printf("\Nhap so can tinh giai thua: "); scanf("%d", &n);
kq=giaithua(n);
printf("\n %d! = %ld", n, kq);
getch();
} long giaithua(int x) //Hàm sử dụng đệ qui {
if(x==0) return 1;
else return x*giaithua(x-1);
}
Trang 5#include<conio.h>
long giaithua(int x);
main()
{
int n;
printf("\Nhap so can tinh giai thua: "); scanf("%d", &n);
kq=giaithua(n);
printf("\n %d! = %ld", n, kq);
getch();
}
long giaithua(int x) //Hàm không sử dụng đệ qui {
int i;
long g=1;
for(i=1;i<=x;i++)
return g;
}
b Viết chương trình tính S=1+2+…+n
#include<stdio.h>
#include<conio.h>
long Tong(int x);
main()
{
int n;
long kq;
printf("\Nhap so can tinh tong: "); scanf("%d", &n);
kq=Tong(n);
printf("\n %d! = %ld", n, kq);
getch();
}
long Tong(int x) //Hàm sử dụng đệ qui
{
if(x==0) return 0;
else return x+Tong(x-1);
}
c Viết chương trình di chuyển tháp Hà Nội
#include<stdio.h>
#include<conio.h>
void HaNoi(int n, char A, char B, char C);
Trang 6void main()
{
int n;
long kq;
printf("\Nhap so dia can chuyen: ");
scanf("%d", &n);
HaNoi(n,'A','B','C');
getch();
}
void HaNoi(int n, char A, char B, char C){
if (n==1)
printf("Chuyen dia tu cot %c sang cot %c\n",A,C); else{
HaNoi(n -1, A, C, B);
HaNoi(1, A, B, C);
HaNoi(n -1, B, A, C);
} }
Bài 3.1: Viết chương trình chính xuất menu cho phép chọn các chức năng:
1 Nhập vào một mảng từ bàn phím
2 In danh sách ra màn hình
3 Kiểm tra xem mảng có được sắp xếp theo thứ tự tăng dần hay không
4 Chèn một phần tử vào cuối mảng
5 Chèn một phần tử và đầu mảng
6 Sắp xếp mảng theo thứ tự tăng dần
7 Xóa phần tử cuối của mảng
8 Đếm số phần tử của mảng
9 Chèn một phần tử vào vị trí thứ n (n nhập từ bàn phím) của mảng
10 Xóa phần tử ở vị trí thứ n (n nhập từ bàn phím) của mảng
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
void main ()
{
int chon;
printf("1 Nhap mang\n");
printf("2 In mang\n");
printf("3 Kiem tra mang tang dan\n");
printf("4 Chen cuoi mang\n");
printf("5 Chen phan tu vao dau mang\n");
printf("6 Sap xep mang tang dan\n");
printf("7 Xoa phan tu vao cuoi mang\n");
Trang 7printf("8 Dem so phan tu trong mang\n");
printf("9 Chen phan tu vao mot vi tri trong mang\n");
printf("10 Xoa phan tu tai mot vi tri trong mang\n");
printf("0 Thoat\n");
do
{
scanf("%d",&chon);
switch(chon){
case 0 : exit(0);
case 1 : printf("Ban chon nhap mang\n");
break;
case 2 : printf("Ban chon In mang\n");
break;
case 3 : printf("Ban chon Kiem tra mang\n");
break;
case 4 : printf("Ban chon Chen cuoi mang\n");
break;
case 5 : printf("Ban chon Chen dau mang\n");
break;
case 6 : printf("Ban chon Sap xep mang tang\n");
break;
case 7 : printf("Ban chon Xoa phan tu cuoi\n");
break;
case 8 : printf("Ban chon Dem so phan tu trong mang\n");
break;
case 9 : printf("Ban chon Chen phan tu vao mot vi tri\n");
break;
case 10 : printf("Ban chon Xoa phan tu tai mot vi tri\n");
break;
default: printf("Chon khong hop le\n");
}
}while (chon!=0 );
}
Bài 3.2: Viết các chương trình con để thực hiện các chức năng trên
1 Nhập vào một mảng từ bàn phím
2 In danh sách ra màn hình
3 Kiểm tra xem mảng có được sắp xếp theo thứ tự tăng dần hay không
4 Chèn một phần tử vào cuối mảng
5 Chèn một phần tử và đầu mảng
6 Sắp xếp mảng theo thứ tự tăng dần
Trang 87 Xóa phần tử cuối của mảng
8 Đếm số phần tử của mảng
9 Chèn một phần tử vào vị trí thứ n (n nhập từ bàn phím) của mảng
10 Xóa phần tử ở vị trí thứ n (n nhập từ bàn phím) của mảng
Viết các chương trình con để thực hiện các chức năng trên
1 Hàm nhập mảng a, n phần tử
void nhapmang(int a[], int n)
{
int i;
for( i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
}
2 Hàm In mảng a, n phần tử
void inmang(int a[], int n)
{
int i;
for( i=0;i<n;i++)
printf("[%d] ",a[i]);
}
3 Hàm kiểm tra mảng a có đước sắp xếp không, n phần tử
int kiemtramang(int a[], int n)
{
int i;
for( i=0;i<n-1;i++)
{
if(a[i]>a[i+1]) return -1;
}
return 1;
}
4 Chèn phần tử vào cuối mảng
void chencuoimang(int a[], int &n, int x)
{
a[n]=x;
n++;
}
5 Chèn phần tử vào đầu mảng
void chendaumang(int a[], int &n, int x)
Trang 9int i;
for(i = n;i>0;i )
a[0]=x;
n++;
}
6 Sắp xếp mảng tăng dần
void sapxepmang(int a[], int n)
{
int I,j,tam;
for(i = 0;i<n;i++)
for(j = i+1;j<n;j++) if(a[i]>a[j])
Hoanvi(a[i],a[j]) }
void Hoanvi(int &a, int &b)
{
int t=a; a=b; b=t;
}
7 Xóa phần tử cuối mảng
void xoacuoimang(int a[],int &n);
{
a[n-1]=NULL;
n ;
}
8 Đếm số phần tử trong mảng
int demphantu(int a[])
{ int i=0;
while (a[i]!=NULL) i++;
return i;
}
9 Chèn phần tử vào vị trí k
void chen1vitri(int a[], int &n, int x, int k)
{
int i;
if(k<0 ||k>=n) printf(“Vi tri chen khong hop le”); else
{
Trang 10for(i = n;i>k;i )
n++;
}
}
10 Xoa phan tu tai vi tri k
void xoa1vtri(int a[], int &n, int k)
{
int i;
if(k<0 ||k>=n) printf(“Vi tri chen khong hop le”);
else
{
for(i = k;i<n-1;i++)
n ;
}
}
Bài tập phần danh sách
Bài 4: Cho một danh sách chứa các số nguyên Viết các chương trình con để:
1 Nhập các phần tử của danh sách từ bàn phím
2 In danh sách ra màn hình
3 Kiểm tra xem danh sách có được sắp xếp theo thứ tự tăng dần hay không
4 Chèn một phần tử vào cuối danh sách
5 Chèn một phần tử và đầu danh sách
6 Sắp xếp danh sách theo thứ tự tăng dần
7 Xóa phần tử cuối của danh sách
8 Đếm số phần tử của danh sách
9 Chèn một phần tử vào vị trí thứ n (n nhập từ bàn phím) của danh sách
10 Xóa phần tử ở vị trí thứ n (n nhập từ bàn phím) của danh sách
Bài tập phần sắp xếp
Bài 5: Viết chương trình chính với menu cho phép chọn các chức năng tương ứng:
1 Nhập vào mảng n phần tử
Trang 112 Sắp xếp mảng theo giải thuật
a Phương pháp chọn (Selection sort)
b Phương pháp chèn (Insertion sort)
c Phương pháp đổi chỗ (Interchange sort)
d Phương pháp nổi bọt (Bubble sort)
e Phương pháp sắp xếp nhanh (Quicksort )