Không hiểu code trong C

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int s = 1;//tim kc nn tu s den tat ca cac dinh
int const max = 20;
int a[max];//day so cho truoc
int mtk[max][max], n;
int d[max][max];//d[i][j]:kcnho nhât  tu ai den aj
int p[max][max];//p[i][j]:dinh truoc dinh j tren duong nn tu i den j
char *tenfile = "E:\\daytang.txt";
int const avc = -100;  //am vo cuc
void DocFile()
{
	int x, i, j;
	FILE *f = fopen(tenfile, "r");
	if (f == NULL)
	{
		printf("\nFile %s khong co", tenfile);// exit(0);
	}
	n = 0;
	while (fscanf(f, "%d", &x) != EOF) a[++n] = x;
	fclose(f);
	for (i = 1; i <= n; i++)
	for (j = 1; j <= n; j++)
	if (i == j) mtk[i][j] = 0;
	else mtk[i][j] = avc;
	for (i = 1; i<n; i++)
	for (j = i + 1; j <= n; j++)
	if (a[i] <= a[j]) mtk[i][j] = 1;
}

void Floyd()
{
	int i, j, k;
	for (i = 1; i <= n; i++)
	for (j = 1; j <= n; j++)
	{
		d[i][j] = mtk[i][j]; p[i][j] = i;
	}
	for (k = 1; k <= n; k++)
	for (i = 1; i <= n; i++)
	for (j = 1; j <= n; j++)
	if (d[i][j]<d[i][k] + d[k][j])
	{
		d[i][j] = d[i][k] + d[k][j]; p[i][j] = p[k][j];
	}
}
void main()
{
	int i, j, k, i0, j0;
	DocFile();
	for (i = 1; i <= n; i++)
		printf("%3c%d", 'a', i);
		printf("\n");
	for (i = 1; i <= n; i++) 
		printf("%4d", a[i]);
	Floyd();
	printf("\nDay con khong giam dai nhat: ");
	k = avc;
	for (i = 1; i <= n; i++)
	for (j = 1; j <= n; j++)
	if (d[i][j]>k)
	{
		k = d[i][j]; i0 = i; j0 = j; 
	}
	k = j0;
	while (k != i0)
	{
		printf("a%d<--", k); 
		k = p[i0][k];
	}
	printf("a%d: chieu dai=%d", i0, d[i0][j0] + 1);
	printf("\n");
	system("pause");
}

Mọi người có thể giải thích những câu lệnh trên với

1 Like

Phải nói rõ xem đoạn nào ko hiểu chứ?

1 Like

xl đây nè

void DocFile()
{
	int x, i, j;
	FILE *f = fopen(tenfile, "r");
	if (f == NULL)
	{
		printf("\nFile %s khong co", tenfile);// exit(0);
	}
	n = 0;
	while (fscanf(f, "%d", &x) != EOF) a[++n] = x;
	fclose(f);

Giải thích:
FILE *f = fopen(tenfile, "r");
mở file tenfile ở chế độ chỉ đọc “r” rồi gán việc mở file này cho con trỏ f.

if (f == NULL)
{
	printf("\nFile %s khong co", tenfile);// exit(0);
}

kiểm tra xem file tenfile đã đc tạo hay đã tồn tại trước đó hay chưa. Nếu con trỏ f == NULL tức là chưa có file và in ra "\nFile %s khong co"

fscanf(f, "%d", &x) != EOF

hàm fscanf để lấy giá trị trong một file, nên ở đây đoạn code này nghĩa là scan qua file tenfile rồi lấy giá trị kiểu int trong đó gán cho biến x.

while (fscanf(f, "%d", &x) != EOF) a[++n] = x;

và ý nghĩa toàn bộ đoạn này là scan qua file tenfile rồi đưa từng giá trị int trong file đó vào mảng a, cứ đưa cho đến khi hết file (EOF) thông qua biến x.

1 Like

nếu vậy nếu chuyển qua C++ được không vậy :grinning:

EOF là gì vậy bạn minh ko hiểu lắm
++n nghia là gì vậy

Cái này mình không biết, mình không tim hiểu về C++

EOF là End of file, kết thúc file ấy

để ++n trong mảng a làm chi vậy

Nghĩa là “End Of File”
Bạn cứ mặc định EOF là một giá trị mà nếu bạn muốn kểm tra file đã kết thúc hay chưa thì cứ cho nó bằng EOF.

Để nếu trong file tenfile có nhiều hơn 1 giá trị kiểu int thì nó sẽ gán vào những phần tử tiếp theo trong mảng a.
Nhưng ở đây dùng ++n tức là người ta muốn gán trị từ phần tử a[1] trở đi chứ ko phải là a[0] vì ++n tức là nó tăng n trước khi n được sử dụng còn n++ là sử dụng n rồi mới tăng.

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