mot so bai tap C ppt

41 463 1
mot so bai tap C ppt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Sưu tầm bởi boy_dt3; nguồn trathai.vn http://tnut.edu.vn/ bài 1(1/500) /* Bai tap 9_1 - Dem so lan xuat hien cac ky tu trong chuoi */ #include <stdio.h> #include <ctype.h> void main() { char chuoi[80]; int i = 0, count = 0; printf("\nNhap vao mot chuoi bat ky : "); gets(chuoi); while (chuoi[i] != 0) { if (isalpha(chuoi[i++])) count++; } printf("So ky tu trong chuoi = %d", count); } bài 2(2/500)các bài toán cơ bản #include <stdio.h> void main() { int num, tram, chuc, donvi, count = 0; for (num = 100; num < 1000; num++) { donvi = num % 10; chuc = (num / 10) % 10; tram = num / 100; if (donvi * donvi * donvi + chuc * chuc * chuc + tram * tram * tram == num) { printf("\nSo %d thoa man", num); count++; } } printf("\nTong cong co %d so thoa man yeu cau", count); } bài 3(3/500)các bài toán cơ bản /* Bai tap - Bai toan Ancarokhi */ #include <stdio.h> void main() { int dai, rong; printf("\nBai toan Ancarokhi : Tim dien tich hinh chu nhat co chieu dai gap hai"); printf("\nchieu rong va dien tich = chu vi"); for (dai = 1; dai < 100; dai ++) for (rong=1; rong < 100; rong++) if (dai == 2 * rong && (dai + rong)*2 == dai*rong) printf("\nDai = %d; Rong = %d", dai, rong); getch(); } Đề bài: Viết hàm nhập n phần tử số thực từ bàn phím: Cách 1: (kiểu kinh điển) void NhapMang(float a[], int &n){ // n là tham chiếu cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong cin >> n; //nhap gia tri cho bien n tu ban phim cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1 cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc nhap cin >> a[i]; //nhap gia tri tu ban phim cho phan tu thu i } //ket thuc vong lap } //ket thuc ham NhapMang Cách 2: Sử dụng con trỏ như là biến mảng void NhapMang(float *a, int &n){ cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong cin >> n; //nhap gia tri cho bien n tu ban phim cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1 cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc nhap cin >> *(a+i); //nhap gia tri tu ban phim cho phan tu thu i } //ket thuc vong lap } //ket thuc ham NhapMang Ở đây a được hiểu là địa chỉ của đầu mảng, tương đương với a[0] và (a+i) là địa chỉ của phần tử thứ i trong mảng Cách 3: Kết hợp 2 kiểu trên void NhapMang(float *a, int &n){ cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong cin >> n; //nhap gia tri cho bien n tu ban phim cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1 cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc nhap cin >> a[i]; //nhap gia tri tu ban phim cho phan tu thu i } //ket thuc vong lap } //ket thuc ham NhapMang Cách sử dụng: Hàm nhập mảng với 3 cách trên đều có thể được sử dụng vào bài 11 chế với bài giải lần 2 ở trên Câu hỏi: Nếu đề bài là Nhập n phần tử số nguyên từ bàn phím thì chúng ta sẽ thay đổi chỗ nào trong 3 hàm trên? Đề bài: Nhập mảng n phần tử số nguyên từ bàn phím a0) Liệt kê các số chẵn có trong mảng b0) Đếm các số chẵn có trong mảng c0) Tính tổng các số chẵn có trong mảng a1) Liệt kê các số nguyên tố có trong mảng b1) Đếm các số nguyên tố có trong mảng c1) Tính tổng các số nguyên tố có trong mảng Phân tích: Ta đã có hàm nhập n phần tử số nguyên ở trên roài. sau khi nhập xong số lượng n, và n phần tử số nguyên cho mảng ta sẽ duyệt qua mọi phần tử của mảng: trong mỗi lần duyệt, nếu gặp phần tử thỏa mãn điều kiện ( là số chẵn (a0), hoặc là số nguyên tố (a1) ) thì sẽ xử lý phần tử đó theo yêu cầu (liệt kê, đếm hoặc là tính tổng ) Ta có code C++ giải các ý a1, b1, c1 như sau: Code: #include <iostream.h> //khai bao thu vien su dung luong nhap xuat #include <iomanip.h> //thu vien dinh dang nhap xuat #include <math.h> //thu vien cac ham toan hoc #include <conio.h> //thu vien cung cap cac ham ve man hinh, ban phim void NhapMang(int *a, int &n){ cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong cin >> n; //nhap gia tri cho bien n tu ban phim cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1 cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc nhap cin >> *(a+i); //nhap gia tri tu ban phim cho phan tu thu i } //ket thuc vong lap } //ket thuc ham NhapMang int kiemtra_snt(int x){ // tra ve 1 neu x la snt, nguoc lai tra ve 0 for(int i=2; i<=sqrt(x); i++) if(x%i==0)return 0; //x chia het cho i => x khong phai la snt return 1; } void lietke_snt(int a[], int n){ //ham in ra cac so nguyen to for(int i=0; i < n; i++) if(kiemtra_snt(a[i])) cout<<a[i]<<" "; cout<<endl; } int dem_snt(int a[], int n){ //ham tra ve so luong so nguyen to int c=0; //khai bao bien c dung de dem snt for(int i=0; i < n; i++) if(kiemtra_snt(a[i])) c++; //tang bien dem len 1 return c; //tra ve so luong snt dem duoc } int tong_snt(int a[], int n){ //ham tra ve so luong so nguyen to int t=0; //khai bao bien t dung de tinh tong for(int i=0; i < n; i++) if(kiemtra_snt(a[i])) t += a[i]; //cong luy tien vao bien t return t; //tra ve tong cac so nguyen to } void main(void) { clrscr(); //xoa man hinh int a[100]; //khai bao bien mang a co 100 phan tu so nguyen int n; //khai bao bien n luu so luong phan tu trong mang NhapMang(a,n); //nhap n gia tri cho tung phan tu cua mang cout<<"Liet ke snt: "; lietke_snt(a,n); cout<<"so luong snt: "<<dem_snt(a,n)<<endl; cout<<"Tong cac so nguyen to: "<<tong_snt(a,n)<<endl; getch(); //cho nguoi dung an phim bat ky de thoat } Còn các ý a0, b0, c0 quả thực rất đơn giản, ta chỉ việc thay hàm kiemtra là sẽ cho kết quả như ý muốn! Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng Phân tích: Bài này có nhiều cách giải Cách 1 (đơn giản nhất): +đầu tiên yêu cầu người dùng nhập số lượng phần tử là n +lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị vừa nhập bé hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ bằng số đó Cách 2: dùng mảng (kinh điển) + nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên) + gán tạm thời min và max bằng phần tử đầu tiên + duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại min và max Cách 3: dài dòng nhất + nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên) + sắp xếp tăng dần (hoặc giảm dần) + nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong mảng đã sắp xếp. Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng Cách 1 (đơn giản nhất): +đầu tiên yêu cầu người dùng nhập số lượng phần tử là n +lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị vừa nhập bé hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ bằng số đó #include <iostream.h> void main(){ int x, i, n, min, max; cout << "Nhap so luong n = "; cin >> n; //nhap so luong if ( n > 0 ) { //so luong > 0 cout<<" Gia tri phan tu thu dau tien = "; cin >> x; //nhap a[0] min = max = x; //min=max=a[0] for ( i = 2 ; i<=n; i++ ){ //vong lap i=2->n cout<<" Gia tri phan tu thu "<<i<<" = "; cin >> x; //nhap a[i] if ( x < min ) min = x; //cap nhat min if ( x > max ) max = x; //cap nhat max } cout << "Gia tri lon nhat = " << max << endl; //in ket qua cout << "Gia tri nho nhat = " << min << endl; } } Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng Cách giải 2: dùng mảng (kinh điển) + nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên) + gán tạm thời min và max bằng phần tử đầu tiên + duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại min và max #include <iostream.h> void NhapMang(int *a, int &n){ cout << "Nhap N = "; cin >> n; cout << "Nhap mang" << endl; for (int i = 0; i < n ; i++){ cout << "a[" << i << "] = "; cin >> *(a+i); } } void TimMinMax(int a[], int n, int &min, int &max){ min = max = a[0]; for (int i = 1; i < n ; i++){ if ( a[i] < min ) min = a[i]; if ( a[i] > max ) max = a[i]; } } void main(){ int a[100], n, min, max; NhapMang (a, n); TimMinMax (a, n, min, max); cout << "Gia tri lon nhat = " << max << endl; cout << "Gia tri nho nhat = " << min << endl; } Chú ý: biến min và max trong đối số hàm TimMminMax là tham chiếu nhé void TimMinMax(int a[], int n, int &min, int &max) trên hàm tìm min và max dùng cách kinh điển, ta có thể thay đổi bằng cách dùng con trỏ như sau: void TimMinMax(int *a, int n, int &min, int &max){ min = max = *a; for (int i = 1, *p=++a; i < n ; i++, p++){ if ( *p < min ) min = *p; if ( *p > max ) max = *p; } } chú ý a tương đương với con trỏ trỏ vào đầu mảng nên *a tương đương với a[0] ban đầu p trỏ vào phần tử a[1] (khối khởi tạo con trỏ *p=++a, tức là p trỏ tới a[1] ) trong mỗi vòng lặp p trỏ vào a[i], và cập nhật min và max nếu a[i] < min hoặc a[i] > max sau đó p trỏ đến phần tử tiếp theo (lệnh p++ ) (biến i ở đây đảm bảo duyệt sẽ duyệt từ a[1] đến a[n-1] : duyệt hết) Có ai ko hiểu cách làm việc của hàm tìm min max thứ 2 này không? Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng Cách giải 3: dài dòng nhất + nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên) + sắp xếp tăng dần (hoặc giảm dần) + nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong mảng đã sắp xếp. #include <iostream.h> void NhapMang(int *a, int &n){ cout << "Nhap N = "; cin >> n; cout << "Nhap mang" << endl; for (int i = 0; i < n ; i++){ cout << "a[" << i << "] = "; cin >> *(a+i); } } void SapXep(int a[], int n) { //sắp xếp tăng dần for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if ( a[i] > a[j] ){ int tg = a[i]; a[i] = a[j]; a[j] = tg; } } void main(){ int a[100], n; NhapMang (a, n); SapXep (a, n); cout << "Gia tri nho nhat = " << a[0] << endl; cout << "Gia tri lon nhat = " << a[n-1] << endl; } Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Nếu trong n phần tử đã nhập có X thì báo "tìm thấy", số lần tìm thấy và "các vị trí tìm thấy", ngược lại báo "không tìm thấy" Ví dụ: mảng A gồm các phần tử (theo thứ tự chỉ số tăng dần từ 0) là 5, 2, 1, 6, 2, 4, 1, 3 giá trị tìm kiếm X = 2 vậy kết quả sẽ là: Tìm thấy 2 (2 lần) tại vị trí: 1, 4 Phân tích: sau khi nhập mảng ta sẽ đếm số lượng phần tử X có trong mảng nếu đếm thấy có: tiến hành liệt kê các vị trí ngược lại thì thông báo không có. Đơn giản vậy thôi ta sẽ chia các công việc ra từng hàm riêng hàm nhập kinh điển hàm đếm trả về số lượng phần tử có giá trị bằng giá trị cho trước hàm liệt kê: tươg tự hàm trên, mỗi khi gặp a[i] bằng x thì in vị trí ra (vị trí là i) Code C++ đây thực hành nào: #include <iostream.h> void NhapMang(int a[], int &n){ cout << "Nhap so luong phan tu cua mang: "; cin >> n; for (int i = 0; i < n ; i++){ cout << "a[" << i << "] = "; cin >> a[i]; } } int DemSoLan(int a[], int n, int x) { int kq = 0; for (int i=0; i < n; i++) if (a[i] == x) kq++; return kq; } void LietKe(int a[], int n, int x) { for (int i = 0; i < n; i++) if (a[i] == x) cout << i << " "; } void main(){ int a[100], n, x, d; NhapMang (a, n); cout << "Gia tri tim kiem = "; cin >> x; d == DemSoLan (a, n, x); if (d > 0){ cout << "Tim thay " << x << " (" << d << " lan) tai vi tri: "; LietKe (a, n, x); } else cout << "Khong tim thay " << x; } Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Đưa ra màn hình "TÌM THẤY" nếu có X trong mảng, ngược lại báo "KHÔNG THẤY" #include <iostream.h> void NhapMang(int a[], int &n){ cout << "Nhap N = "; cin >> n; for (int i = 0; i < n ; i++){ cout << "a[" << i << "] = "; cin >> a[i]; } } int TimKiem(int a[], int n, int x) { for (int i=0; i < n; i++) if(a[i]==x) return 1; return 0; } void main(){ int a[100], n, x; NhapMang (a, n); cout << "Gia tri tim kiem = "; cin >> x; if( TimKiem (a, n, x) ){ cout<<"TIM THAY"; else cout<<"KHONG THAY"; } Ví dụ về toán tử phẩy: #include <iostream.h> void main(){ int a, b=1 , c=10; a= (1, 2, 3); cout<<a<<endl; //in ra số 3 là giá trị biểu thức cuối cùng a= (b++, c=c+50, c+1); cout<<a<<endl //in ra số 61 là giá trị của c+1 <<b<<endl //in ra số 2 <<c<<endl; //in ra số 60 } Tìm ước số chung lớn nhất của hai số nguyên được nhập từ bàn phím Giải thích: Tính ước số chung lớn nhất của 91 và 287. Trước hết lấy 287 (số lớn hơn trong 2 số) chia cho 91: 287 = 91*3 + 14 (91 & 14 sẽ được dùng cho vòng lặp kế) Nhận xét: bất kỳ số nào chia hết bởi 287 và 91 cũng sẽ chia hết bởi 287 - 91*3 = 14. Tương tự, số chia hết bởi 91 và 14 cũng chia hết bởi 91*3 + 14 = 287. Do đó, ƯSCLN(91,287) = ƯSCLN(91,14). Bài toán trở thành tìm ƯSCLN(91,14). Lặp lại quy trình trên cho đến khi phép chia không còn số dư như sau: 91 = 14*6 + 7 (14 & 7 sẽ được dùng cho vòng lặp kế) 14 = 7*2 (không còn số dư, kết thúc, nhận 7 làm kết quả) Cuối cùng ta có: 7 = ƯSCLN(14,7) = ƯSCLN(91,14) = ƯSCLN(287,91). #include <iostream.h> #include <math.h> int main() { int a,b; cout<<"Nhap a,b"; cin>>a>>b; int x= abs(a), y= abs(b), r; while (y!=0) { r=x%y; x= y; y= r; } cout<<"USCLN="<<x; } Hoặc Code: #include <iostream.h> #include <math.h> int main() { int a,b; cout<<"Nhap a,b"; cin>>a>>b; a=abs(a); b=abs(b); while(a-b) { if (a>b) a=a-b; else b=b-a; } cout<<"USCLN="<<a; } Muốn tìm bội số chung nhỏ nhất của hai số a,b ta tìm ước số chung lớn nhất của a và b. Sau đó lấy tích a*b chia cho ước số chung đó. #include <iostream.h> #include <math.h> int main() { int a,b; cout<<"Nhap a,b"; cin>>a>>b; int x= abs(a), y= abs(b), r; while (y!=0) { r=x%y; x= y; y= r; } //x là ước số chung lớn nhất của a và b. cout<<"USCLN="<<a*b/x; } bài toán hay! (của lớp 3) Tìm số tự nhiên N có chữ số hàng đơn vị là d, biết khi chuyển chữ số hàng đơn vị lên đầu thì được số mới có giá trị lớn gấp k lần N. Lập trình tìm N với d và k nhập từ bàn phím ta vd N là: là abcd, thì abcd x k = dabc giả sử biết d=9 và k=2, ta suy ra được c=8, từ c=8 suy ra được b=7, từ b suy ra được a=5 cứ như thế ta sẽ tim được số N #include <iostream.h> void main(){ int a[100], d,k,i,j; cout<<"so dv d="; cin>>d; cout<<"he so k="; cin>>k; a[0]=d; for(i=1; i<100; i++){ a[i]=(a[i-1]%10)*k + a[i-1]/10; if(a[i]==d)break; } if((i<100)&&(a[i-1]%10!=0)){ cout<<"N="; for(j=i-1;j>=0;j ) cout<<a[j]%10; }else cout<<"khong co nghiem"; } Bài tập: Nhập mảng n phần tử số nguyên, nhập giá trị m, in ra màn hình các số không lớn hơn m theo thứ tự tăng dần, các số còn lại theo thứ tự giảm dần Phân tích: Cho một ví dụ để các bạn hiểu yêu cầu nhé: Giả sử mảng nhập vào có 10 phần tử là: 2 9 8 3 7 4 6 5 1 0 và m là 6 thì cần phải in ra: 0 1 2 3 4 5 6 9 8 7 Bài này có nhiều cách giải, sau đây là 1 cách: +khai báo mảng, khai báo biến số lương n, khai báo biến m +Nhập mảng: nhập n, nhập n phần tử +nhập m +sắp xếp toàn bộ mảng theo thứ tự tăng dần +tìm k là vị trí phần tử bé nhất trong mảng đã sắp xếp nhưng lớn hơn m +từ k đến cuối mảng: sắp xếp giảm dần (có thể dùng thuật toán soi gương ở đây) +in mảng ra màn hình sẽ được kết quả mong muốn. #include <iostream.h> void NhapMang(int *a, int &n){ cout << "Nhap N = "; cin >> n; for (int i = 0; i < n ; i++){ cout << "a[" << i << "] = "; cin >> a[i]; } } void sap_xep(int a[], int n, int m){ int i,j,k; for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if(a[i]>a[j]){ int tg=a[i]; a[i]=a[j]; a[j]=tg; } for(k=0; k<n; k++) if(a[k]>m) break; for(i=k; i<n-1; i++) for(j=i+1; j<n; j++) if(a[i]<a[j]){ int tg=a[i]; a[i]=a[j]; a[j]=tg; } } void liet_ke(int a[], int n){ for(int i=0; i<n; i++) cout<<a[i]<<" "; } void main(){ int a[100], n, m; NhapMang(a,n); cout<<"nhap m="; cin>>m; sap_xep(a,n,m); liet_ke(a,n); } Các bước trong code trên là y hệt với quá trình phân tích, nên malyfo ko viết chú thích vào nữa hẳn các bạn cũng hiểu cả! phần trước có bài bài tập gptb2 với hệ số a, b, c bất kỳ, đã post 2 bài là gptb1 và gptb2 riêng biệt, nhưng k thấy có bạn nào ghép nó lại cả #include <iostream.h> #include <iomanip.h> #include <math.h> void gptb2(float a, float b, float c){ float d,x1,x2; d=b*b-4*a*c; if(d>=0){ x1=(-b-sqrt(d))/(2*a); x1=(-b+sqrt(d))/(2*a); cout<<"pt co 2 nghiem thuc"<<endl <<"nghiem thuc 1="<<x1<<endl <<"nghiem thuc 2="<<x2<<endl; } else{ cout<<"pt k co nghiem thuc\n"; cout<<"pt co 2 nghiem phuc lien hop"<<endl; float thuc,ao; thuc=-b/2/a; ao=sqrt(-d)/2/a; cout<<"nghiem ao 1="<<thuc<<"-i"<<ao<<endl; cout<<"nghiem ao 2="<<thuc<<"+i"<<ao<<endl; } } void gptb1(float a, float b){ if(a!=0) cout<<"pt co 1 nghiem thuc x="<<(-b/a)<<endl; else if(b==0) cout<<"pt co vo so nghiem"<<endl; else cout<<"pt khong co nghiem thuc"; } void main(void){ float a,b,c; cout<<"nhap 3 hs cua ptb2: "; cin>>a>>b>>c; if(a!=0) gptb2(a,b,c); else [...]... break; case 5: cout . phím a0) Liệt kê c c số chẵn c trong mảng b0) Đếm c c số chẵn c trong mảng c0 ) Tính tổng c c số chẵn c trong mảng a1) Liệt kê c c số nguyên tố c trong mảng b1). num); count++; } } printf(" Tong cong co %d so thoa man yeu cau", count); } bài 3(3/500 )c c bài toán c bản /* Bai tap - Bai toan Ancarokhi

Ngày đăng: 20/03/2014, 19:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan