Tải bản đầy đủ (.docx) (52 trang)

báo cáo thực hành kỹ thuật lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (156.11 KB, 52 trang )

BÁO CÁO THỰC HÀNH KĨ THUẬT LẬP TRÌNH
Sinh 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:
Đoạn code Kết quả
#include<stdio.h>
#include<conio.h>
void main()
{
int a,b,c,d;
a=b=c++=d=10;
printf("\na=%d\nb=%d\nc=%d\nd=%d",a,b,c,d);
getch();
}
Chương trình
báo lỗi ở dòng
a=b=c++=d=10
#include<stdio.h>
#include<conio.h>
void main()
{
int a,b,c,d;
a=b=++c=d=10;
printf("\na=%d\nb=%d\nc=%d\nd=%d",a,b,c,d);
getch();
}
a=10
b=10
c=10


d=10
#include<stdio.h>
#include<conio.h>
void main()
{
int a,c,d,b;
a=b=c++=d=10;
printf("\na=%d\nb=%d\nc=%d\nd=%d",a,b,c,d);
a=b=++c=d=10;
printf("\na=%d\nb=%d\nc=%d\nd=%d",a,b,c,d);
getch();
}
Báo lỗi ở dòng
lệnh có c++
Kết luận:
1
Sau 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
Đoạn code Kết quả
#include<stdio.h>
#include<conio.h>
void main()
{
int a,b;
printf("\n a=");scanf("%d",&a);
b= a++ + 2 * a;
printf("\na=%d,b=%d",a,b);
b= ++a + 2 * a;
printf("\na=%d,b=%d",a,b);

b= (2*a)+ ++a;
printf("\na=%d,b=%d",a,b);
b= (2*a)+ a++;
printf("\na=%d,b=%d",a,b);
b= ++a + (2*a);
printf("\na=%d,b=%d",a,b);
b= a++ + (2*a);
printf("\n\n a=10\n");
a=10;
printf(" \n a++,a = %d, %d",a++,a);
a=10;
printf(" \n ++a,a = %d, %d",++a,a);
a=10;
printf(" \n a,a++ = %d, %d",a,a++);
a=10;
printf(" \n a,++a = %d, %d",a,++a);
getch();
}
Nhập a=5
a=6,b=15
a=7,b=21
a=8,b=22
a=9,b=24
a=10,b=30
a++,a=10,10
++a,a=11,10
a,a++=11,10
a,++a=11,11
Kết luận:
Trong C++ phép toán ++ có mức độ ưu tiên cao hơn các phép toán khác nhưng theo quy tắc

thì không phải như vậy.
Truyền hàm trong C++ theo thứ tự từ phải sang trái.
Phần 2: Mảng trong C/C++
2.1 Viết CT nhập vào 1 xâu ký tự và in ra số lần xuất hiện của mỗi ký tự trong xâu. Nhập
vào 2 ký tự rồi in ra xâu với ký tự thứ nhất ( nếu có) trong xâu được thay thế bằng ký tự thứ
2.
 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
2
Giả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.
Giả ngữ:
char s[];
int t[];
for(i=0;i<strlen(s);i++)
k=0;
while(s[i]!=s[k]) k++;
t[k]++;
 In ra xâu mới mà kí tự thứ nhất được thay bằng kí tự thứ 2
Input: nhập 2 kí tự
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.
Giả ngữ:
char x1,x2;
for(i=0;i<n;i++)
if(s[i]==x1) s[i]=x2;
 Chương trình:
#include<stdio.h>

