Nhờ giải thích code

Anh/chị có thể giải thích giúp em bài này với k ạ, em có đọc qua và xem youtube nhưng cũng k hiểu lắm ạ. Em cảm ơn ạ.

#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<winbgim.h>
#define MAX 10
int A[MAX][MAX];
int C[MAX], B[MAX];
int n;
int d;
int x[10]= {250,250,400,400,300,250,150,250,350,500};
int y[10]= {250,150,150,250,400,450,450,200,200,150};
void nhap()
{
    printf("Nhap vao so dinh ma tran: ");
    scanf("%d", &n);
    printf("-----Nhap duong di ma tran-----\n ");
    printf("0: khong co duong di\n");
    printf("1: co duong di\n");
    for(int i=1; i<=n; i++)
    {
        for(int j =i; j<=n; j++)
        {
            if(i==j) A[i][j]=0;
            else
            {
                printf("Duong di tu dinh %d den dinh %d: ",i,j);
                scanf("%d", &A[i][j]);
                A[j][i]=A[i][j];
            }
        }
    }
}
void WriteFile(){
    FILE *f;
    f= fopen("Nhom11.text","w");
    fprintf(f, "%d\n",n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            fprintf(f, "%d ",A[i][j]);
            fprintf(f,"\n");
    }
    printf("Ghi file thanh cong!\n");
    fclose(f);

}
void ReadFile(int A[MAX][MAX],int &n){
 FILE *f;
 f=fopen("Nhom11.text","rt");
 fscanf(f,"%d",&n);
 for(int i=1; i<=n; i++){
  for(int j=1; j<=n; j++){
   fscanf(f,"%d",&A[i][j]);
  }
 }
  printf("Doc file thanh cong!\n");
  fclose(f);
}
void initarray()
{
    for (int i=1; i<=n; i++)
    {
        C[i]=0;
        B[i]=0;
    }
}
void ketqua()
{
    printf("Duong di Hamilton: ");
    for(int i=1; i<=n; i++)
        printf("%d ",B[i]);
    d++;
    printf("\n");
}
void Hamilton(int B[MAX], int C[MAX], int i)
{
    int j;
    for(j=1; j<=n; j++)
    {
        if(A[B[i-1]][j]==1 && C[j]==0)
        {
            B[i]=j;
            C[j]=1;
            if(i<n) Hamilton(B, C, i+1);
            else ketqua();
            C[j]=0;
        }
    }
}

void HamiltonPeak(int B[MAX], int C[MAX], int i,int p)
{
    int j;
    for(j=1; j<=n; j++)
    {
        if(A[B[i-1]][j]==1 && C[j]==0)
        {
            if(i==1 && B[1]==0)
            {
                C[p]=1;
                B[1]=p;
                B[i+1]=j;
                C[j]=1;
                i++;
                if(i<n) Hamilton(B, C, i+1);
                else ketqua();
                C[j]=0;
            }
            else
            {
                B[i]=j;
                C[j]=1;
                if(i<n) Hamilton(B, C, i+1);
                else ketqua();
                C[j]=0;
            }
        }
    }
    initarray();
}
void CreatePeak()
{
    for(int i=1; i<=n; i++)
    {
        char kt[100];
        setcolor(2);// mau ve hien tai la mau xanh
        circle(x[i-1],y[i-1],20);// ve duong tron tam(x,y) ban kinh 20
        setfillstyle(15,2);// mau to 15 va mau to xanh la
        floodfill(x[i-1], y[i-1], 2);// to mau mot vung kin chua diem x,y va mau c trung voi setfillstyle
        settextstyle(0,0,2);// font, huong, co chu
        setcolor(0);// mau chu
        //snprintf(kt, sizeof(kt), "%d", i);
        itoa(i,kt,10); 
        outtextxy(x[i-1]-8, y[i-1]-8,kt);// viet van ban "kt" tai vi tri x,y
    }
}
void CreateLink()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=i; j<=n; j++)
        {
            if(A[i][j]==1)
            {
                setcolor(4);// mau duong ve la mau do
                setlinestyle(0,0,2);// kieu duong, mau to va do dam
                line(x[i-1],y[i-1],x[j-1],y[j-1]);// ve duong tu x,y den x1,y1
            }
        }
    }
}
void Graphic()
{
    initwindow(900,700);
    setbkcolor(7);// hinh nen mau xam
    cleardevice();
    CreatePeak();
    CreateLink();
    getch();
}
void menu(){
	printf("\n--------Thao tac voi chuong trinh--------\n");
	printf("1.Nhap do thi\n");
	printf("2.Ghi du lieu vao file\n");
	printf("3.Doc du lieu tu file\n");
	printf("4.Hien tat ca duong di hamilton cua do thi\n");
	//printf("5.Tim duong di tu mot dinh nao do cua do thi\n");
	printf("5.Do hoa mo phong do thi\n");
	printf("0. Thoat chuong trinh\n");
	}
int main(){
	initarray();
    int i=1;
    d = 0;
    int chon;
    do{
        menu();
        printf("Chon tu 0-5 de thuc hien chuong trinh: ");
        scanf("%d",&chon);
        switch(chon){
            case 1 : nhap();
			         break;
			case 2 : WriteFile();
			         break;
			case 3:  ReadFile(A,n);
			         break;
			case 4: d=0;
                    for(int j=1;j<=n;j++)
					 {
                       B[0]=j;
                       HamiltonPeak(B,C,i,j);
                     }
                    if(d==0){
                    	printf("--Khong co duong di hamilton--\n");
                    	}                                        
					break;
			case 5: Graphic();
			        break;
		    case 0: exit(0);
            default :printf("Ban da chon sai thao tac, vui long chon lai!\n");
			         break;
            }
	} while(chon!=0);
	getch();
	
	}

