LỆNH NHẬP, LỆNH XUẤT DỮ LIỆU (7) Câu hỏi và bài tập 1. Nhập vào một số nguyên n (32 n 255) và in ra ký tự có mã ASCII là n. Bài giải #include <stdio.h> #include <conio.h> main() {int n; /* khai bao bien n*/ printf("nhap n=");/*hien thi dong thong bao nhap n*/ scanf("%d",&n); /* nhap n tu ban phim*/ printf("Ky tu co ma ASCII cua n : %c",n);//xuat ra ma ASCII cua n getch(); } 2. Cho biết kết quả in ra màn hình của lệnh sau : printf("%c, %d, %o, %x, %0.2f ", 65, 65, 65, 65, 65); Bài giải A, 65,101,41,0.00 3. Viết chương trình nhập giờ h, phút m và giây s hiện tại và một số nguyên dương n. In ra màn hình giờ, phút, giây sau n giây. Bài giải #include <conio.h> #include <stdio.h> main() { int n,h,m,s; printf("nhap gio"); scanf("%d", &h); printf("nhap phut"); scanf("%d", &m); printf("nhap giay"); scanf("%d", &s); printf("nhap so nguyen n"); scanf("%d", &n); m = (m + (n + s)%3600/60)%60; h = (h + (n + s)/3600)%24; s = (n + s)%60; printf("Ket qua gio, phut, giay sau n giay "); printf("%d %d %d", h, m , s); getch(); } 4. Viết chương trình nhập bán kính R và xuất ra màn hình diện tích S và chu vi L của hình tròn. (diện tích S = R2 và chu vi L = 2R) Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() {float R,S,L;/* Khai bao cac bien*/ printf("Nhap ban kinh R=");/*Thong bao nhap ban kinh r*/ scanf("%f",&R);/*Nhap ban kinh R tu ban phim*/ S=R*R*M_PI; /*M_PI la so PI*/ L=2*M_PI*R; printf("Dien tich hinh tron =%0.3f\n",S); printf("Chu vi hinh tron =%0.3f\n",L); getch(); } 5. Viết chương trình nhập bán kính R và xuất ra màn hình thể tích V và diện tích S của hình cầu. (thể tích V = 4R3/3 và diện tích S = 4R2) #include <stdio.h> #include <conio.h> #include <math.h> main() {float R,S,V;/* Khai bao cac bien*/ printf("Nhap ban kinh R=");/*Thong bao nhap ban kinh*/ scanf("%f",&R);/*Nhap ban kinh R tu ban phim*/ V=(4*R*R*R*M_PI)/3; /*M_PI la so PI*/ S=4*M_PI*R*R; printf("The tich hinh cau =%0.3f\n",V); printf("Dien tich vi hinh tron =%0.3f\n",S); getch(); } 6. Viết chương trình nhập chiều dài L và chiều rộng W và xuất ra màn hình diện tích D và chu vi C của hình chữ nhật (D = L*W và C = 2(L+W)). Bài giải #include <stdio.h> #include <conio.h> main() {float L,W,D,C; printf("Nhap chieu dai="); scanf("%f",&L); printf("Nhap chieu rong="); scanf("%f",&W); D=L*W; C=(L+W)*2; printf("Dien tich hinh chu nhat =%0.3f\n",D); printf("Chu vi hinh chu nhat =%0.3f\n",C); getch(); } 7. Viết chương trình nhập ba số a, b, c là chiều dài của ba cạnh của một tam giác. Tính diện tích S của tam giác này theo công thức abc S= p(p a )(p b)(p c) , trong đó p là nửa chu vi hay p= 2 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() {float a,b,c,p,s; printf("Nhap a="); scanf("%f",&a); printf("Nhap b="); scanf("%f",&b); printf("Nhap c="); scanf("%f",&c); p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf("ket qua=%0.2f",S); getch(); } 8. Viết chương trình nhập số thực x và tính giá trị các hàm một biến sau: 3 a) f(x)= x 2 + x 5 + ln( x 4 + 1) π x2 + 4 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float ketqua,tu,mau; float x; printf("nhap x"); scanf("%f",&x); tu=pow(x*x,1/3)+pow(x,5)+log(pow(x,4)+1); mau=x*x+M_PI/4; ketqua=tu/mau; printf("Gia tri cua bieu thuc =%f",ketqua); getch(); } b) g(x)= x 3 + log 5 (| x - 3 | +2) arctg 2 ( x - 5) + 1 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float x,tu,mau,ketqua; printf("nhap gia tri x="); scanf("%f",&x); tu=x*x*x+log(fabs(x-3)+2)/log(5); mau=atan(x-5)*atan(x-5)+1; ketqua=tu/mau; printf("Gia tri cua bieu thuc =%f",ketqua); getch(); } 9. Viết chương trình nhập hai số thực x, y và tính giá trị các hàm hai biến sau: 3 a) f(x,y)= x2 + y2 log 5 ( x 2 + y 4 + 1) π tg 2 ( x + y) + 2 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float x,y,tu,mau,ketqua; printf("Nhap x="); scanf("%f",&x); printf("Nhap y="); scanf("%f",&y); tu=pow((x*x-y*y),1/3)*log(x*x+pow(y,4)+1)/log(5); mau=tan(x+y)*tan(x+y)+M_PI/2; ketqua=tu/mau; printf("Gia tri cua bieu thuc =%f",ketqua); getch(); } b) g(x,y)= e x + y + ln(| x 2 - y | +5) cos(x + y) - sin(x ) + 3 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float x,y,tu,mau,ketqua; printf("Nhap x="); scanf("%f",&x); printf("Nhap y="); scanf("%f",&y); tu=exp(x+y)+log(fabs(x*x-y)+5); mau=cos(x+y)-sin(x)+3; ketqua=tu/mau; printf("Gia tri cua bieu thuc =%f",ketqua); getch(); } 10. Viết chương trình nhập đáy trên a, đáy dưới b và chiều cao h của một hình thang. Tính diện tích của hình thang này. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() {float daylon,daybe,duongcao,dientich; printf("nhap do dai day lon"); scanf("%f",&daylon); printf("nhap do dai day be"); scanf("%f",&daybe); printf("nhap do dai duong cao"); scanf("%f",&duongcao); dientich=((daylon+daybe)*duongcao)/2; printf("Dien tich hinh thang =%0.2f",dientich); getch(); } CÁC LỆNH ĐIỀU KIỆN (8) Câu hỏi và bài tập 1. Viết lại các lệnh sau bằng cách dùng lệnh if tương đương (có cùng kết quả). a) m=(a<b&&a<c)? a: b<c?b:c; Bài giải min=a; if (b<min) min=b; if (c<min) min=c; printf("Giá tri ho nhat : %f",min); b) printf("%s", diem>=8?"Gioi": diem>=7?"Kha": "trung binh"); Bài giải if((diem>=7)&&(diem<8))printf("Kha"); if(diem>=8)printf("Gioi"); if(diem<7) printf("trung binh"); 2. Viết lại các lệnh sau bằng cách dùng biểu thức điều kiện ("? :") tương đương. a) if (x>y) max=x; else max=y; Bài giải b) if (x1<x2) m=x1; else m=x2; if (x3<m) m=x3; Bài giải 3. Viết chương trình nhập một chữ cái ch và in ra chữ hoa nếu ch là chữ thường; ngược lại, in ra chữ thường nếu ch là chữ hoa. Bài giải #include<stdio.h> #include<conio.h> main() { char ch; printf("\n Nhap vao 1 ki tu :"); scanf("%c",&ch); if(ch>='a'&&ch<='z') printf("\n Chuyen thanh hoa %c",ch-=32); else if (ch>='A'&&ch<='Z') printf("\n Chuyen thanh thuong %c",ch+=32); getch(); } 4. Viết chương trình nhập hai số thực x, y và tính giá trị các hàm sau: 3 a) f(x,y)= x 2 y 2 log 5 ( x y) arctg( x y) 4 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main(){ float x,y,tu,mau; printf("nhap x="); scanf("%f",&x); printf("nhap y="); scanf("%f",&y); if(x!=-y) {tu=pow(x*x,1.0/3)-log(x+y)/log(5); mau=atan(x-y)+M_PI/4; printf("Gia tri cua ham=%0.2f",tu/mau); } else printf(" loi mien xac dinh cua ham ln"); getch(); } b) g(x,y)= e x y ln( x 2 y) cos(x y) sin(x) Có kiểm tra lỗi khi hàm không xác định. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main(){ float x,y,tu,mau; printf("nhap x="); scanf("%f",&x); printf("nhap y="); scanf("%f",&y); if(x*x!=y) {tu=exp(x+y)+log(x*x-y); mau=cos(x+y)+sin(x); printf("Gia tri cua ham=%0.2f",tu/mau); } else printf(" loi mien xac dinh cua ham ln"); getch(); } 5. Viết chương trình giải phương trình bậc 2 (ax2 + bx + c = 0, a0). Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float a,b,c,delta; printf("Giai phuong trinh bac hai\n"); printf("nhap he so a="); scanf("%f",&a); printf("nhap he so b="); scanf("%f",&b); printf("nhap he so c="); scanf("%f",&c); delta=b*b-4*a*c; if(delta>0) {printf("\nphuong trinh co 2 nghiem phan biet"); printf("\nnghiem x1=%0.2f",(-b-sqrt(delta))/(2*a)); printf("\nnghiem x2=%0.2f",(-b+sqrt(delta))/(2*a)); } else if(delta==0) printf("phuowng trinh co nghiem kep x1=x2=%0.2f",-b/(2*a)); else printf ("Phuong trinh vo nghiem"); getch(); } 6. Viết chương trình giải phương trình bậc bốn trùng phương (ax4 + bx2 + c = 0, a0). Có đếm số nghiệm khác nhau của phương trình. 7. Viết chương trình giải hệ phương trình gồm hai phương trình và hai ẩn x, y với các hệ số nhập từ bàn phím. 8. Viết chương trình giải hệ phương trình gồm ba phương trình có ba ẩn x, y, z với các hệ số nhập từ bàn phím. Bài giải #include<stdio.h> #include<conio.h> #include<math.h> main() { float a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,d,dx,dy,dz; printf("Nhap cac he so cua phuong trinh thu nhat\n"); scanf("%f%f%f%f",&a1,&b1,&c1,&d1); printf("Nhap cac he so cua phuong trinh thu hai\n"); scanf("%f%f%f%f",&a2,&b2,&c2,&d2); printf("\nNhap cac he so cua phuong trinh thu ba\n"); scanf("%f%f%f%f",&a3,&b3,&c3,&d3); d=a1*b2*c3+a2*b3*c1+a3*b2*c3-a3*b2*c1-a1*b3*c2a2*b1*c3; dx=d1*b2*c3+d2*b3*c1+d3*b2*c3-d3*b2*c1-d1*b3*c2d2*b1*c3; dy=a1*d2*c3+a2*d3*c1+a3*d2*c3-a3*d2*c1-a1*d3*c2a2*d1*c3; dz=a1*b2*d3+a2*b3*d1+a3*b2*d3-a3*b2*d1-a1*b3*d2- a2*b1*d3; if(d==0) { if(dx==0&&dy==0&&dz==0)printf("\nHe phuong trinh co vo so nghiem."); else printf("\nHe phuong trinh vo nghiem."); } else printf("\nHe phuong trinh co nghiem duy x=%0.3f , y=%0.3f , z=%0.3f",-dx/d,-dy/d,-dz/d); nhat getch(); } 9. Viết chương trình nhập ngày d, tháng m và năm y và thứ dow hiện tại. Tính ngày, tháng này của năm sau là thứ mấy. 10. Thứ trong tuần được đánh số từ 0 đến 6: 0 là thứ Hai, 1 là thứ Ba,..., 6 là Chủ nhật. Công thức tính thứ i trong tuần cho ngày D, tháng M, năm Y như sau: i = (D + 2*M + 3*(M+1)/ 5 + Y + Y/4 - Y/100 + Y/400) % 7 Tháng 1 và 2 được tính là tháng 13 và 14 của năm trước. Viết chương trình nhập ngày D, tháng M, năm Y và in ra màn hình là thứ mấy. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main(){ int thu,ngay,thang,nam; printf("nhap ngay="); scanf("%d",&ngay); printf("nhap thang="); scanf("%d",&thang); printf("nhap nam="); scanf("%d",&nam); if(thang < 3){ thang = thang + 12; nam=nam-1; } thu=((ngay + 2*thang + 3*(thang + 1)/5 + nam + nam / 4nam / 100+nam /400) % 7 ); switch(thu){ case 0: printf("Thu hai"); break; case 1: printf("Thu ba"); break; case 2: printf("Thu tu"); break; case 3: printf("Thu nam"); break; case 4: printf("Thu sau"); break; case 5: printf("Thu bay"); break; case 6: printf("Chu nhat"); break; } getch(); } 11. Viết chương trình mô phỏng cách gọi menu. Chẳng hạn, nếu nhập vào chữ f hay F thì in ra là bạn chọn menu File; nếu nhập vào chữ h hay H thì in ra là bạn chọn menu Help. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main(){ char ch; printf("Nhap vao 1 ky tu:"); scanf("%c",&ch); switch(ch) { case 'F': {printf("Ban chon menu File"); break;} case 'f': {printf("Ban chon Menu File"); break;} case 'H': {printf("Ban chon menu Help"); break;} case 'h': {printf("Ban chon Menu Help"); break;} default cau"); } getch(); } : printf("Ban da nhap sai ky tu yeu LỆNH VÒNG LẶP (9) Câu hỏi và bài tập 1. Hãy cho biết đoạn chương trình sau làm gì ? for (i = 1; i <= 4; i++) for (j = 1; j <= 10; j++){ printf("%d", j); if (j != 10) continue; printf("\n"); } Bài giải Đoạn chương trình in ra 4 dòng như sau: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 2. Viết chương trình in ra màn hình tam giác cân gồm n hàng các dấu sao (*). Ví dụ, n=3 thì kết quả in ra là * *** ***** Bài giải #include <stdio.h> #include <conio.h> main() { int n; printf("Nhap chieu cao tam giac n="); scanf("%d",&n); printf("\n"); for (int i = 1; i <=n; i++){ for (int j = 1; j <= i; j++) printf("*"); printf("\n"); } getch(); } 3. Công thức đổi độ Fahrenheit F ra độ Celsius C là: C=5(F-32)/9. Viết chương trình in ra bảng chuyển đổi với 0F300 và bước nhảy 20. Dùng giá trị nguyên cho F và giá trị thực cho C. Bài giải #include<stdio.h> #include<conio.h> #include<math.h> main() { int stt=0; float c; printf("\n---------------------------------\n"); printf("Doi Fahrenheit F sang Celsius C\n"); printf("\n STT | F | C"); printf("\n---------------------------------"); for(int i=0;i<=300;i+=20) { c=(float)5*(i-32)/9; stt++; printf("\n %3d |%3d | %3.4f ",stt,i,c); } getch(); } 4. Giả sử lãi suất hằng tháng là d=0.02, tiền vay ngân hàng là T=1000000. Viết chương trình nhập số nguyên dương n và in ra số tiền phải trả sau n tháng. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { int n,i; float F,T; printf("Nhap vao so thang can vay n="); scanf("%d",&n); T=1000000; for(i=0;i<=n; i++) F=T*(1+i*0.02); printf("So tien lai phai tra=%0.2f",F-T); getch(); } 5. Viết chương trình nhập số nguyên dương n và tính tổng: Sn = 1 1 1 + + ... + . 2 n 1 Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { int i,n; float s; printf("nhap n="); scanf("%d",&n); s=0; for (i=1; i<=n; i++) s+=1.0/i; printf(" ket qua tong s=%0.2f",s); getch(); } 6. Số có công thức tính xấp xỉ như sau 4[1- 1 + 1 - 1 +...+(-1)n 3 5 7 1 ] 2n 1 Viết chương trình nhập số nguyên dương n và tính số . Bài giải #include <conio.h> #include <stdio.h> #include <math.h> main() { int i,n; float a=0; float s=0; printf("Nhap n vao:"); scanf("%d",&n); for(i=0;i<=n;i++) { if(i%2==0) a=(1.0/(2*i+1)); else a=-1.0/(2*i+1); s=s+a; } printf("pi=%f",s*4); getch(); } 7. Viết chương trình tính tổng n S= k 1 với n nhập từ bàn phím. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { float s; int n,k; (1) k k 1 = 1- (1) n 1 1 1 1 + - +...+ 2 3 4 n printf("nhap n="); scanf("%d",&n); s=1; for(k=2; k<=n;k++) if(k%2==0) s+=-1.0/k; else s+=1.0/k; printf(" ket qua =%f",s); getch(); } 8. Viết chương trình tính tổng k n S= xk! = 1+ x + k0 x2 2! +...+ xn n! với số nguyên dương n và số thực x nhập từ bàn phím. Bài giải #include <stdio.h> #include <conio.h> main() { float s,a,x; int i,n; printf("Nhap n= "); scanf("%d",&n); printf("Nhap x= "); scanf("%f",&x); s=0; i=0; a=1; while(i<=n) { i++; s=s+a; a=a*(x/i); } printf("ket qua = %.6f",s); getch(); } 9. Giả sử thủ quỹ chỉ có các loại giấy bạc 50 nghìn, 20 nghìn, 5 nghìn và 1 nghìn đồng. Viết chương trình in ra màn hình tất cả các cách có thể nhận được n nghìn đồng với các loại tiền trên. 10. Số hoàn hảo là số nguyên dương bằng tổng các ước thực sự của nó. Ví dụ: 6=1+2+3. Viết chương trình in ra tất cả các số hoàn hảo nhỏ hơn 1000. 11. Viết chương trình in ra tất cả các số nguyên tố từ 2 đến 1000000. 12. Viết chương trình in ra màn hình bảng chân trị của các phép toán logic: AND, OR, NOT. Ví dụ, với phép OR thì có kết quả in ra là OR 0 1 0 0 1 1 1 1 Dùng các phép logic tương ứng là: &&, ||, !. 13. Viết chương trình giải bài toán sau: "Trăm trâu trăm cỏ Trâu đứng ăn năm, Trâu nằm ăn ba Trâu già ba con một bó" Hỏi có bao nhiêu con trâu mỗi loại? Lưu ý: Đây là bài toán tìm các giá trị nguyên. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { int dung, nam, gia; for(dung=0;dung<=20; dung ++) for(nam=0; nam<=33;nam ++) for(gia=0; gia<=300; gia ++) if((15*dung +9*nam + gia==300)&&( dung + nam + gia==100)) printf("trau dung =%4d =%4d\n",dung,nam,gia); trau nam =%4d trau gia getch(); } 14. Viết chương trình tính sin(x) triển khai theo chuỗi sau: sin(x) = x/1! – x3/3! + ... + (-1)n.x2n+1/(2n+1)! số phần tử được chọn cho tới khi đạt độ chính xác: |x2n+1/(2n+1)!| < EPS=10-6 (dùng hàm fabs trong <math.h>). Bài giải #include <stdio.h> #include <conio.h> #include <math.h> #define eps 1e-6 main() { float s,x,a; int i; printf("nhap x="); scanf("%f",&x); x=x*M_PI/180; s=0; a=x; i=3; while(fabs(a)>=eps) { s+=a; a*=(-(x*x/(i*(i-1)))); i+=2; } printf("\nKet qua tinh theo chuoi phan tich %0.3f",s); printf("\nKet qua tinh theo ham chuan %0.3f",sin(x)); getch(); } 15. Viết chương trình tính tổng n (1) k 1 k S= k với n nhập từ bàn phím. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { int n,k; float s=-1; printf("nhap n="); scanf("%d",&n); for(k=2;k<=n;k++) if(k%2==0) s+=1.0/k; else s+=-1.0/k; printf("ket qua =%f",s); getch(); } 16. Viết chương trình nhập số nguyên dương a và kiểm tra a có phải là số tự đối xứng không? Chẳng hạn 5, 232, 5775 tự đối xứng, nhưng 2342 thì không tự đối xứng. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> main() { long n,m, s=0, k; printf("Nhap vao so n: "); scanf("%ld",&n); m=n; 0while(m!=0) { k=m%10; s=s*10+k; m/=10; } if(s==n) printf(" %ld la so doi xung",n); else printf(" %ld khong la so doi xung",n); getch(); } HÀM – CHƯƠNG TRÌNH CON (10) Câu hỏi và bài tập 1. Viết lại hàm ucln( ) bằng lệnh vòng lặp. Bài giải #include <stdio.h> #include <conio.h> int UCLN(int a, int b) { int r; while (b!=0) { r = a % b; a = b; b = r; } return a; } main() { int x, y; printf("Nhap hai so can tim UCLN\nx = "); scanf("%d",&x); printf("y = "); scanf("%d",&y); printf("UCLN cua %d và %d la: %d",x,y,UCLN(x,y)); getch(); } 2. Dãy số Fibonacci {Fn} có công thức truy hồi: Fn = Fn-1 + Fn-2 với F0=0, F1=1 Đây là dãy số: 0, 1, 1, 2, 3, 5, 8, 13, 21,... Hãy hàm đệ qui Fib(n) để tính Fn. 3. Viết hàm bitcount(x) để đếm số bit 1 trong số nguyên dương x. 4. Tổng riêng thứ n của chuỗi điều hòa đan dấu là n Sn = k 1 (1) k 1 k = 1- (1)n 1 1 1 1 + - +...+ 2 3 4 n Viết hàm S(n) để tính Sn: a) Bằng lệnh vòng lặp b) Bằng kỹ thuật đệ quy 5. Viết hàm power(a,n) để tính tính an a) Bằng lệnh vòng lặp b) Bằng kỹ thuật đệ quy 6. Một số palindrome là số tự đối xứng (như 12321, 535). Viết hàm palin(n) để kiểm tra đối số nguyên dương n có phải là số palindrome hay không. 7. Cho công thức tính tổng Sn = 1+ x + x2 2 +...+ xn 1 n 1 + xn n a) Tìm công thức truy hồi cho Sn. b) Viết hàm đệ quy S(x,n) để tính Sn. k k k 1 k 0 n Cn có công thức truy hồi: Cn = Cn 1+ Cn1với Cn = Cn =1. k Viết hàm đệ quy C(n,k) để tính Cn . 8. Số tổ hợp 9. Dãy số Josephus có công thức truy hồi J(2n)=2J(n)-1, J(2n+1)=2J(n)+1 và J(1)=1. Viết hàm đệ quy J(n) để tính số Josephus thứ n. 10. Bài toán tháp Hanoi như sau: Có 3 cọc A, B, C và n đĩa với đường kính khác nhau được sắp xếp trên cọc A. Hãy chuyển n đĩa này qua cọc C với điều kiện: a) Mỗi lần chuyển 1 đĩa từ một cọc qua cọc khác. b) Không được đặt đĩa lớn lên trên đĩa nhỏ hơn. Viết hàm đệ quy Move(n, A,B,C) để chuyển n đĩa từ cọc A qua cọc C nhờ cọc trung gian B. 11. Viết hàm Cphuong(n) để kiểm tra đối số nguyên dương n có phải là số chính phương không. 12. Năm nhuận (có ngày 29/2) là năm chia hết cho 4 mà không chia hết cho 100 hoặc chia hết cho 400. Viết hàm Leap(n) để kiểm tra năm n có phải là năm nhuận hay không. 13. Viết hàm days(m, y) để tính số ngày trong tháng m của năm y. 14. Số hoàn hảo là số nguyên dương bằng tổng các ước thực sự của nó. Ví dụ: 6=1+2+3. Viết hàm Perfect(n) để kiểm tra số n có phải là số hoàn hảo hay không. 15. Viết hàm sumprod(n, *p) với n là đối số nguyên dương để trả về tổng các chữ số của n và tích các chữ số của n trả về trong tham số p. 16. Viết hàm nhap(*n) để nhập số nguyên dương n. 17. Bình phương của số nguyên dương n được tính bằng phép cộng bằng cách lấy tổng n số lẻ đầu tiên. Ví dụ, n=3 thì 9=1+3+5. Viết hàm sqr(n) để tính n2 như trên. MẢNG (11) Câu hỏi và bài tập 1. Viết chương trình nhập vào dãy số với n phần tử, sau đó xuất ra màn hình. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(int x[100], int n) { int i; for(i=0; i<n; i++) { printf("x[%d]=",i); scanf("%d",&x[i]); } } void Xuat(int x[100], int n) {int i; for(i=0; i<n;i++) printf("%4d",x[i]); } main() { int n; int a[100]; printf("Nhap vao day so "); scanf("%d",&n); Nhap(a,n); printf("Day so sau khi nhap"); Xuat(a,n); getch(); } 2. Viết chương trình nhập tọa độ hai véctơ n chiều x, y và tính: a) véctơ z=x+y b) b) Tích vô hướng p=xy Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(float x[100], int n, char ten) { int i; for(i=0; i<n; i++) { printf("%c[%d]=",ten,i); scanf("%f",&x[i]); } } void Xuat(float x[100], int n) {int i; for(i=0; i<n;i++) printf("%6.2f",x[i]); } void Tong(float x[100],float { y[200],float z[400], int n) int i; for(i=0;i<n;i++) z[i]=x[i]+y[i]; } void Tich(float x[100],float { y[200],float z[400], int n) int i; for(i=0;i<n;i++) z[i]=x[i]*y[i]; } main() { int n; float x[100]; float y[200]; float z[400]; printf("Nhap so n phan tu vec to x phai bang phan tu vec to y\n"); printf("Nhap so phan tu n vec to x va y"); scanf("%d",&n); Nhap(x,n,'X'); Xuat(x,n); printf("\n"); Nhap(y,n,'Y'); printf("\n"); Xuat(y,n); printf("\n"); printf("\nTong cua hai vec x va y la\n"); Tong(x,y,z,n); printf("\n"); Xuat(z,n); printf("\nTich cua hai vec x va y la\n"); Tich(x,y,z,n); printf("\n"); Xuat(z,n); getch(); } 3. Viết chương trình nhập mảng số nguyên A gồm n phần tử và đảo ngược thứ tự của chúng. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(int x[100], int n); void Xuat(int x[100], int n); void DaoMang(int x[100], int n); main() { int n; int a[100]; printf("Nhap vao day so "); scanf("%d",&n); Nhap(a,n); printf("Day so sau khi nhap"); Xuat(a,n); printf("\n"); printf("Mang sau khi dao"); DaoMang(a,n); Xuat(a,n); getch(); } void Nhap(int x[100], int n) { int i; for(i=0; i<n; i++) { printf("x[%d]=",i); scanf("%d",&x[i]); } } void Xuat(int x[100], int n) {int i; for(i=0; i<n;i++) printf("%4d",x[i]); } void DaoMang(int x[100], int n) { int tam,i; for(i=0; i<n/2;i++) {tam =x[i]; x[i]=x[n-i-1]; x[n-i-1]=tam; } } 4. Viết chương trình nhập ma trận thực vuông cấp n, rồi sắp xếp tất cả các phần tử của các cột theo thứ tự giảm dần. Bài giải 5. Viết chương trình nhập ma trận nguyên A là ma trận vuông cấp n, rồi tìm phần tử có giá trị lớn nhất trong đường chéo chính của ma trận A. Bài giải 6. Viết chương trình nhập mảng số nguyên A gồm n phần tử. Tìm phần tử có giá trị lớn nhất trong mảng A. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(int a[100], int n); int PhanTulonNhat(int a[100], int n); void Xuat(int a[100], int n); main() { int n; int a[100]; printf("Nhap mang a "); scanf("%d",&n); Nhap(a,n); printf("Mang a sau khi nhap "); Xuat(a,n); printf("\n"); printf("Phan tu lon nhat trong mang: %d",PhanTulonNhat(a,n)); getch(); } void Nhap(int a[100], int n) { int i; for(i=0; i<n; i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } } int PhanTulonNhat(int a[100], int n) { int i,max; max=a[0]; for(i=0; i<n; i++) if (a[i]>max) max=a[i]; return max; } void Xuat(int a[100], int n) {int i; for(i=0; i<n;i++) printf("%4d",a[i]); } 7. Cho biết hàm sau làm gì ? void in_ma_tran (int a[][Max_Cot], int m, int n); { int i, j; for (i=0; i < m; i++) for (j=0; j < n; ++j) printf("%4d%c", a[i][j], j == n-1 ? '\n' : ' '); } 8. Viết chương trình nhập ma trận A là ma trận nguyên vuông cấp n, rồi kiểm tra ma trận A có đối xứng qua đường chéo chính không? Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(int a[][100], int n); void Xuat(int a[][100],int n); int KiemTraDoiXung(int a[][100], int n); main() {int a[100][100]; int n; printf("Nhap n"); scanf("%d",&n); Nhap(a,n); Xuat(a,n); printf("\n"); if(KiemTraDoiXung(a,n)) printf("Ma tran doi xung qua duong cheo chinh"); else printf("Ma tran khong doi xung"); getch(); } void Nhap(int a[][100], int n) { int i,j; for(i=0;i<n; i++) for(j=0;j<n; j++) { printf("a[%d,%d]=",i,j); scanf("%d",&a[i][j]); } } int KiemTraDoiXung(int a[][100], int n) {int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) if(a[i][j]!=a[j][i]) return 0; return 1; } void Xuat(int a[][100],int n) {int i,j; for(i=0;i<n;i++) { printf("\n"); for(j=0;j<n;j++) printf("%4d",a[i][j]); } } 9. Ma phương bậc n là ma trận vuông cấp n gồm n2 số từ 1 đến n2 được sắp xếp thành n hàng và n cột sao cho tổng hàng, tổng cột và tổng đường chéo bằng nhau. Các bước sinh ma phương với n lẻ như sau: số 1 đặt ở giữa hàng đầu (hàng 1). Khi số k đặt ở ô (i,j) thì k+1 đặt tại ô (i-1,j+1); nếu i-1=0, ra ngoài ma trận thì đặt tại hàng cuối (hàng n); nếu j+1=n+1, ra ngoài ma trận thì đặt tại cột đầu (cột 1). Viết chương trình nhập n lẻ và in ra màn hình ma phương bậc n. 10. Viết chương trình nhập mảng số nguyên A gồm n phần tử và nhập số nguyên x. Xóa tất cả các phần tử có giá trị x ra khỏi mảng A. 11. Viết chương trình nhập mảng số thực A gồm n phần tử. Xóa tất cả các phần tử có giá trị lớn nhất ra khỏi mảng A 12. Viết chương trình nhập mảng số nguyên A gồm n phần tử. Đếm số phần tử có giá trị lớn nhất trong mảng A. 13. Viết chương trình nhập mảng số nguyên A gồm n phần tử và nhập số nguyên k. Xóa phần tử có chỉ số k ra khỏi mảng A. 14. Viết hàm Merge(X,Y,Z) với hai mảng số nguyên X,Y đã sắp xếp tăng dần. Tạo mảng Z tăng dần bằng cách trộn hai mảng X, Y lại. Ví dụ, X=[5, 8], Y=[2, 3, 7, 9] thì Z=[2, 3, 5, 7, 8, 9]. Bài giải #include <stdio.h> #include <conio.h> #include <math.h> void Nhap(int x[100], int n, char ten) { int i; for(i=0; i<n; i++) { printf("%c[%d]=",ten,i); scanf("%d",&x[i]); } } void Xuat(int x[100], int n) {int i; for(i=0; i<n;i++) printf("%4d",x[i]); } void SapXep(int x[100],int n) { int temp=0,i,j; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(x[i]>x[j]){ temp=x[i]; x[i]=x[j]; x[j]=temp; } } } } void NoiMang(int x[ ],int y[ ],int z[], int n, int m) { int t=n+m; int k=0,i,j; for(i=0;i<n;i++) {z[k]=x[i]; k++; } for(j=0;j<m;j++) {z[k]=y[j]; k++; } SapXep(z,t); } main() { int t,m,n; int x[100]; int y[200]; int z[400]; printf("Nhap so phan tu n"); scanf("%d",&n); printf("Nhap so phan tu m"); scanf("%d",&m); t=n+m; Nhap(x,n,'X'); printf("Mang X sau khi sap xep tang dan\n"); SapXep(x,n); Xuat(x,n); printf("\n"); Nhap(y,m,'Y'); printf("\n"); printf("Mang Y sau khi sap xep tang dan"); SapXep(y,m); Xuat(y,m); printf("Mang Z sau khi noi co ket qua la"); NoiMang(x,y,z,n,m); Xuat(z,t); getch(); } 15. Viết chương trình nhập ma trận A là ma trận nguyên vuông cấp n và nhập số nguyên k. Xóa cột thứ k ra khỏi ma trận A. 16. Phương pháp sàng Eratosthenes để tìm tập T gồm các số nguyên tố trong khoảng từ 2..MAX có thể mô tả bằng giả lệnh như sau: S={2..MAX}; n=2; While (T=Ø){ if (n T ){ T=T {n} ; Loại tất cả các bội n ra khỏi S; } n++; } Viết chương trình in ra tất cả các số nguyên tố trong 2..MAX với MAX=1000. Bài giải : Cách giải khác Thuật toán Dùng thuật toán sàng Eratosthène để xác định dãy các số nguyên tố nhỏ hơn 1000. Thuật toán này xác định các số nguyên tố trong khoảng từ 1 đến N. Xét dãy số i từ 2 đến SQRT(N) và dãy số từ 2 den N/i. Bất kỳ số nào là tích của một số thuộc dãy này và một số thuộc dãy kia đều có giá trị nằm trong khoảng từ 2 đến N, và một khi đã là tích của 2 số thì không thể là số nguyên tố. Loại trừ các số này đi thì còn lại là các số nguyên tố trong khoảng từ 1 đến N. #include <stdio.h> #include <conio.h> #define MAX int main() { int A[2000]; 1000 int i,j; for (i = 0; i <= MAX; i++) A[i] = 1; for (i = 2; i <= MAX/2; i++) for ( j= 2; j <= MAX/i; j++) A[i*j] = 0; for (i = 2; i < MAX; i++) if (A[i]) printf("%4d", i); getch(); } CHUỖI KÝ TỰ (12) Câu hỏi và bài tập 1. Viết chương trình nhập chuỗi ký tự s gồm các chữ cái. Đổi tất cả các chữ cái trong s sang chữ hoa. 2. Viết chương trình nhập chuỗi ký tự s gồm các chữ cái. Đếm số từ trong s. 3. Viết chương trình nhập chuỗi ký tự s gồm các chữ cái. Đếm số từ khác nhau trong s. 4. Viết chương trình nhập chuỗi ký tự s gồm các chữ cái. In ra bảng tần số xuất hiện của các từ khác nhau trong s. Ví dụ : s= "DAI HOC BACH KHOA, DAI HOC DA NANG " thì bảng tần số là: DAI :2 HOC : 2 BACH : 1 ... 5. Viết chương trình nhập chuỗi ký tự s gồm các chữ cái. In ra bảng tần số xuất hiện của các chữ cái khác nhau trong s. Ví dụ : s= "DAI HOC BACH KHOA, DAI HOC DA NANG " thì bảng tần số là: A:6 B:1 C:3 ... 6. Một chuỗi ký tự gọi là palindrome nếu nó tự đối xứng. Ví dụ: "ABCBA", 'lewd I did live , evil did I dwel'. Viết hàm palind(s) để kiểm tra chuỗi ký tự s có phải palindrome hay không. 7. Giả sử chuỗi ký tự s chỉ gồm các chữ số. Viết hàm atoi(s) để đổi s sang số nguyên. Ví dụ, s="0123" thì trả về số nguyên 123. 8. Viết hàm Trim(s) để xóa tất cả các ký tự trống (dấu cách) ở hai đầu của s. 9. Viết chương trình nhập một chuỗi ký tự và thay một hoặc nhiều dấu cách bởi một dấu cách đơn. 10. Viết hàm Proper (s) để đổi chuỗi ký tự s sang dạng danh từ riêng. Nghĩa là đầu mỗi từ là chữ hoa, còn lại là chữ thường. Ví dụ, s="DAI hoC baCH KhOA" sau khi gọi hàm s="Dai Hoc Bach Khoa". 11. Viết hàm itob(n,s,b) để đổi số nguyên dương n sang cơ số b và lưu kết quả trong chuỗi ký tự s. 12. Viết hàm strindex(s,t) để tìm vị trí cuối cùng (bên phải nhất) của t trong s. Trả về -1 nếu không có. 13. Viết hàm đệ quy reverse(s) để đảo chuỗi ký tự s. 14. Viết hàm strend(s, t) để trả về 1 nếu chuỗi t ở cuối chuỗi s; ngược lại trả về 0. 15. Viết hàm squeeze(s, c) để xóa tất cả ký tự c trong chuỗi ký tự s. 16. Viết hàm month_name(n) để trả về tên của tháng n. Ví dụ, month_name(7)= "July" KIỂU CẤU TRÚC VÀ KIỂU HỢP (13) Câu hỏi và bài tập 1. Dùng kiểu cấu trúc khai báo kiểu điểm trong mặt phẳng Oxy. Nhập hai điểm A, B và in ra khoảng cách giữa chúng. 2. Dùng kiểu cấu trúc khai báo kiểu phân số. Viết các hàm tiện ích để tính toán trên phân số: a) Hàm GCD(a,b) : tính ước chung lớn nhất của hai số nguyên a, b. b) Hàm Reduce(x) : Tối giản phân số x. c) Hàm Sum(x,y) : Tính x+y, với x và y là các phân số. d) Hàm Prod(x,y) : Tính xy, với x và y là các phân số. e) Hàm Sub(x,y) : Tính x-y, với x và y là các phân số. 3. Kiểu đa thức được khai báo là một cấu trúc với các trường: mảng hệ số và bậc của đa thức. Sơ đồ Horner để tính đa thức P(x) = anxn + an-1xn-1 + ... + a1x + a0 được biểu diễn như sau: P(x) = a0 + (a1 + (a2 + (...+( an)x)... )x)x. Viết chương trình nhập bậc n của P(x) và nhập mảng hệ số. Dùng sơ đồ Horner đề tính và in ra màn hình giá trị của P(x). 4. Kiểu đa thức được khai báo là một cấu trúc với các trường: mảng hệ số và bậc của đa thức. Viết các hàm tính: a) Tổng hai đa thức. b) Hiệu hai đa thức. c) Tích hai đa thức. 5. Xét mảng struct struct{ char hoten[25]; char quequan[30]; int tuoi; }person[100]; Mỗi phần tử của mảng cấu trúc chứa thông tin về một người. Viết chương trình thực hiện các yêu cầu sau: a) Nhập số nguyên dương n và nhập số liệu cho n người (n100). b) Sắp xếp danh sách theo thứ tự tăng của tuổi. c) In ra màn hình danh sách theo thứ tự tăng của tuổi. 6. Viết chương trình quản lý điểm thi đại học khối A của một hội đồng thi gồm n thí sinh (n100) với các thông tin: số báo danh, họ tên, ngày sinh, điểm toán, điểm lý, điểm hóa. Viết chương trình có các chức năng sau: a) Nhập danh sách thí sinh. b) Sắp xếp danh sách sinh viên theo số báo danh. c) Tính tổng điểm của từng thí sinh. d) Nhập điểm chuẩn dc. Thí sinh trúng tuyển là thí sinh có tổng điểm không thấp hơn dc và không bị điểm không môn nào. In ra màn hình danh sách thí sinh trúng tuyển. 7. Viết chương trình quản lý một lớp học gồm n sinh viên (n100) với các thông tin: họ, tên, ngày sinh, quên quán. Viết chương trình có các chức năng sau: a) Nhập danh sách lớp. b) Sắp xếp danh sách sinh viên theo tên. Nếu tên trùng thì theo họ. c) Nhập thông tin cho một sinh viên mới chuyển đến lớp. Chèn sinh viên này vào danh sách sao cho đúng thứ tự. d) Nhập một tên t. In ra tất cả các thí sinh có tên là t. e) Nhập số thứ tự k. Xóa sinh viên thứ k ra khỏi danh sách. 8. Viết chương trình quản lý phiếu nhập của một kho hàng trong một tháng, gồm n phiếu (n100) với các thông tin: số phiếu, ngày nhập, tên mặt hàng, mã mặt hàng, số lượng, đơn giá. Viết chương trình có các chức năng sau: a) Nhập danh sách phiếu. b) Tính thành tiền của từng phiếu. c) Sắp xếp danh sách phiếu theo mã mặt hàng. Nếu trùng thì theo ngày nhập. d) Tính tổng tiền nhập hàng trong tháng. e) Thống kê hàng nhập theo từng mặt hàng gồm: mã mặt hàng, tên mặt hàng, tổng số lượng, thành tiền. 9. Viết chương trình quản lý lương một tháng của một công ty, gồm n nhân viên (n100) với các thông tin: họ tên, hệ số lương, hệ số phụ cấp, hệ số chức vụ, ngoài giờ, tạm ứng. Tuy nhiên, để tiết kiệm bộ nhớ, hệ số chức vụ và hệ số ngoài giờ được đặt chung một trường (union). Viết chương trình có các chức năng sau: a) Nhập danh sách lương. b) Tính thành tiền của từng nhân viên: thành tiền = 1050000*(hệ số phụ cấp+hệ số chức vụ hoặc ngoài giờ). c) Tính thực nhận của từng nhân viên: thực nhận = thành tiền – tạm ứng. c) Sắp xếp danh sách theo thứ tự giảm dần của thực nhận. d) In ra màn hình bảng lương. Tạm dừng sau 20 người. 10. Kiểu số là một union gồm các trường: thuc là kiểu float và nguyen là mảng gồm 4 số nguyên kiểu char. Viết chương trình nhập giá trị thực cho một số. In ra màn hình 4 số nguyên của nó dưới dạng nhị phân (cơ số 2). KIỂU TỆP TIN (14) Câu hỏi và bài tập 1. Viết chương trình đọc một tệp tin văn bản đang có trên máy. In ra màn hình từng dòng một. 2. Viết chương trình đọc một tệp tin văn bản đang có trên máy. In ra màn hình mỗi từ một dòng. Tạm dừng sau 20 từ. 3. Viết chương trình nhập tên hai tệp tin. Tạo tệp tin thứ ba bằng cách nối tệp tin thứ hai vào cuối tệp tin thứ nhất. 4. Giả sử tệp tin "Num.dat" là tệp nhị phân chứa các số nguyên kiểu int. Viết chương trình đọc tệp này và ghi từng số vào tệp mới "Num.txt" dạng văn bản. 5. Cho tệp tin dữ liệu "matran.inp" được tổ chức theo khuôn dạng tệp tin văn bản như sau: - Dòng đầu tiên là một số tự nhiên n là cấp của ma trận vuông A; - n dòng tiếp theo mỗi dòng ghi n số thực, mỗi số thực được phân biệt với nhau bởi một hoặc nhiều ký tự trống là các phần tử A[i][j] của ma trận vuông A. Hãy viết chương trình tìm hàng hoặc cột có tổng các phần tử là lớn nhất. Ghi kết quả hàng hoặc cột đó vào tệp "max.out" mà mỗi phần tử được phân biệt bởi một ký tự trống. 6. Viết chương trình thực hiện các công việc sau: Xây dựng tệp tin "MT.txt" và ghi lên đó dòng đầu là cấp n, 2n dòng tiếp theo là các dòng chứa các phần tử của hai ma trận vuông cấp n là A và B Đọc lại tệp tin "MT.txt" cho hai ma trận A, B. Tính ma trận tích C=A*B, sau đó ghi bổ sung ma trận C vào tệp tin này. Đọc lại các ma trận A, B và C từ tệp tin "MT.txt" rồi in ra màn hình. 7. Viết chương trình đọc một chương trình nguồn C. Xóa tất cả các lời chú thích. Ghi lại vào chương trình này. 8. Viết chương trình đếm số từ trong một tệp văn bản. 9. Viết chương trình đếm số từ khác nhau trong một tệp văn bản (không phân biệt chữ hoa/chữ thường). 10. Viết chương trình đọc một tệp văn bản. In ra màn hình bảng tần số xuất hiện của các từ khác nhau (không phân biệt chữ hoa/chữ thường).