#include<conio.h>
#include<string.h>
int main()
{
int i,t[100],k;
char chuoi[1000];
char s1,s2;
printf("nhap vao xau ky tu :\n");
gets(chuoi);
printf("xau vua nhap la :\n");
puts(chuoi);
int n = strlen(chuoi);
for (i=0;i<n;i++)t[i]=0;
3
for (i=0;i<n;i++)
{
k=0;
while (chuoi[i]!=chuoi[k])
k++;
t[k]++;
}
for(i=0;i<n;i++)
if (t[i])
printf("\nky tu '%c' co mat trong xau %d lan\n",chuoi[i],t[i]);
printf("\nnhap vao ki tu thu nhat:");
scanf("%c",&s1);
printf("\nnhap vao ki tu thu hai:");
scanf("%c",&s2);
for(i=0;i<n;i++)
{if(chuoi[i]==s1) chuoi[i]=s2;

}
printf("\nxau:%s",chuoi);
getch();
}
2.2 Viết chương trình tính tổng 2 ma trận
Input: nhập vào 2 ma trận
Output: đưa ra tổng 2 ma trận đã nhập
Giải pháp: tính giá trị cho từng phần tử bằng tổng của các phần tử tương ứng và
Giả ngữ:
4
int a[hang][cot],b[hang][cot],c[hang][cot];
for(i=0;i<hang;i++)
for(j=0;j<cot;j++)
C[i][j]=a[i][j]+b[i][j];
2.3 Viết chương trình tính tích 2 ma trận
Input: nhập vào 2 ma trận
Output: đưa ra tích của 2 ma trận đã nhập
Giải pháp: giá trị của phần tử 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
Giả ngữ:
for(i=0;i<hang;i++)
for(j=0;j<cot;j++
{
C[i][j]=0;
for(k=0;k<cot;k++)
C[i][j]=C[i][j] + A[i][k]*B[k][j];
}
Chương trình:
#include <conio.h>
#include <stdio.h>

#define max 100
void Nhap(int A[max][max], int n)
{
for(int i = 0; i<n ; i++)
for(int j = 0; j<n ; j++)
5
{
printf("[%d][%d] =",i,j);
scanf("%d", &A[i][j]);
}
}
void Xuat(int A[max][max], int n)
{
for(int i = 0; i<n ; i++)
{
printf("\n");
for(int j = 0; j<n ; j++)
printf("%d\t",A[i][j]);
}
}
void Tong(int A[max][max], int B[max][max], int C[max][max], int n){
for(int i = 0; i<n ; i++)
for(int j = 0; j<n ; j++)
C[i][j] = A[i][j]+B[i][j];
}
void Tich(int A[max][max], int B[max][max], int C[max][max], int n)
{
for(int i = 0; i<n ; i++)
for(int k = 0; k<n ; k++)
{

6
C[i][k] = 0;
for(int j = 0; j<n ; j++)
C[i][k] = C[i][k] + A[i][j]*B[j][k];
}
}
void main()
{
int A[max][max],B[max][max], C[max][max], n;
printf("Nhap cap n= ");
scanf("%d",&n);
printf("Nhap vao ma tran A\n");
Nhap(A,n);
printf("Nhap vao ma tran B\n");
Nhap(B,n);
printf("Ma tran A vua nhap\n");
Xuat(A,n);
printf("\nMa tran B vua nhap\n");
Xuat(B,n);
Tong(A,B,C,n);
printf("\nMa tran C=A+B\n");
Xuat(C,n);
printf("\nMa tran C=A*B\n");
Tich(A,B,C,n);
Xuat(C,n);
getch();
7
}
Phần 3: con trỏ trong C/C++
3.1 Chép chương trình sau, chạy, xem kết quả rồi tìm và chỉnh sửa lỗi :

Chương trình Kết quả
#include <stdio.h>
#include <conio.h>
void main(){
int a,b,c;
int *p=&c;
c = 3;
/* divide c by itself */
a = c/*p;
b = c /* set b to 3 */ ;
printf("a=%d, b=%d, c=%d\n", a,b,c);
getch();
}
Chương trình báo lỗi
#include <stdio.h>
#include <conio.h>
void main(){
int a,b,c;
int *p=&c;
c = 3;
/* divide c by itself */
a = c/(*p); //sửa lỗi
b = c /* set b to 3 */ ;
printf("a=%d, b=%d, c=%d\n", a,b,c);
getch();
}
a=1,b=3,c=3
Kết luận:
Do trình dịch hiểu /* là bắt đầu của chú thích nên toàn bộ đoạn lệnh không được thực hiện cho
tới khi gặp */ kết thúc chú thích.

Phần 4: Hàm
4.1 XD hàm tính căn bậc ba của 1 số thực, rồi nhập dãy các số thực x1, x2, , xn và tính tổng :

Với:
8
Input: 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)
}
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define max 100
float canba(float x)
{
if(x==0) return 0;
else if(x>0) return exp(log(x)/(3*log(exp(1))));
9
else return -exp(log(-x)/(3*log(exp(1))));
}
void main()
{
float s=0,y[max],x[max];

int n,i;
printf("\n Nhap so phan tu n=");
scanf("%d",&n);
printf("\n Nhap day so thuc\n");
for(i=0;i<n;i++)
{
y[i]=0;
printf("x%d=",i+1);
scanf("%f",&x[i]);
y[i]=canba(x[i]);
s+=y[i];
}
printf("\n Tong la: %f",s);
getch();
}
Phần 5: Con trỏ và cấp phát bộ nhớ động
5.1 Viết lại chương trình 2.2,2.3 dùng cấp phát bộ nhớ động
Input: Nhập vào 2 ma trận sử dụng cấp phát bộ nhớ động
Output: Đưa ra tổng và tích của 2 ma trận
Chương trình:
10
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
typedef struct
{
int m;
int n;
int **data;
}matrix;