Bạn muốn giải thích đoạn nào?

4 Likes

cái hàm nhập đấy ạ với cái khai báo define max 10 em đọc thì dc thay thế bới gtri cta đã dc khởi tạo
Với cái int A[MAX][MAX]; // em đọc thì là ma trận kề của đồ thị
int C[MAX], B[MAX]; // mảng đánh dấu là sao ạ?
int x[10]= {250,250,400,400,300,250,150,250,350,500}; // em cũng có đọc thì là khai bảo mảng x gồm 10 phần từ nhưng mấy cái trị ở trong là do mình tự nhập thì liệu nó có ảnh hướng gì đến việc chạy CT sau k ạ

Hàm nhập tớ thấy tương đối straight forward đó cậu @@
Cậu thử đọc lại và giải thích những gì xảy ra trong hàm nhập được không?

Tớ biết cậu mới học, tuy nhiên, cậu nên học cả cách diễn đạt và dùng từ. Tớ chẳng hiểu cậu đang nói gì cả.
Dòng define max ấy là định nghĩa macro. Tất cả những chỗ có chữ “max” sẽ được thay thế bằng số tương ứng.
Phần này có vẻ không liên quan tới vấn đề hàm nhập của cậu ở trên.

3 phần này thực ra cũng không liên quan nhiều tới hàm nhập.
Mảng A, B, C được dùng trong việc tìm chu trình Hamilton. Mảng x y được dùng để vẽ hình.
Mấy giá trị đó được gọi là “hard coded”, tức là cậu ghi hẳn giá trị kiểu “magic number” ấy vào trong mã nguồn, mà không phải để ở file config riêng. Giá trị “mình tự nhập” mà cậu nói có thể bị hiểu nhầm sang “mình nhập qua giao diện chương trình” đấy, nên dùng từ cẩn thận nhé!

Ngoài ra, cậu cũng không nên cảm thấy tồi tệ khi không hiểu code này. Code này rất tồi, chẳng có ai code tốt mà đi đặt một loạt biến toàn cục + tên biến là A B C d x y + sai coding convention + đặt tên hàm tiếng Việt cả. Cậu có lẽ cũng nên xem xét việc quit xem kênh youtube đã đưa cậu code này @@ (làm theo là hư người đó).

4 Likes

Đây ạ e mới chỉ hiểu như thế ạ ở (cái hàm nhập ạ)
hiện ra số đỉnh nhập vào ma trận (nhập số nguyên)
nhập đường đi ma trận sau khi nhập số đỉnh
nhập 0 thì là 2 đỉnh đó k có đường đi
nhập 1 là 2 đỉnh đó có 1 đường đi
vòng for khởi tạo giá trị biến i =1, điều kiện lặp nhỏ hơn số đỉnh, và tăng i mỗi lần

ý là cái đoạn biến x với y đang fix cứng cho nó 1 mảng để khi run code nó có sẵn dữ liệu r đúng ko ạ?

Đúng rồi cậu :smile: Tự tin lên cậu, cậu hiểu code mà.

1 Like

Rồi, giờ thử trả lời tớ câu hỏi này nhé:

  • Tại sao với i == j, cậu gán 0 cho vị trí đó?
  • Tại sao cậu lại gán Aij cho Aji khi đã lấy được Aij?
  • Tại sao vòng lặp ngoài lại duyệt từ 1 tới n?
  • Tại sao vòng lặp trong lại duyệt từ i tới n?
5 Likes
  • i == j là n đi từ đỉnh i đến đỉnh i =>k có đường đi

=> định hướng cho đồ thị ạ? ví dụ đồ thị đi từ đỉnh i đến j thì cũng sẽ có đỉnh j đến i nên gán thế để nó chỉ đi đỉnh i đến đỉnh j ạ?

  • Vòng ngoài: duyệt đỉnh bắt đầu từ 1 cho đến hết
  • Vòng trong: vì duyệt 1 lần là 1 rồi nên duyệt tiếp ạ?

Em cũng k rõ lắm ạ?

1 Like

Anh ơi em trả lời có đúng k ạ ?

1 Like

Ừ cậu, cậu trả lời đúng gần hết rồi đấy :+1:
Còn mỗi việc nhỏ là cậu nên tin vào logic của bản thân cậu, và dùng ít dấu hỏi chấm lại :smile:

Ở câu trả lời này:

Tớ đoán ý cậu là “vì vòng lặp này để xác định quan hệ của các đỉnh (cậu đã hiểu Aij với Aji giống nhau như thế nào về mặt ngữ nghĩa), nên chỉ cần xác định vị trí của một cạnh i bất kỳ với các cạnh có thứ tự sau nó là được”.
Cậu đúng rồi đó :+1:

Tớ nghĩ là cậu đã hiểu trọn vẹn hàm nhập đó rồi :smile: Cậu hoàn toàn có thể tự viết lại nó rồi đó!
Lần tới, khi đọc code, cậu nên thử đặt ra các câu hỏi “tại sao” đơn giản như vậy. Tớ đoán nó sẽ giúp cậu hiểu mọi thứ sâu sắc hơn, ngay cả khi cậu đã thành chuyên gia.

Hope it helps!

2 Likes

Vâng em cảm ơn a rất nhiều ạ. Em trả lời của em nó cũng lủng củng thật em diễn đạt văn hơi kém
Với lại thật ra là lúc a hỏi í em cũng phải tra gg nhiều lần đọc nhưng cũng có đoạn k hiểu lắm.
Và nếu a k hỏi những câu đấy thì em cũng chả biết là nên hiểu cái hàm đấy như thế nào í ạ.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?