báo cáo thực hành kỹ thuật lập trình
Trang 1BÁO CÁO THỰC HÀNH KĨ THUẬT LẬP TRÌNHSinh viên: Nguyễn Thị Dung
MSSV: 201092228
Lớp: CN-CNTT3
Phần 1: Thứ tự thực hiện các phép toán trong C,C++
1.1 Viết chương trình nhập các tham số tương ứng và tính giá trị các biểu thức:
Kết luận:
Trang 2Sau khi gán d=10, trả về 10; c++trả về tham trị nên không thể gán giá trị 10 được Còn ++c trả
về một tham chiếu nên có thể gán giá trị mà không bị lỗi
1.2 Viết chương trình nhập các tham số tương ứng và tính giá trị các biểu thức
a++,a=10,10++a,a=11,10a,a++=11,10a,++a=11,11
Viết chương trình nhập vào xâu và in ra số lần xuất hiện mỗi ký tự
Input: nhập 1 xâu
Output: số lần xuất hiện của mỗi kí tự trong xâu đã nhập
Trang 3Giải pháp: so sánh từng kí tự với các kí tự còn lại trong chuỗi, dùng một mảng mà mỗi phần tử sẽ tăng nếu kí tự đó được lặp lại.
Output: thay kí tự 1 bằng kí tự 2 trong xâu nếu có
Giải pháp: so sánh từng kí tự trong chuỗi với kí tự thứ nhất nhập vào, nếu có kí tự 1 trong chuỗi thì gán kí tự đó bằng kí tự thứ 2
Trang 4printf("\nky tu '%c' co mat trong xau %d lan\n",chuoi[i],t[i]);
printf("\nnhap vao ki tu thu nhat:");
Trang 5Output: đưa ra tích của 2 ma trận đã nhập
Giải pháp: giá trị của phần tử cij bằng tổng của từng phần tử hàng i của ma trận A nhân
với từng phần tử của cột j của ma trận B
Trang 9Input: nhập vào một số thực x
Output: đưa ra căn bậc ba của x đã nhập
Giải pháp: tùy vào tham số x truyền vào là bằng 0, nhỏ hơn 0 hay lớn hơn 0 để trả về giá trị tương ứng cho y là căn bậc ba của x theo biểu thức trên
Giả ngữ:
float canba(float x){
if(x==0) return 0
if(x>0) return exp(ln(x)/3)
else return -exp(ln(-x)/3)
Trang 10else if(x>0) return exp(log(x)/(3*log(exp(1))));
else return -exp(log(-x)/(3*log(exp(1))));}
Trang 14if(!allocmatrix(A)) printf("\n Khong du bo nho");
if(!allocmatrix(B)) { printf("\n Khong du bo nho");delete[]B.data[0];delete[]B.data;} if(!allocmatrix(C)) { printf("\n Khong du bo
Phần 6: Đa năng hóa toán tử
6.1 Xây dựng cấu trúc phân số , hàm tiện ích xác lập phân số ( setpPS(int,int), hàm tối giản phân
số, và đa năng hóa các toán tử +,-,*,/, ++,
Input: nhập vào tử số, mẫu số của phân số
Trang 15Output: đưa ra cấu trúc phân số đa năng hóa các toán tử của phân số
Xác lập phân số: dùng struct có 2 trường tử số và mẫu số;
Hàm setPs truyền vào 2 tham số là tử số và mẫu số
mẫu cho ước số tìm được
int usc(ps p){
Đa năng hóa các toán tử: chồng các toán tử với tham số
truyền vào là 2 phân số, và 1 phân số với 1 số nguyên ps operator+(ps p1,ps p2){ps p;
p.t=p1.t*p2.m+p2.t*p1.m;p.m=p1.m*p2.m;
return tgian(p);
}
ps operator+(ps p,int k){p.t=p.t+k*p.m;
return tgian(p);
}Các toán tử khác tương tựChương trình:
Trang 20printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m); p2= operator++(p1)+ operator*(p1,2);
printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m); p2= (operator*(p1,2))+ operator++(p1);
printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m); p2= (operator*(p1,2))+ operator++(p1,1);
printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m);p2= operator++(p1) + (operator*(p1,2));
printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m); p2= operator++(p1,1) + (operator*(p1,2));
printf("\n p1=%d/%d,p2=%d/%d",p1.t,p1.m,p2.t,p2.m); getch();
}
Kết quả chạy chương trình:
Tu so:1;mau so: 1, nhap vao so nguyen : a=1
Trang 21p1=1/1,p2=4/1p1=1/1,p2=3/1Các thực hiện phép toán ++, của trình dịch với cách thực hiện do ta định nghĩa là khác nhau Cách cài đặt của trình dịch luôn ưu tiên các phép toán ++, nhưng theo bảng thứ tự ưu tiên các phép toán thì không phải vậy.
6.3 Xây dựng cấu trúc Time và đa năng hóa các toán tử
Input: Nhập vào một giờ bất kỳ
Output: Đưa ra cấu trúc giờ và đa năng hóa các toán tử có thể của Time
Sử dụng struct để tạo cấu trúc Time với các
trường giờ, phút, giây typedef struct{int gio;int phut;int giay;
}time;
Để dễ tính toán ta viết hàm convert từ giờ sang
giây và ngược lại
long int giay(time t){
return t.gio*3600+t.phut*60+t.giay;
}time gio(long int g){
Đa năng hóa các toán tử +,- với tham số truyền
vào là 2 time và 1 tham số time với 1 tham số
kiểu nguyên;
Đa năng hóa các toán tử ++, với time
time operator+(time t1,time t2){
if(k<=60)g+=k*60;
else g+=k;
return gio(g);
}Các toán tử khác tương tự
Chương trình:
#include<stdio.h>
#include<conio.h>
Trang 22time gio(long int g)
Trang 27Phần 7: Mảng và chồng toán tử.
7.1 xây dựng cấu trúc matrix với các trường kiểu nguyên R và C để xác định số hàng và số cột của ma trận, trường float ** data để cấp phát bộ nhớ động dùng mảng hai chiều Và dịnh nghĩa các phép toán +, * để cộng và nhân 2 ma trận:
Input: nhập vào hai ma trận với cả số thực và số phức
Output: đưa ra cấu trúc ma trận và đưa ra tổng, tích của 2 ma trận
Trang 28A.a = new sp* [A.dong];
for ( i=0; i<A.dong; i++)
A.a[i] = new sp [A.cot];
Trang 30C.a[i][j].thuc=A.a[i][j].thuc+B.a[i][j].thuc; C.a[i][j].ao=A.a[i][j].ao+B.a[i][j].ao; }
Trang 33for (i=1; i<7;i++) i[m] =i*2;
for (i=1;i<7;i++) printf(“\nm[%d]=%d”,i,m[i]);
x1 = Dai hoc bach khoa ha noix2 = xau x2
Kết luận:
Trang 34Về mảng m[]:
Mảng m[] ta chỉ khai báo kích thước 5 phần tử nhưng thực tế chương trình lại dùng tới 6phần tử nhưng chương trình vẫn không bị lỗi vì trình dịch C không kiểm soát lỗi vượt mảng, thực tế có thể sử dụng mảng nhiều hơn kích thước đã khai báo nhưng chỉ tới một giới hạn nhất định thôi
Đúng ra viết phần tử thứ i của mảng m phải là m[i] nhưng trong chương trình là i[m], kết quả vẫn đúng vì m[i] sẽ được trình dịch hiểu là *(m+i) nên khi viết i[m] sẽ được hiểu
là *(i+m) vẫn đúng tuy nhiên m[] là 1 mảng, còn i chỉ là 1 biến thôi sẽ có cận dưới và cận trên, nếu lạm dụng sẽ rất nguy hiểm
Về xâu:
2 xâu s1,s2 là 2 con trỏ kiểu char, khi được khởi tạo bằng toán tử new thì mỗi biến cũng được cấp phát 1 vùng nhớ nhưng 2 vùng nhớ đó là liên tục, xâu s1 được cấp 1 vùng nhớ kích thước 10 phần tử nhưng vì xâu gán vào có độ dài hơn 10 phần tử nên bị ghi tràn sang các ô nhớ tiếp theo của xâu s2 dù là xâu s2 được gán giá trị trước xâu s1, dẫn đến kết quả không đúng
2 xâu x1,x2 được khai báo là một mảng kiểu char nên mỗi biến sẽ được cấp phát một vùng nhớ nào đó và thường 2 vùng nhớ đó không liên tục nên không bị ghi đè và kết quả luôn đúng
Phần 9: Đệ qui
9.1 Viết hàm đệ qui tính tổng các chữ số chẵn( lẻ) của số nguyê n dương n
Input: Nhập vào một số nguyên dương n
Output: Đưa ra tổng các chữ số lẻ của n đã nhập vào
}Bước đệ qui: ta chia n cho 10 lấy phần dư cho
từng chữ số, xét chữ số đó là chẵn thì cộng
vào lời gọi đệ quy với tham số đã chia cho 10
b=n%10;
n=n/10;
if(b%2==1) return le(n)+b;
else return le(n);
}Chương trình:
#include<stdio.h>
#include<conio.h>
Trang 35if(b%2==1) return b+recsum(n);
else return recsum(n);
Trang 36Input: Nhập vào 1 số nguyên n và 1 cơ số (2,8,16)
Output: Đưa ra dãy số n trong cơ số đã nhập
{
Trang 37} n=n/b;
Trang 38Input: Nhập vào số nguyên n
Output: Đưa ra tổng căn theo biểu thức S trên
Bước cơ sở: khi x=n thì trả về căn của n Float can(float x,int n){
If(x==n) return sqrt(n);Bước đệ quy: khi x<n thì trả về căn của tổng x với lời gọi đệ quy
có tham số là x+1 và n
Else return sqrt(x+can(x+1,n));}
Trang 39Input: Nhập vào 1 số nguyên n
Output: Đưa ra tổng các phân số theo biểu thức S
Bước cơ sở: nếu n = 1 thì trả về 1/2 Float S(int n){
If(n==1) return 0.5;
Bước đệ qui: trả về tổng của số hạng cuối với n-1 số
hạng trước qua lời gọi đệ qui có tham số truyền vào là
n-1
Else return S(n-1)+(2*n-1)/2n;}
Trang 40Input: Nhập vào 1 số nguyên n
Output: đưa ra tổng theo biểu thức S đã cho
Trang 42Phần 10: Bài tập trong chương IV
10.1 Liệt kê mọi tập con của tập 1,2,3,…n, với n nhập từ bàn phím
Input: Nhập vào 1 số nguyên dương n
Output: Đưa ra tất cả các tập con của n
Bước cơ sở: nếu số phần tử của tập con bằng n
thì in ra luôn Void hoanvi(){If(n==j) printf(“%d”,c[i]);Bước đệ quy: gọi đệ quy quay lui Else hoanvi();
Trang 44Input: xâu “COMPUTER”
Output: Đưa ra các hoán vị của từ COMPUTER
Giải pháp:
Bước tổng quát: nếu đã duyệt hết một lượt xâu thì in ra xâu đã hoán vị
Bước đệ qui: gọi đệ quy quay lui
Trang 4510.3 Một nhà thám hiểm đem theo 1 cái túi với trọng lượng tối đa là B Có n đồ vật cần mang
theo, mỗi đồ vật có trọng lượng ai và giá trị ci tương ứng Hãy viết chương trình tìm cách bỏ vào
túi các đồ vật sao cho giá trị sử dụng lớn nhất
Input: nhập vào số đồ vật với trọng lượng và giá trị tương ứng
Output: đưa ra những đồ vật có tổng giá trị lớn nhất mà không vượt quá trọng lượng B
Trang 46if(s<=trọng lượng tối đa B) sum+=C[i]*A[i];
tiếp tục cho tới khi hết mảng A;
Trang 49 Đánh số các cột và dòng của bàn cờ từ 1 đến n, một cách sắp xếp hậu được biểu diễn bởi
bộ (a1, a2,…,an)
Các bộ trên phải thỏa mãn ai≠a j và |a i-a j| ≠|i-j| với mọi i≠j
Mã giả:
int NBhau(int j,int k){
for(i=0;i<k;i++) if( j==a[i] hoặc |j-a[i]|==k-i))
Trang 50int Hau(int i){
if(count==0) printf("\n nothing");
getchar();
}