int allocmatrix(matrix &A)
{
int *temp;
A.data=new int*[A.m];
temp=new int[A.m*A.n];
for(int i=0;i<A.m;i++)
{
A.data[i]=temp;
temp+=A.n;
}
if(A.data==NULL) return 0;
return 1;
}
void inputmatrix(matrix &A)
{
for(int i=0;i<A.m;i++)
11
for(int j=0;j<A.n;j++)
{
printf("[%d][%d]=",i,j);
scanf("%d",A.data[i][j]);
}
}
void outputmatrix(matrix &A)
{
for(int i=0;i<A.m;i++)
{
for(int j=0;j<A.n;j++)
{
printf("\n");

scanf("%d\t",A.data[i][j]);
}
}
}
matrix tong(matrix &A,matrix &B)
{
matrix C;
C.m=A.m;
C.n=A.n;
for(int i=0;i<A.m;i++)
for(int j=0;j<A.n;j++)
C.data[i][j]=A.data[i][j]+B.data[i][j];
12
return C;
}
matrix tich(matrix &A,matrix &B)
{
int k;
matrix C;
C.m=A.m;
C.n=A.n;
for(int i=0;i<A.m;i++)
for(int j=0;j<A.n;j++)
{ C.data[i][j]=0;
for(k=0;k<A.n;k++);
C.data[i][j]=C.data[i][j]+A.data[i][k]*B.data[k][j];
}
return C;
}
void main()

