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

19 đề cấu trúc dữ liệu và giải thuật có đáp án cài đặt bằng ngôn ngữ c

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 (379.83 KB, 68 trang )

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 1
Viết chương trình tìm X = (x1, x2,..,xn) và giá trị f(X) của hàm
đạt giá trị lớn nhất. Trong đó
, ci, ai, b là các số nguyên dương, n 100.
Dữ liệu vào n, cj, aj, b được cho trong file data.in theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên n và b. Hai số được ghi cách nhau
bởi một vài ký tự trống;



Dòng kế tiếp ghi lại n số ci (i=1, 2, .., n). Hai số được ghi cách nhau
bởi một vài ký tự trống;



Dòng cuối cùng ghi lại n số ai (i = 1, 2, ..,n). Hai số được ghi cách
nhau bởi một vài ký tự trống.

Giá trị tối ưu f(x1,x2,..,xn) và phương án tối ưu X = (x1, x2,..,xn) tìm được ghi
lại trong file ketqua.out theo khn dạng sau:


Dịng đầu tiên ghi lại giá trị tối ưu f(x1,x2,..,xn);



Dòng kế tiếp ghi lại phương án tối ưu X = (x1, x2,..,xn). Hai phần tử
khác nhau của X được ghi cách nhau bởi một vài khoảng trống.



