Phan Tich Va Thiet Ke Thuat Toan
-
Upload
dung-nguyen -
Category
Documents
-
view
48 -
download
6
Transcript of Phan Tich Va Thiet Ke Thuat Toan
Bam Mo
#include <stdio.h>
#include <conio.h>
/*--------Phan khai bao---------*/
const int B=6;
typedef int infor;
struct element
{
infor data;
element *next;
};
typedef element *List;
List A[B];
/*--------Phan dinh nghia ham-----*/
//---------------------------------
//Ham kiem tra so nguyen to
int kt_ngto(int x)
{
int i=1;
if(x>1)
{
do i++;
while((x%i)!=0);
if(x==i) return 1;
1
else return 0;
}
else return 0;
}
//----------------------------------
//Ham bam
int h(int x)
{
int du,kq;
du=x%10;
switch(du)
{
case 1:kq=0;break;
case 2:kq=1;break;
case 3:kq=2;break;
case 5:kq=3;break;
case 7:kq=4;break;
case 9:kq=5;break;
}
return kq;
}
//--------------------------
//Ham lam rong bang bam
void rong()
2
{
int i;
for(i=0;i<B;i++) A[i]=NULL;
}
//--------------------------
//Ham tra ve stt cua lop co chua x, -1 neu khong co x
int stt_lop_x(infor x)
{
int i;
List p;
i=h(x);//chu so cuoi cung thoa man
p=A[i];
while((p!=NULL)&&((*p).data!=x)) p=(*p).next;
if(p!=NULL) return i;
else return -1;
}
//-----------------------------
//Ham chen x vao dau danh sach
void InsertFirst(infor x,List &F)
{
List p;
p=new element;
(*p).data=x;
(*p).next=F;
3
F=p;
}
//----------------------------
//Ham tim kiem x co trong bang bam hay khong?
int tim_kiem(infor x)
{
if(stt_lop_x(x)!=-1) return 1;
else return 0;
}
//-----------------------------
//Ham xoa x khoi bang bam
void xoa(infor x,List &F)
{
int i;
List before,p;
p=F;
while((p!=NULL)&&((*p).data!=x))
{
before=p;
p=(*p).next;
}
if(p!=NULL)
{
if(p==F) F=(*p).next;
4
else (*before).next=(*p).next;
delete p;
}
}
//-----------------------------
//Ham xuat 1 lop thuoc bang bam
void xuat_lop(int stt)
{
//int i=1;
List p;
p=A[stt];
while (p!=NULL)
{
printf("%3d",(*p).data);
// i++;
p=(*p).next;
}
}
//-----------------------------
// Ham xuat bang bam
void xuat_bang()
{
for(int i=0;i<B;i++)
{
5
printf("\nLop %d:",i);
xuat_lop(i);
}
}
//-----------------------------
//Menu ham chinh
int menu()
{
int i;
printf("\n\n++++++++++++++++++++++++++++++++++++++\n");
printf("\n--------------------------------------\n");
printf("\n Moi ban chon chuc nang:");
printf("\n 1.Them phan tu vao bang bam.");
printf("\n 2.Xuat bang bam.");
printf("\n 3.Tim kiem mot phan tu trong bang bam.");
printf("\n 4.Xoa mot phan tu trog bang bam.");
printf("\n 0.Thoat chuong trinh.");
printf("\n -->Choice=");
scanf("%d",&i);
printf("\n--------------------------------------\n");
printf("\n++++++++++++++++++++++++++++++++++++++\n");
return i;
}
/*-------------HAM CHINH-------------*/
6
main()
{
//clrscr();
int i,stt;
infor x;
rong();
do
{
i=menu();
switch(i)
{
case 1:
printf("\nNhap so nguyen to: ");
scanf("%d",&x);
if(kt_ngto(x))
{
if(!tim_kiem(x))
{
stt=h(x);
InsertFirst(x,A[stt]);
printf("\nOK!");
}
else printf("\nSo ban nhap da ton tai!!");
}
7
else
printf("\nError: So ban vua nhap khong phai so nguyen to.");
break;
case 2: xuat_bang();
break;
case 3: printf("\nNhap phan tu muon tim kiem: ");scanf("%d",&x);
if(tim_kiem(x))
printf("Phan tu %d thuoc lop thu %d!",x,stt_lop_x(x));
else
printf("\nError: Khong ton tai %d trong bang bam!",x);
break;
case 4: printf("\nNhap phan tu muon xoa: ");scanf("%d",&x);
if(tim_kiem(x))
{
stt=h(x);
xoa(x,A[stt]);
printf("\nDa xoa %d ra khoi bang bam!",x);
}
else printf("\nError: Khong tim thay %d de xoa!",x);
break;
}
}
while(i!=0);
}
8
BamDong
//
// Code by Jellydn
// Env : Dev-C++
// Chuong trinh dung bang bam dong voi cac ki tu
//
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
const int N=10;
const char del='*';
const char emp=' ';
typedef char infor;
infor A[N];
// Cac nguyen mau ham
int Hash(char x); // Ham bam tim lop cho ki tu
void Create(infor A[]); // Ham khoi tao bang bam
int LocateClose (char x,infor A[]); // Tim vi tri ,co thi tra ve vi tri cua lop , sai thi -1
void InsertClose(char x,infor A[]); // Chen them 1 phan tu vao lop
void Delete(char x,infor A[]); // Xoa 1 phan tu khoi bang bam
void Display(infor A[]); // Hien thi danh sach bang bam
int main()
{
int cv,i;
9
char c,t,s[80];
Create(A);
printf("\n --------------------------------------- ");
printf("\n | |");
printf("\n | Chuong trinh dung bang bam |");
printf("\n | dong voi cac ki tu |");
printf("\n | vao cac 10 lop la : |");
printf("\n | 0,1,2,3,4,5,6,7,8,9 |");
printf("\n | |");
printf("\n --------------------------------------- ");
while(1)
{
printf("\n\n");
printf("\n ======================================= ");
printf("\n | |");
printf("\n | Main MENU |");
printf("\n | [1].Hien bang bam hien tai |");
printf("\n | [2].Tim mot phan tu |");
printf("\n | [3].Them mot phan tu |");
printf("\n | [4].Xoa mot phan tu |");
printf("\n | [5].Thoat chuong trinh |");
printf("\n --------------------------------------- ");
printf("\n Ban chon :");
10
scanf("%d",&cv);
gets(s);
switch(cv)
{
case 1 : Display(A);
printf("\n Press A key to continue...");
getch();
break;
case 2 : printf("\n Ban muon tim phan tu :");
scanf("%c",&t);
i=LocateClose(t,A);
if(i>=0)
printf("\n Tim thay phan tu trong lop thu %d cua bang bam ",i);
else
printf("\n Khong tim thay phan tu trong bang bam");
printf("\n Press A key to continue...");
getch();
break;
case 3 : printf("\n Ban muon them phan tu :");
scanf("%c",&t);
InsertClose(t,A);
printf("\n Press A key to continue...");
getch();
11
break;
case 4 : printf("\n Ban muon xoa phan tu :");
scanf("%c",&t);
Delete(t,A);
printf("\n Press A key to continue...");
getch();
break;
case 5 : exit(0); break;
}
}
}
// Cac chuong trinh con
int Hash(char x)
{
int i=x;
return (i%10);
}
void Create(infor A[])
{
int i,j;
infor p='a';
12
// Khoi tao bang bam
for(i=0;i<N;i++)
A[i]=emp;
// Them 3 ki tu vao cac lop tuong ung trong bang bam
// Them a ,b va c vao bang bam
for(j=0;j<3;j++)
{
i=Hash(p);
A[i]=p++;
}
}
int LocateClose (char x,infor A[])
{
int dem=0,vt=Hash(x),i;
// Xet duyet het tat ca cac mang
// Neu dung phan tu can tim thi dung ngay vi tri do
// con ko Neu la phan tu empty thi dung luon ,tra ve -1 -> ko co
// con ko thi tang vt can tim len
// vt=(vt+1)% N
for(i=0;i<N;i++)
{
if (A[vt]==x)return vt ;
else if(A[vt]==emp) return -1;
else vt=(vt+1)%N;
13
};
// Khi duyet het 1 vong thi nghia la ko tim ra
// nen tra ve -1
return -1;
}
void InsertClose(char x,infor A[])
{
int dem=0,vt=Hash(x);
//tim vi tri de chen
while((dem < N) && A[vt]!= del && A[vt]!=x && A[vt]!= emp)
{
dem++;
vt=(vt+1)%N;
}
if(A[vt]== del||A[vt]== emp) A[vt]=x;
else if(A[vt]==x) printf("\n Da co %c trong bang bam ",x);
else printf("\n Bang bam da day ");
}
void Delete(char x,infor A[])
{
int vt=LocateClose(x,A);
if(vt!=-1)
{
A[vt]=del;
14
printf("\n Da xoa phan tu %c ra khoi bang bam ",x);
}
else
printf("\n Khong co phan %c can xoa trong bang bam ",x);
}
void Display(infor A[])
{
int i;
infor p;
printf("\n Cac phan tu trong bang bam :");
for(i=0;i<N;i++)
{
if(A[i]!=emp && A[i]!=del)
printf("\n %d %c " ,i,A[i]);
else printf("\n %d ",i);
}
}
15
Dij kiem tra
/*
+ Thuat toan Dijkstra
+ Tim duong di ngan nhat trong do thi co trong so khong am
+ Writed by Thelinh_tk
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define filein "Dijkstra.inp"
#define fileout "Dijkstra.out"
#define NMAX 100
#define MAX 10000
int n,s,t;
int c&#&#[NMAX&#&#]&#&#[NMAX&#&#];
int Previous&#&#[NMAX&#&#];
bool Free&#&#[NMAX&#&#];
int d&#&#[NMAX&#&#];
void Input_Data()
{
int i,j;
FILE *fp;
fp=fopen(filein,"r");
fscanf(fp,"%d%d%d",&n,&s,&t);
16
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fscanf(fp,"%d",&c&#&#[i&#&#]&#&#[j&#&#]);
// Neu cai nao bang 0 thi gan cho no la MAX
if(c&#&#[i&#&#]&#&#[j&#&#]==0)
c&#&#[i&#&#]&#&#[j&#&#]=MAX;
}
}
fclose(fp);
}
// Khoi tao cac gia tri dau
void Init()
{
int v;
for(v=1;v<=n;v++)
{
// Khoi tao bang dau minpath tu s den v=c&#&#[s&#&#]&#&#[v&#&#]
d&#&#[v&#&#]=c&#&#[s&#&#]&#&#[v&#&#];
// Danh dau
Previous&#&#[v&#&#]=s;
// Tat ca cac dinh deu o trang thai tu do
Free&#&#[v&#&#]=true;
17
}
// Co dinh s
Previous&#&#[s&#&#]=0;
d&#&#[s&#&#]=0;
Free&#&#[s&#&#]=false;
}
void Dijkstra()
{
int u,v,minp;
// Lam trong khi t con tu do
while(Free&#&#[t&#&#])
{
minp=MAX;
// Tim trong tap T ra dinh u co d&#&#[u&#&#] min
// Chu y tap T la tap cac dinh chua co dinh nhan
for(v=1;v<=n;v++)
{
if(Free&#&#[v&#&#] && (minp>d&#&#[v&#&#]))
{
minp=d&#&#[v&#&#];
u=v;
}
}
// Sau khi tim duoc u thi ta co dinh u
18
Free&#&#[u&#&#]=false;
// Dung dinh u de toi uu hoa cac dinh trong T
if(Free&#&#[t&#&#])
{
// Tim trong tap T ra mot dinh v ma co
// d&#&#[u&#&#]+c&#&#[u&#&#]&#&#[v&#&#]<d&#&#[v&#&#]
for(v=1;v<=n;v++)
{
if(Free&#&#[v&#&#] && (d&#&#[u&#&#]+c&#&#[u&#&#]&#&#[v&#&#]<d&#&#[v&#&#]))
{
// Sua lai nhan cua v
d&#&#[v&#&#]=d&#&#[u&#&#]+c&#&#[u&#&#]&#&#[v&#&#];
// Luu vet
Previous&#&#[v&#&#]=u;
}
}
}
}
}
// Xuat ket qua ra file
void Output_Data()
{
int i;
19
FILE *fp;
fp=fopen(fileout,"w");
fprintf(fp,"+ Duong di ngan nhat tu %d den %d la :\n",s,t);
fprintf(fp,"%d<=",t);
i=Previous&#&#[t&#&#];
while(i!=s)
{
fprintf(fp,"%d<=",i);
i=Previous&#&#[i&#&#];
}
fprintf(fp,"%d",s);
fprintf(fp,"\n+ Do dai duong di ngan nhat la :%d",d&#&#[t&#&#]);
fclose(fp);
}
int main()
{
// Nhap du lieu
Input_Data();
// Initialize app
Init();
// Dijkstra
Dijkstra();
// Xuat du lieu
Output_Data();
20
return 0;
}
21
DuongDiNganNhat_Dijktra
//chuong trinh tim duong di ngan nhat tu 1 dinh
//Dung giai thuat dijktra
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int s[10]; //tap chua cac dinh
int n; //so dinh
int P[10]; //luu tru duog di
int D[10]; //do dai duong di ngan nhat hien tai tu dinh 1->i
int C[10][10],m;
//--------------------------------------------------
//Nhap trong do cho C
void Input_from_file()
{
int i=0,j=0;
FILE *fp;
fp=fopen("dijstra.txt","r");
if(fp==NULL)
{
printf("\nkhong mo duoc file");
}
else
{
22
while(!feof(fp))
{
fscanf(fp,"%d",&C[i][j]);
if(j==n-1)
{
i++;
j=0;
}
else
j++;
}
}
fclose(fp);
}
//--------------------------------------------------
//xuat C
void OutputC()
{
int i,j;
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d\t",C[i][j]);
23
printf("\n");
}
}
//---------------------------------------------------
void outputD()
{
for (int i=0;i<n;i++)
printf ("\t%d",D[i]);
}
//--------------------------------------------------
//tim phan tu nho nhat trong mang a ma khong nam trong s ,
//tra ve vi tri phan tu do trong mang
int min (int *a)
{
int i=0,j,kq;
// lay phan tu nho nhat dau tien
while (s[i]==1)
i++;
m=a[i];
kq=i;
//kiem tra xem co phan tu nao nho hon khong
for (j=i;j<n;j++)
{
if (s[j]==1)
24
break;
else
if (a[j]<m)
{
m=a[j];
kq=j;
}
}
m=a[kq];
return kq;
}
//===================================================================
void dijktra ()
{
int i;
int j;
for (i=0;i<n;i++)
s[i]=0; //dinh i khong thuoc s;
s[0]=1; //dua 1 vao tap s
for (i=1;i<n;i++)
{
P[i]=0;
D[i]=C[0][i];
25
}
for (i=1;i<n;i++) //cho lap n-1 lan
{
// outputD();
j=min(D); //vi tri cua dinh nho nhat
s[j]=1; //dua dinh do vao s
// printf ("\tdinh co trso nho nhat la:%d\n",j+1);
for (int u=0;u<n;u++)
{
if (s[u]==1)
continue;
else
if (D[j]+C[j][u] <D[u])
{
D[u]=D[j]+C[j][u];
P[u]=j;
}
}
}
}
//--------------------------------------------------
int timdinh (int i)
{
int k=P[i];
26
if (k==0)
{
printf ("%d",k+1);
return 1;
}
else
{
printf ("%d<--",k+1);
return timdinh(k);
}
}
//--------------------------------------------------
//ham lay ra cac dinh
void duongdi()
{
for (int i=1;i<n;i++)
{
printf ("\n1 --> %d:",i+1);
printf ("\t%d<--",i+1);
timdinh(i);
}
}
27
//=========================================================================
int main()
{
n=5; //so dinh la 5
Input_from_file();
OutputC();
dijktra();
duongdi();
getch();
}
28
KiemTraChuTrinh
#include <stdio.h>
#include <conio.h>
#include <values.h>
#define MAX 50
/* #define inf MAXINT */
typedef int dothi[MAX][MAX] ;
dothi A;
int n;
void nhapdt()
{
int i,j;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
printf("a%d%d=",i,j);
scanf("%d",&A[i][j]);
A[j][i]=A[i][j];
}
}
int acylic(dothi A,int n)
{
dothi B;
int D[MAX],i,j ,done=0;
29
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
B[i][j]=A[i][j];
while (!done)
{
for(i=1;i<=n;i++)
for(D[i]=0,j=1;j<=n;j++)
D[i]+=B[i][j];
i=1; while(i<=n&&D[i]!=1) i++;
if (i==n+1) done=1;
else
for (j=1;j<=n;j++)
{
B[i][j]=0;
B[j][i]=0;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(B[i][j]) return 1;
return 0;
}
main()
{
30
//clrscr();
printf("nhap so dinh :");
scanf("%d",&n);
nhapdt();
acylic(A,n) ;
if(acylic(A,n))
printf("do thi co chu trinh");
else printf("khong chu trinh");
getch();
}
31
KiemTraLienThong
/* vdu duoi day lam cho 5 dinh ,co thay 5 bang so n bat ky*/
#include <stdio.h>
#include <conio.h>
#include <values.h>
#define MAX 50
#define inf MAXINT
typedef int dothi[MAX][MAX] ;
dothi A;
int P[MAX]={0} ;
int a;
void nhapdt()
{
int i,j;
for(i=1;i<=5;i++)
for(j=i;j<=5;j++)
{
printf("a%d%d=",i,j);
scanf("%d",&A[i][j]);
A[j][i]=A[i][j];
}
}
int duongdi(int a)
{
32
int Q[MAX]={0},T[MAX]={0},nQ,nT=0,i,j;
Q[a]=1;nQ=1;
while(nQ)
{
i=1; while(!Q[i])i++;
Q[i]=0;nQ--;
T[i]=1;nT++;
for(j=1;j<=5;j++)
if(A[i][j]&&(!T[j]))
if(!Q[j])
{
Q[j]=1;nQ++;
P[j]=i;
}
}
return nT;
}
main()
{
int i;
//clrscr();
nhapdt();
printf("nhao dinh a bat ky");scanf("%d",&a);
duongdi(a);
33
if(duongdi(a)==5)
{
printf("do thi lien thong");
printf("%d",5);i=5;
while(i!=a)
{
i=P[i];
printf("-->%d",i);
}
}
else printf("khong lien thong");
getch();
}
34
Kruskal
//chuong trinh tim phu toi thieu dinh 0 den cac dinh con lai
//Dung giai thuat kruskal
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int s[50]; //tap chua cac dinh
int n; //so dinh
int cung[50][2],A[50],B[50];
int mang[50][50],m;
//--------------------------------------------------
//Nhap trong do cho C
void nhapnut()
{
FILE *f;
printf("\n nhap so nut cua do thi"); scanf("%d",&n);
f=fopen("sonut.txt","w");
fwrite(&n,sizeof(int),1,f);
fclose(f);
}
int lay_sn()
{
FILE *f;
f=fopen("sonut.txt","r");
35
if(f==NULL) printf("\n khong mo duoc file");
else
fread(&n,sizeof(int),1,f);
fclose(f);
}
void nhap(int n)
{
int i, j,k;
FILE *fp;
if ((fp = fopen("kruskal.txt", "w")) == NULL)
printf("\nKhong the tao tap tin kruskal.txt");
else
{
printf("\nNhap cac phan tu cua mang : ");
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
printf("\n W[%d][%d] = ", i, j);
scanf("%d", &k);
mang[i][j]=k;
fwrite(&k, sizeof(int), 1, fp);
}
fclose(fp);
printf("\nViec ghi hoan tat.");
36
}
}
void docfile()
{
int i,j,k;
FILE *fp;
if ((fp = fopen("kruskal.txt", "r")) == NULL)
printf("\nKhong the mo tap tin kruskal.txt");
else
{ for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
fread(&k, sizeof(int),1, fp);
printf(" %d",k);
mang[i][j]=k;
}
}
fclose(fp);
}
}
//--------------------------------------------------
//xuat C
37
void Outputmang()
{
int i,j;
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d\t",mang[i][j]);
printf("\n");
}
}
void khoitao_AB()
{
int a,b,i;
a=n-1;
b=1;
B[0]=0;
for(i=0;i<=n-1;i++)
A[i]=i+1;
}
void lay(int x)
{
int i;
for(i=0;i<n;i++)
38
if(A[i]==x) A[i]=-1;
}
void kruskal()
{
int a,b,i,j;
int min,k=0;
khoitao_AB();
a=n-1;
b=1;
while(k<n-1)
{
min=100;
for(i=0;i<b;i++)
for(j=0;j<a;j++)
if(A[j] != -1)
if(mang[B[i]][A[j]]<min)
{
min=mang[B[i]][A[j]] ;
cung[k][0]=B[i];
cung[k][1]=A[j];
}
m+=min;
lay(cung[k][1]);
B[b]=cung[k][0];
39
b++;
k++;
}
}
void ketqua()
{
int i;
for(i=0;i<n;i++)
{ printf("\n");
printf("(%d,%d)",cung[i][0],cung[i][1]);
}
printf("\n quang duong min la:%d",m);
}
void main()
{ int chon;
lay_sn(); docfile();
do
{
printf("\n\n\tCHUONG TRINH TIM PHU TOI THIEU - GIAI THUAT KRUSKAL");
printf("\n\nCac chuc nang cua chuong trinh:\n");
printf("\n1: Tao do thi moi");
printf("\n2: xem do thi");
printf("\n3: Tim cay bao trum toi thieu cua do thi");
printf("\n0: Thoat");
40
printf("\nChon chuc nang: ");
scanf("%d", &chon);
switch(chon)
{
case 1: nhapnut();nhap(n);
break;
case 2utputmang();break;
case 3:kruskal();ketqua();break;
case 0:exit(0);
}
getch();
}
while(chon!=0);
}
41
PRIM
#include <stdio.h>
#include <conio.h>
#define MAX 50
typedef int dothi[MAX][MAX] ;
dothi A,T;
int i,j,n,tong=0;
void nhapdt()
{
int i,j;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
printf("a%d%d=",i,j);
scanf("%d",&A[i][j]);
A[j][i]=A[i][j];
}
}
int prim()
{
int VT[MAX]={0},i,j,c;
int ii,jj;
VT[1]=1;
for (i=1;i<=n;i++)
42
for (j=1;j<=n;j++) T[i][j]=0;
for(c=0;c<n-1;c++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(A[i][j])
if(VT[i]&&!VT[j])
{
ii=i;jj=j;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (A[i][j])
if(VT[i]&&!VT[j])
if(A[i][j]<A[ii][jj])
{
ii=i;jj=j;
}
VT[jj]=1;
T[ii][jj]=A[ii][jj];
tong+=T[ii][jj];
T[jj][ii]=T[ii][jj];
}
return tong;
43
}
3
main()
{
//clrscr();
printf("nhap so dinh :");
scanf("%d",&n);
nhapdt();
prim() ;
printf("\ntong duong di= %d",tong);
getch();
}
44