{
matrix A,B,C;
printf("nhap m=");
scanf("%d",A.m);
printf("nhap n=");
scanf("%d",A.n);
B.m=A.m;B.n=A.n;
if(!allocmatrix(A)) printf("\n Khong du bo nho");
13
if(!allocmatrix(B)) { printf("\n Khong du bo nho");delete[]B.data[0];delete[]B.data;}
if(!allocmatrix(C)) { printf("\n Khong du bo
nho");delete[]A.data[0];delete[]A.data;delete[]B.data[0];delete[]B.data;return 1;}
inputmatrix(A);
inputmatrix(B);
outputmatrix(A);
outputmatrix(B);
printf("\n Tong 2 ma tran:");
C=tong(A,B);
outputmatrix(C);
printf("\n Tich 2 ma tran:");
C=tich(A,B);
outputmatrix(C);
delete[]A.data[0];
delete[]A.data;
delete[]B.data[0];
delete[]B.data;
delete[]C.data[0];
delete[]C.data;
getch();
}

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ố.
Output: đưa ra cấu trúc phân số đa năng hóa các toán tử của phân số
14
Giải pháp Mã giả
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ố.
typedef struct{
int t;
int m;
}ps;
ps setPS(int a,int b){
ps p;
p.t=a;p.m=b;
return p;
}
Tối giản: tìm ước số chung của tử và mẫu rồi chia cả tử và
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:
#include<stdio.h>
#include<conio.h>
typedef struct
{
int t;
int m;
}ps;
ps setPS(int a,int b)
{
ps p;
p.t=a;
15
p.m=b;
return p;
}
int USCLN(int a, int b)
{
if(a==0) return b;
return USCLN(b%a,a);
}
ps tgian(ps &p)
{
int temp=USCLN(p.t,p.m);
p.t /= temp;
p.m /= temp;

return p;
}
ps operator+(ps p1,ps p2)
{
p1.t=p1.t*p2.m+p2.t*p1.m;
p1.m=p1.m*p2.m;
return tgian(p1);
}
ps operator+(ps p,int k)
{
p.t=p.t+k*p.m;
return tgian(p);
16
}
ps operator-(ps p1,ps p2)
{
p1.t=p1.t*p2.m-p2.t*p1.m;
p1.m=p1.m*p2.m;
return tgian(p1);
}
ps operator-(ps p,int k)
{
p.t=p.t-k*p.m;
return tgian(p);
}
ps operator*(ps p1,ps p2)
{
p1.t=p1.t*p2.t;
p1.m=p1.m*p2.m;
return tgian(p1);

}
ps operator*(ps p,int k)
{
p.t=p.t*k;
return tgian(p);
}
ps operator/(ps p1,ps p2)
{
17
p1.t=p1.t*p2.m;
p1.m=p1.m*p2.t;
return tgian(p1);
}
ps operator/(ps p,int k)
{
p.m=p.m*k;
return tgian(p);
}
ps& operator++(ps p)
{
p.t=p.t+p.m;
return p;
}
ps operator++(ps p,int)
{
ps temp=p;
p.t=p.t+p.m;
return tgian(temp);
}
ps& operator (ps p)

{
p.t=p.t+p.m;
return p;
}
18
ps operator (ps p,int)
{
ps temp=p;
p.t=p.t+p.m;
return tgian(temp);
}
6.2 Áp dụng cấu trúc phân số cùng các hàm và toán tử trên, viết chương trình nhập các phân số
p1,p2,p3 và số nguyên a,b rồi tính và in ra giá trị các biểu thức:
Chương trình:
void main()
{
ps p1,p2;
int a,b,i;
int t,m;
printf("\n tu so:");scanf("%d",&t);
printf("\n mau so:");scanf("%d",&m);
p1=setPS(t,m);
printf("\n Nhap vao so nguyen: a=");scanf("%d",&a);
b= a++ + 2 * a;
printf("\na=%d,b=%d",a,b);
b= ++a + 2 * a;
printf("\na=%d,b=%d",a,b);
b= (2*a)+ ++a;
printf("\na=%d,b=%d",a,b);
b= (2*a)+ a++;

19
printf("\na=%d,b=%d",a,b);
b= ++a + (2*a);
printf("\na=%d,b=%d",a,b);
p2=operator++(p1,1) + (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);
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
a=2,b=3
a=3,b=9
a=4,b=10
a=5,b=12
a=6,b=18
p1=1/1,p2=3/1
p1=1/1,p2=3/1
p1=1/1,p2=4/1

p1=1/1,p2=4/1
p1=1/1,p2=3/1
p1=1/1,p2=4/1
p1=1/1,p2=3/1
20
Cá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
Giải pháp Mã giả
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){
time t;
t.gio=g/3600;
t.giay=(g-t.gio*3600)/60;
t.phut=g-t.gio*3600-t.phut*60;
return t;
}
Đ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){
long int g1,g2;
g1=giay(t1);g2=giay(t2);
g1=g1+g2;
return gio(g1);
time operator+(time t,int k){
long int g;
g=giay(t);
if(k>0&&k<=12)
g+=k*3600;
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>
typedef struct
21
{
int gio;
int phut;
int giay;
}time;
time setT(int a,int b,int c)

{
time t;
t.gio=a;
t.phut=b;
t.giay=c;
return t;
}
long int giay(time t)
{
return t.gio*3600+t.phut*60+t.giay;
}
time gio(long int g)
{
time t;
t.gio=g/3600;
t.phut=(g-t.gio*3600)/60;
t.giay=g-t.gio*3600-t.phut*60;
return t;
}
22
time operator+(time t1,time t2)
{
long int g1,g2;
g1=giay(t1);
g2=giay(t2);
g1+=g2;
return gio(g1);
}
time operator+(time t,int k)
{

long int g;
g=giay(t);
g+=k;
return gio(g);
}
time operator-(time t1,time t2)
{
long int g1,g2;
g1=giay(t1);
g2=giay(t2);
g1-=g2;
return gio(g1);
}
time operator-(time t,int k)
{
23
long int g;
g=giay(t);
g-=k;
return gio(g);
}
time operator++(time t)
{
long int g;
g=giay(t);
g+=3600;
return gio(g);
}
time operator (time t)
{

long int g;
g=giay(t);
if(g>=3600) g-=3600;
else g=0;
return gio(g);
}
void main()
{
int h1,m1,s1,h2,m2,s2;
int k;
time t1,t2,t;
24
do{
printf("\n Nhap vao gio:");
scanf("%d",&h1);
}while(h1<0||h1>12);
do{
printf("\n Nhap vao phut:");
scanf("%d",&m1);
}while(m1<0||m1>60);
do{
printf("\n Nhap vao giay:");
scanf("%d",&s1);
}while(s1<0||s1>60);
t1=setT(h1,m1,s1);
do{
printf("\n Nhap vao gio:");
scanf("%d",&h2);
}while(h2<0||h2>12);
do{

printf("\n Nhap vao phut:");
scanf("%d",&m2);
}while(m2<0||m2>60);
do{
printf("\n Nhap vao giay:");
scanf("%d",&s2);
}while(s2<0||s2>60);
25

×