Ví dụ dưới đây sẽ minh họa cho file data.in và ketqua.out của bài toán:
Data.in
4 10
5193
5364
#include
#include
#include
int n, b, C[100], A[100], X[100], max = 0, R[100];
int kt() {
int i = 1, f = 0;
for (i = 1; i <= n; i++)
f = f + A[i] * X[i];
if (f > b) return 0;
return 1;
}
int tinhF() {
int f = 0;
for (int i = 1; i <= n; i++)


f = f + C[i] * X[i];
return f;
}
void thuchien(int k) {
for (int i = 0; i <= 1; i++) {
X[k] = i;
if (k == n) {
if (kt() == 1 && tinhF() > max) {

max = tinhF();
for (int j = 1; j <= n; j++)
R[j] = X[j];
}
} else thuchien(k + 1);
}
}
main() {
ifstream data("C:/cau truc du lieu/dethi/data1.in.txt");
data >> n >> b;
for (int i = 1; i <= n; i++)
data >> C[i];
for (int i = 1; i <= n; i++)
data >> A[i];
max = 0;
ofstream dataout("C:/cau truc du lieu/dethi/ketqua1.out.txt");
thuchien(1);
dataout << max << endl;
for (int i = 1; i <= n; i++)
dataout << R[i] << " ";
dataout << endl;
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 2
Cho dãy A[] gồm N số tự nhiên khác nhau và số tự nhiên K. Hãy viết
chương trình liệt kê tất cả các dãy con của dãy số A[] sao cho tổng các
phần tử trong dãy con đó đúng bằng K. Dữ liệu vào cho bởi file dayso.in
theo khn dạng sau:



Dịng đầu tiên ghi lại số tự nhiên N là số các số của dãy số A[] và số
tự nhiên K, hai số được viết cách nhau bởi một vài khoảng trống;



Dòng kế tiếp ghi lại N số của dãy số A[], hai số được viết cách nhau
một vài khoảng trống.

Các dãy con thoả mãn điều kiện tìm được ghi lại trong file ketqua.out theo
khn dạng sau:


Dịng đầu tiên ghi lại số các dãy con có tổng các phần tử đúng bằng
K tìm được;



Những dịng kế tiếp mỗi dòng ghi lại một dãy con. Hai phần tử khác
nhau của dãy con được viết cách nhau bởi một vài khoảng trống.

Ví dụ dưới đây sẽ minh hoạ cho file dayso.in và ketqua.out của bài toán.


Dayso.in
7 50

7

5 10 15 20 25 30 35


20 30

15 35
5 20
5 15
5 10
5 10
5 10
#include
#include
#include
#include
ofstream dataout("C:/cau truc du lieu/dethi/ketqua2.out.txt");
ifstream data("C:/cau truc du lieu/dethi/data2.in.txt");
int n, b, C[100], X[100], max = 0;
/*
Tim tat ca cac day con co tong la mot so nhap tu tep
*/
int tinhF() {
int f = 0;
for (int i = 1; i <= n; i++)
f = f + C[i] * X[i];
return f;
}
void hienthi() {
for (int i = 1; i <= n; i++)
if (X[i] == 1) dataout << C[i] << " ";
dataout << endl;
}

int demthuchien(int k) {
for (int i = 0; i <= 1; i++) {
X[k] = i;
if (k == n) {
if (tinhF() == b) max++;
} else demthuchien(k + 1);
}
}
void thuchien(int k) {
for (int i = 0; i <= 1; i++) {
X[k] = i;


if (k == n) {
if (tinhF() == b) hienthi();
} else thuchien(k + 1);
}
}
main() {
data >> n >> b;
for (int i = 1; i <= n; i++)
data >> C[i];
max = 0;
demthuchien(1);
dataout << max << endl;
thuchien(1);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 3

Cho dãy gồm n số tự nhiên phân biệt a1, a2, .., an và số tự nhiên B. Hãy liệt
kê tất cả các phần tử của tập ;
Dữ liệu vào cho bởi file data.in theo khuôn dạng như sau:


Dòng đầu tiên ghi lại hai số tự nhiên n và B. Hai số được viết cách
nhau bởi một vài khoảng trống.



Dòng kế tiếp ghi lại n số nguyên dương a1, a2,..,an. Hai số khác nhau
được viết cách nhau bởi một vài kí tự trống.

Kết quả ra ghi lại trong file ketqua.out theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên k là số phần tử của tập D.



k dòng tiếp theo mỗi dòng ghi lại một vector nhị phân x = (x1, x2 ,..,
xn) là phần tử của D. Hai thành phần khác nhau của vector x được
viết cách nhau bởi một vài khoảng trống.

Ví dụ với n =7, B = 25, { a1, a2, a3, a4, a5, a6, a7} = {5, 10, 15, 20, 25, 30,
35} trong file data.in sẽ cho ta 3 phần tử của tập D tương ứng với 3 vector
nhị phân độ dài n trong file ketqua.out dưới đây:
Data.in

7 25


3

5 10 15 20 25

000
100
011

#include


#include
#include
#include
int n, b, C[100], X[100], max = 0;
ofstream dataout("C:/cau truc du lieu/dethi/ketqua3.out.txt");
/*
Tim so cac sau nhi phan co tong la so nhap tu tep
*/
int tinhF() {
int f = 0;
for (int i = 1; i <= n; i++)
f = f + C[i] * X[i];
return f;
}
void hienthi() {
for (int i = 1; i <= n; i++)
dataout << X[i] << " ";
dataout << endl;

}
int demthuchien(int k) {
for (int i = 0; i <= 1; i++) {
X[k] = i;
if (k == n) {
if (tinhF() == b) max++;
} else demthuchien(k + 1);
}
}
void thuchien(int k) {
for (int i = 0; i <= 1; i++) {
X[k] = i;
if (k == n) {
if (tinhF() == b) hienthi();
} else thuchien(k + 1);
}
}
main() {
ifstream data("C:/cau truc du lieu/dethi/data3.in.txt");
data >> n >> b;
for (int i = 1; i <= n; i++)
data >> C[i];
max = 0;
demthuchien(1);
dataout << max << endl;
thuchien(1);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 4



Ta định nghĩa một từ là dãy các kí tự khơng chứa khoảng trống (space),
dấu tab, dấu xuống dịng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng
(‘\0’). Cho file văn bản DATA.IN. Hãy sử dụng biểu diễn thích hợp bằng
danh sách liên kết đơn hoặc danh sách liên kết kép để tìm tập các từ và số
lần xuất xuất hiện của mỗi từ trong file văn bản DATA.IN. Tập từ tìm được
ghi lại trong file KETQUA.OUT theo khn dạng sau:
o

Dịng đầu tiên ghi lại số tự nhiên K là số từ xuất hiện trong file
DATA.IN;

o

K dòng kế tiếp, mỗi dòng ghi lại một từ và số lần xuất hiện của
từ đó trong file DATA.IN.

Ví dụ dưới đây sẽ minh họa cho file DATA.IN và KETQUA.OUT của bài
toán:
DATA.IN
A AB AC AD AE A

6

AB AE AF

A2
AB 2
AC 1

AD 1
AE 2
AF 1

#include
#include
#include
#include
ifstream tepvao("C:/cau truc du lieu/dethi/data4.in.txt");
ofstream tepra("C:/cau truc du lieu/dethi/ketqua4.out.txt");
/*
So lan xuat hien 1 tu trong xau
*/
void nhapDL(char S[][60], int & i) {
i = 0;
while (1) {
i++;
tepvao >> S[i];
if (S[i][0] == '\0') break;
}
}


int demdem(char S[][60], int i) {
int x[1000], dem = 0;
for (int k = 1; k <= i; k++)
x[k] = 0;
for (int j = 1; j < i; j++)
if (x[j] == 0) {
dem++;

for (int k = j; k <= i; k++)
if (strcmp(S[k], S[j]) == 0) x[k] = 1;
}
tepra << dem << endl;
return dem;
}
void inKetQua(char S[][60], int i) {
for (int j = 1; j <= i; j++) {
if (S[j][0] != '\0') {
int dem = 1;
for (int k = j + 1; k <= i; k++)
if (strcmp(S[k], S[j]) == 0) {
S[k][0] = '\0';
dem++;
}
tepra << S[j] << " " << dem << endl;
S[j][0] = '\0';
}
}
}
main() {
char S[1000][60];
int n;
nhapDL(S, n);
demdem(S, n);
inKetQua(S, n);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 5

Ta định nghĩa một từ là dãy các kí tự khơng chứa khoảng trống (space),
dấu tab, dấu xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng
(‘\0’). Cho file văn bản DATA.IN. Hãy sử dụng biểu diễn thích hợp để có thể
sử dụng cây nhị phân tìm kiếm để tìm tập các từ và số lần xuất xuất hiện
của mỗi từ trong file văn bản DATA.IN. Tập từ tìm được ghi lại trong file
KETQUA.OUT theo khn dạng sau:
o

Dịng đầu tiên ghi lại số tự nhiên K là số từ xuất hiện trong file
DATA.IN;

o

K dòng kế tiếp, mỗi dòng ghi lại một từ và số lần xuất hiện của
từ đó trong file DATA.IN.

Ví dụ dưới đây sẽ minh họa cho file DATA.IN và KETQUA.OUT của bài
toán:


DATA.IN
A AB AC AD AE A

6

AB AE AF

A2
AB 2
AC 1

AD 1
AE 2
AF 1

#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
ifstream tepvao("C:/cau truc du lieu/dethi/data5.in.txt");
ofstream tepra("C:/cau truc du lieu/dethi/ketqua5.out.txt");
/*
So lan xuat hien 1 tu trong xau
*/
void nhapDL(char S[][60],int &i)
{
i=0;
while(1)
{
i++;
tepvao>>S[i];
if(S[i][0]=='\0')break;
}
}
int demdem(char S[][60],int i)
{
int x[1000],dem=0;
for(int k=1;k<=i;k++)
x[k]=0;
for(int j=1;jif(x[j]==0)

{dem++;
for(int k=j;k<=i;k++)
if(strcmp(S[k],S[j])==0)x[k]=1;
}
tepra<return dem;
}
void inKetQua(char S[][60],int i)
{
for(int j=1;j<=i;j++)
{
if(S[j][0]!='\0')
{
int dem=1;
for(int k=j+1;k<=i;k++)


if(strcmp(S[k],S[j])==0)
{
S[k][0]='\0';
dem++;
}
tepra<S[j][0]='\0';
}
}
}
main()
{
char S[1000][60];

int n;
nhapDL(S,n);
demdem(S,n);
inKetQua(S,n);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 6
Cho file dữ liệu trungto.in theo khuôn dạng sau:


Dòng đầu tiên ghi lại số tự nhiên N là số các biểu thức số học được
biểu diễn dưới dạng trung tố;



N dòng kế tiếp, mỗi dòng ghi lại một biểu thức trung tố.

Hãy sử dụng cấu trúc dữ liệu kiểu ngăn xếp viết chương trình dịch chuyển
các biểu thức trung tố trong file trungto.in thành file hauto.out. Các biểu
thức hậu tố dịch chuyển được ghi lại trong file hauto.out theo khn dạng
sau:


Dịng đầu tiên ghi lại số tự nhiên N là số các biểu thức hậu tố dịch
chuyển được;



N dòng kế tiếp, mỗi dòng ghi lại một biểu thức hậu tố.


Ví dụ dưới đây sẽ minh họa cho file trungto.in và hauto.out.
trungto.in

hauto

4

4

(a+b)

ab+

(a-b)

ab–

(a/b)

ab/

(a*b)

ab*

(a + b) * ( a – b)

ab+



#include<iostream.h>
#include<malloc.h>
#include<fstream.h>
#include<string.h>
ifstream tepvao("C:/cau truc du lieu/dethi/trungto.in.txt");
ofstream tepra("C:/cau truc du lieu/dethi/hauto.out.txt");
/*
Chuyen tu trung to sang hau to
*/
struct node
{
char conyeu;
struct node *next;
};
typedef struct node *stacknode;
typedef struct
{
stacknode top;
}Stack;
Stack dau;
void KhoiTaoStack(Stack *S)
{
S->top=NULL;
return ;
}
int StackRong(Stack S)
{
return (S.top==NULL);
}

void PUSHStack(Stack *S,char x)
{
stacknode p;
p=(stacknode)malloc(sizeof(struct node));
p->conyeu=x;
p->next=S->top;
S->top=p;
return ;
}
char POPStack(Stack *S)
{
stacknode p;
if(StackRong(*S))
{
return -1;
}else
{
p=S->top;
S->top=S->top->next;
return p->conyeu;
}
}
char xemdinh(Stack *S)


{

stacknode p;
if(StackRong(*S)){return '\0';}
p=S->top;

return p->conyeu;

}
int pri(char x)
{
if(x=='^')return 3;
if(x=='*'||x=='/')return 2;
if(x=='+'||x=='-')return 1;
return 0;
}
void hauto(char S[])
{
int n=strlen(S);
Stack cun;
KhoiTaoStack(&cun);
for(int i=0;i{
if(S[i]=='(')PUSHStack(&cun,S[i]);
else if(S[i]==')')
{
while(1)
{
if(xemdinh(&cun)=='(')
{POPStack(&cun);break;}
else
if(pri(xemdinh(&cun))>=1)tepra<else if(StackRong(cun))break;
}
if(xemdinh(&cun)=='(')POPStack(&cun);
}

else if(pri(S[i])>=1)
{
while(1)
{
if(StackRong(cun)||xemdinh(&cun)=='(')
{
PUSHStack(&cun,S[i]);
break;
}
else if(pri(xemdinh(&cun)){
PUSHStack(&cun,S[i]);
break;
}
else tepra<}
}
else tepra<}
while(StackRong(cun)!=1)tepra<tepra<}
void NhapDL(char S[][600],int &n)
{
tepvao>>n;


for(int i=1;i<=n;i++)
tepvao>>S[i];
}

void InKetQua(char S[][600],int n)
{
tepra<for(int i=1;i<=n;i++)
hauto(S[i]);
}
main()
{
char S[1000][600];
int n;
NhapDL(S,n);
InKetQua(S,n);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 7
Cho file dữ liệu hauto.in theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên N là số các biểu thức số học được
biểu diễn dưới dạng hậu tố;



N dòng kế tiếp, mỗi dòng ghi lại một biểu thức hậu tố.

Hãy sử dụng cấu trúc dữ liệu kiểu ngăn xếp viết chương trình tính tốn giá
trị của các biểu thức hậu tố trong file hauto.in. Các biểu thức hậu tố dịch
chuyển được ghi lại trong file ketqua.out theo khn dạng sau:



Dịng đầu tiên ghi lại số tự nhiên N là số các biểu thức hậu tố;



N dòng kế tiếp, mỗi dòng ghi lại giá trị của một biểu thức hậu tố trong
file.

Ví dụ dưới đây sẽ minh họa cho file hauto.in và ketqua.out.
hauto.out
4
32+
32–
32/
32*
32+32-*

ketqu
4
5
1
1
6
5


#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>

#include<stdio.h>
#include <math.h>
ifstream tepvao("C:/cau truc du lieu/dethi/hauto.in.txt");
ofstream tepra("C:/cau truc du lieu/dethi/ketqua7.out.txt");
/*
Tinh ket qua hau to
*/
struct node
{
int conyeu;
struct node *next;
};
typedef struct node *stacknode;
typedef struct
{
stacknode top;
}Stack;
Stack dau;
void KhoiTaoStack(Stack *S)
{
S->top=NULL;
return ;
}
int StackRong(Stack S)
{
return (S.top==NULL);
}
void PUSHStack(Stack *S,int x)
{
stacknode p;

p=(stacknode)malloc(sizeof(struct node));
p->conyeu=x;
p->next=S->top;
S->top=p;
return ;
}
int POPStack(Stack *S)
{
stacknode p;
if(StackRong(*S))
{
return -1;
}else
{
p=S->top;
S->top=S->top->next;
return p->conyeu;
}
}
int xemdinh(Stack *S)
{
stacknode p;
if(StackRong(*S)){return -1;}
p=S->top;


return p->conyeu;
}
int ket(char S)
{

int k=int (S);
int h=k-int ('0');
return h;
}
int chuyen(char S[])
{int j=0,k=0;
for(int i=strlen(S)-1;i>=0;i--)
{k+=ket(S[i])*pow(10,j);j++;}
return k;
}
void NhapDL(char S[][600],int &n)
{
tepvao>>n;
for(int i=0;i<=n;i++)
tepvao.getline(S[i],600,'\n');
}
void ketqua(char S[])
{
int i=0;
KhoiTaoStack(&dau);
while(S[i]!='\0')
{
if(S[i]>='0'&&S[i]<='9')
{
char SS[600];
int k=0;
while(S[i]>='0'&&S[i]<='9')
{
SS[k]=S[i];
k++;

i++;
}
SS[k]='\0';
PUSHStack(&dau,chuyen(SS));
}
else if(S[i]=='+')
{
int a=POPStack(&dau);
int b=POPStack(&dau);
PUSHStack(&dau,a+b);
}
else if(S[i]=='-')
{
int a=POPStack(&dau);
int b=POPStack(&dau);
PUSHStack(&dau,b-a);
}
else if(S[i]=='*')
{
PUSHStack(&dau,POPStack(&dau)*POPStack(&dau));
}


else if(S[i]=='/')
{
int a=POPStack(&dau);
int b=POPStack(&dau);
PUSHStack(&dau,b/a);
}
i++;if(S[i]==' ')i++;

}
int k=POPStack(&dau);
if(StackRong(dau))tepra<{while(StackRong(dau)!=1)
{
k=POPStack(&dau);
}
tepra<}
main()
{
char S[1000][600];
int n;
NhapDL(S,n);
tepra<for(int i=1;i<=n;i++)
ketqua(S[i]);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 8
Cho hai đa thức A bậc n và đa thức B bậc m được ghi lại tương ứng trong
file dathuc1.in và dathuc2.in theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên K là số các số hạng của đa thức;



K dòng kế tiếp, mỗi dòng ghi lại hệ số và số mũ của số hạng hạng đa

thức.

Hãy viết chương trình tính tổng hai đa thức A và B và ghi lại đa thức kết
quả vào file ketqua.out theo khuôn dạng như trên. Ví dụ với đa thức
sẽ được biểu diễn và tính tốn cho ra file kết quả sau
dathuc1.in

dathuc2.in

10 30000

8 20000

5 1000

3 1000

32

3 500


30

7 100
61

#include<iostream.h>
#include<math.h>
#include<fstream.h>

ifstream datain1("C:/cau truc du lieu/dethi/dathuc1.in.txt");
ifstream datain2("C:/cau truc du lieu/dethi/dathuc2.in.txt");
ofstream dataout("C:/cau truc du lieu/dethi/ketqua8.out.txt");
int HSA[100],HSB[100],HSC[200],MUA[100],MUB[100],MUC[200],na,nb;
/*
Tinh tong da thuc
*/
void nhap1(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
{
datain1>>HS[i]>>MU[i];
}
}
void nhap2(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
{
datain2>>HS[i]>>MU[i];
}
}
void tinh(int &dem)
{
if(na>nb)
{dem=0;
for(int j=nb+1;j<=na;j++)
{MUB[j]=MUA[j];HSB[j]=0;}
for(int j=1;j<=na;j++)
if(MUA[j]!=MUB[j])
{

dem++;
MUC[dem]=MUA[j];
dem++;
MUC[dem]=MUB[j];
}
else
{
dem++;
MUC[dem]=MUA[j];
}


for(int j=1;j<=dem;j++)
{
for(int i=1;i<=na;i++)
if(MUC[j]==MUA[i]&&MUC[j]==MUB[i])
{
HSC[j]=HSA[i]+HSB[i];
}
else
if(MUC[j]==MUA[i])HSC[j]=HSA[i];
else if(MUC[j]==MUB[i])HSC[j]=HSB[i];
}
}
else
{dem=0;
for(int j=na+1;j<=nb;j++)
{MUA[j]=MUB[j];HSA[j]=0;}
for(int j=1;j<=nb;j++)
if(MUA[j]!=MUB[j])

{
dem++;
MUC[dem]=MUA[j];
dem++;
MUC[dem]=MUB[j];
}
else
{
dem++;
MUC[dem]=MUA[j];
}
for(int j=1;j<=dem;j++)
{
for(int i=1;i<=nb;i++)
if(MUC[j]==MUA[i]&&MUC[j]==MUB[i])
{
HSC[j]=HSA[i]+HSB[i];
}
else
if(MUC[j]==MUA[i])HSC[j]=HSA[i];
else if(MUC[j]==MUB[i])HSC[j]=HSB[i];
}
}
}
void hienthi(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
if(HS[i]!=0)dataout<}
main()

{
int dem;
datain1>>na;
nhap1(MUA,HSA,na);
datain2>>nb;
nhap2(MUB,HSB,nb);
tinh(dem);
dataout<for(int j=1;j<=dem;j++)


for(int h=j+1;h<=dem;h++)
if(MUC[j]{
int t,u;
t=MUC[j];
u=HSC[j];
HSC[j]=HSC[h];
HSC[h]=u;
MUC[j]=MUC[h];
MUC[h]=t;
}
hienthi(MUC,HSC,dem);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 9
Cho hai đa thức A bậc n và đa thức B bậc m được ghi lại tương ứng trong
file dathuc1.in và dathuc2.in theo khn dạng sau:



Dịng đầu tiên ghi lại số tự nhiên K là số các số hạng của đa thức;



K dòng kế tiếp, mỗi dòng ghi lại hệ số và số mũ của số hạng hạng đa
thức.

Hãy viết chương trình tính hiệu hai đa thức A và B và ghi lại đa thức kết
quả vào file ketqua.out theo khn dạng như trên. Ví dụ với đa thức
sẽ được biểu diễn và tính tốn cho ra file kết quả sau
dathuc1.in

dathuc2.in

10 30000

8 20000

5 1000

3 1000

32

3 500

30

7 100

61

#include<iostream.h>
#include<math.h>
#include<fstream.h>
ifstream datain1("C:/cau truc du lieu/dethi/dathuc91.in.txt");
ifstream datain2("C:/cau truc du lieu/dethi/dathuc92.in.txt");
ofstream dataout("C:/cau truc du lieu/dethi/ketqua9.out.txt");


int HSA[100],HSB[100],HSC[200],MUA[100],MUB[100],MUC[200],na,nb;
/*
Tinh hieu da thuc
*/
void nhap1(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
{
datain1>>HS[i]>>MU[i];
}
}
void nhap2(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
{
datain2>>HS[i]>>MU[i];
}
}
void tinh(int &dem)
{

if(na>nb)
{dem=0;
for(int j=nb+1;j<=na;j++)
{MUB[j]=MUA[j];HSB[j]=0;}
for(int j=1;j<=na;j++)
if(MUA[j]!=MUB[j])
{
dem++;
MUC[dem]=MUA[j];
dem++;
MUC[dem]=MUB[j];
}
else
{
dem++;
MUC[dem]=MUA[j];
}
for(int j=1;j<=dem;j++)
{
for(int i=1;i<=na;i++)
if(MUC[j]==MUA[i]&&MUC[j]==MUB[i])
{
HSC[j]=HSA[i]-HSB[i];
}
else
if(MUC[j]==MUA[i])HSC[j]=HSA[i];
else if(MUC[j]==MUB[i])HSC[j]=-HSB[i];
}
}
else

{dem=0;
for(int j=na+1;j<=nb;j++)
{MUA[j]=MUB[j];HSA[j]=0;}
for(int j=1;j<=nb;j++)
if(MUA[j]!=MUB[j])


{
dem++;
MUC[dem]=MUA[j];
dem++;
MUC[dem]=MUB[j];
}
else
{
dem++;
MUC[dem]=MUA[j];
}
for(int j=1;j<=dem;j++)
{
for(int i=1;i<=nb;i++)
if(MUC[j]==MUA[i]&&MUC[j]==MUB[i])
{
HSC[j]=HSA[i]-HSB[i];
}
else
if(MUC[j]==MUA[i])HSC[j]=HSA[i];
else if(MUC[j]==MUB[i])HSC[j]=-HSB[i];
}
}

}
void hienthi(int MU[],int HS[],int n)
{
for(int i=1;i<=n;i++)
if(HS[i]!=0)dataout<}
main()
{
int dem;
datain1>>na;
nhap1(MUA,HSA,na);
datain2>>nb;
nhap2(MUB,HSB,nb);
tinh(dem);
dataout<for(int j=1;j<=dem;j++)
for(int h=j+1;h<=dem;h++)
if(MUC[j]{
int t,u;
t=MUC[j];
u=HSC[j];
HSC[j]=HSC[h];
HSC[h]=u;
MUC[j]=MUC[h];
MUC[h]=t;
}
hienthi(MUC,HSC,dem);
}


ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CĨ ĐÁP ÁN CÀI ĐẶT BẰNG
NGƠN NGỮ C - ĐỀ SỐ 10


Cho dãy gồm N số nguyên A[] = {a1, a2, .., aN } và số tự nhiên K ( KN100). Hãy viết chương
trình liệt kê tất cả các dãy con K phần tử giảm của dãy số A[].
Dữ liệu vào cho bởi file dayso.in theo khn dạng sau:


Dịng đầu tiên ghi lại hai số tự nhiên N, K. Hai số được viết cách nhau
một vài khoảng trống;



Những dòng kế tiếp ghi lại N số nguyên của dãy số A[], hai số khác nhau
được viết cách nhau một vài khoảng trống.

Các dãy con K phần tử giảm dần của dãy số A[] tìm được ghi lại trong file ketqua.out theo khn
dạng:


Dịng đầu tiên ghi lại số tự nhiên M là số các dãy con K phần tử giảm dần của dãy số A[]
tìm được;



M dịng kế tiếp, mỗi dịng ghi lại một dãy con. Hai phần tử khác nhau của dãy con được
viết cách nhau bởi một vài khoảng trống.

Ví dụ với file dayso.in dưới đây sẽ cho ta file ketqua.out tương ứng.


dayso.in
53

5

52431

521
543
541
531
431

#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include<conio.h>
#include<time.h>
ifstream datain("C:/cau truc du lieu/dethi/dayso.in.txt");
ofstream dataout("C:/cau truc du lieu/dethi/ketqua10.out.txt");
int X[100],A[100],n,k,dem1;
/*
Liet ke cac to hop chap k cua n
Thoa man DK nao do
*/
int kt()
{
int dem=0;
for(int i=1;i<=n;i++)

if(X[i]==1)dem++;
if(dem==k)return 1;
return 0;
}
int ketqua(int G[],int k)
{
for(int i=2;i<=k;i++)
if(G[i]>=G[i-1])return 0;


return 1;
}
void thuchien(int j)
{
for(int i=0;i<=1;i++)
{
X[j]=i;
if(j==n)
{
if(kt()==1)
{int dem=0,G[100];
for(int h=1;h<=n;h++)
if(X[h]==1){
dem++;
G[dem]=A[h];
}
if(ketqua(G,dem)==1){dem1++;}
}
}
else thuchien(j+1);

}
}
void ketquara(int j)
{
for(int i=1;i>=0;i--)
{
X[j]=i;
if(j==n)
{
if(kt()==1)
{int dem=0,G[100];
for(int h=1;h<=n;h++)
if(X[h]==1){
dem++;
G[dem]=A[h];
}
if(ketqua(G,dem)==1){for(int h=1;h<=n;h+
+)if(X[h]==1)dataout<dataout<}
}
else ketquara(j+1);
}
}
main()
{
datain>>n>>k;
for(int i=1;i<=n;i++)
datain>>A[i];
dem1=0;

thuchien(1);
dataout<ketquara(1);
}


ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 11
Cho đồ thị vô hướng G =<V, E> gồm N đỉnh và M cạnh được biểu diễn
dưới dạng danh sách kề trong file dske.in theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;



N dòng kế tiếp mỗi dòng ghi lại danh sách kề của đỉnh tương ứng.
Hai đỉnh trong cùng một danh sách kề được phân biệt với nhau bằng
một hoặc vài kí tự trống, đỉnh khơng có cạnh nối với nó (đỉnh cơ lập)
được ghi giá trị 0.

Hãy viết chương trình chuyển đổi biểu diễn đồ thị G dưới dạng danh sách
kề thành biểu diễn của đồ thị G dưới dạng ma trận kề và danh sách cạnh.
Khuôn dạng biểu diễn đồ thị G dưới dạng ma trận kề, danh sách kề được
ghi lại trong file mtke.out và dscanh.out theo khuôn dạng sau:
Khn dạng file mtke.out:


Dịng đầu tiên ghi lại số tự nhiên n là số đỉnh của đồ thị;




N dòng kế tiếp ghi lại ma trận kề của đồ thị, hai phần tử khác nhau
của ma trận kề được ghi cách nhau bởi một vài ký tự trống.

Khuôn dạng file dscanh.out


Dòng đầu tiên ghi lại số tự nhiên N và M tương ứng với số đỉnh và số
cạnh của đồ thị, hai số được ghi cách nhau bởi một vài ký tự trống;



M dòng kế tiếp mỗi dòng ghi lại một cạnh của đồ thị, đỉnh đầu và đỉnh
cuối của mỗi cạnh được ghi cách nhau bởi một vài ký tự trống.

Ví dụ đồ thị gồm 5 đỉnh, 4 cạnh được biểu diễn trong file dske.in như dưới
đây sẽ cho ta các file mtke.out và dscanh.out tương ứng.
dske.in

mtke.out

5

5

23

01100


14

10010

15

10001

2

01000

3

00100

#include<iostream.h>
#include<fstream.h>


#include<math.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#include<stdio.h>
ifstream datain("C:/cau truc du lieu/dethi/dske.in.txt");
ofstream dataout1("C:/cau truc du lieu/dethi/mtke.out.txt");
ofstream dataout2("C:/cau truc du lieu/dethi/dscanh.out.txt");
/*
Chuyen danh sach ke sang ma tran ke va danh sach canh

*/
char S[100][200];
void NhapDL(int &n)
{
datain>>n;
for(int i=0;i<=n;i++)
datain.getline(S[i],200,'\n');
}
int ket(char S)
{
int k=int (S)-int ('0');
return k;
}
int chuyen(char S[])
{int j=0,k=0;
for(int i=strlen(S)-1;i>=0;i--)
{k+=ket(S[i])*pow(10,j);j++;}
return k;
}
void ChuyenKe(int a[][100],int aa[100],int bb[100],int n)
{
int dem=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=0;
for(int i=1;i<=n;i++)
{
int j=0;
while(S[i][j]!='\0')
{

if(S[i][j]>='0'&&S[i][j]<='9')
{
char SS[200];
int k=0;
while(S[i][j]>='0'&&S[i][j]<='9')
{
SS[k]=S[i][j];
k++;
j++;
}
SS[k]='\0';j++;
a[i][chuyen(SS)]=1;
a[chuyen(SS)][i]=1;
if(chuyen(SS)>i){dem++;
aa[dem]=i;


bb[dem]=chuyen(SS);}
}
}
}
dataout1<for(int i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
dataout1<dataout1<}
dataout2<for(int i=1;i<=dem;i++)
dataout2<

}
main()
{
int n;
NhapDL(n);
int a[100][100],bb[100],cc[100];
ChuyenKe(a,bb,cc,n);
}

ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CÓ ĐÁP ÁN CÀI ĐẶT BẰNG
NGÔN NGỮ C - ĐỀ SỐ 12
Cho đồ thị có hướng G =<V,E> gồm N đỉnh và M cạnh được biểu diễn dưới
dạng danh sách kề trong file mtke.in theo khn dạng sau:


Dịng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;



N dòng kế tiếp mỗi dòng chứa N số 0 hoặc 1 tương ứng một hàng
của ma trận kề. Hai số trên cùng 1 hàng được phân biệt với nhau
bằng một hoặc vài kí tự trống.

Hãy viết chương trình chuyển đổi biểu diễn đồ thị G dưới dạng ma trận kề
thành biểu diễn của đồ thị G dưới dạng danh sách kề và danh sách cạnh.
Khuôn dạng biểu diễn đồ thị G dưới dạng danh sách kề và danh sách cạnh
được ghi lại trong file dske.out và dscanh.out theo khuôn dạng sau:
Khuôn dạng file dske.out:



Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;



N dòng kế tiếp, mỗi dòng ghi lại danh sách kề của đỉnh tương ứng.
Hai đỉnh trong cùng một danh sách kề được phân biệt với nhau bằng
một hoặc vài kí tự trống, đỉnh khơng có cạnh nối với nó (đỉnh cơ lập)
được ghi giá trị 0.

.
Khuôn dạng file dscanh.out


×