30/09/2018, 18:24

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("
File %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("
");
	for (i = 1; i <= n; i++) 
		printf("%4d", a[i]);
	Floyd();
	printf("
Day 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("
");
	system("pause");
}

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

Dung Nguyen viết 20:31 ngày 30/09/2018

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

Nhuyngo Nhuyngo95 viết 20:28 ngày 30/09/2018

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);
Dung Nguyen viết 20:38 ngày 30/09/2018

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.

Nhuyngo Nhuyngo95 viết 20:37 ngày 30/09/2018

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

Nhuyngo Nhuyngo95 viết 20:25 ngày 30/09/2018

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

Dung Nguyen viết 20:36 ngày 30/09/2018

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

Huy viết 20:28 ngày 30/09/2018

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

Nhuyngo Nhuyngo95 viết 20:37 ngày 30/09/2018

a[++n] = x;

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

Dung Nguyen viết 20:39 ngày 30/09/2018

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.

Dung Nguyen viết 20:33 ngày 30/09/2018

Để 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.

Bài liên quan
0