Я делаю домашнее задание и готовлюсь к выпускному экзамену. Вот моя проблема:
Квадратная матрица (nxn)
Запишите четные элементы в matran.txt, затем прочитайте их из файла и отобразите на экране.
Код:
//this is function write down file matrix.txt, and it's work normally
void infile(int **p,int n)
{
bool a=false;
FILE *f=fopen("matran.txt","w");
if (f==NULL)
{
printf ("\nLoi file.");
exit(1);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if ((p[i][j]) % 2 == 0) {
fprintf (f,"%d\t",p[i][j]);
a=true;
}
}
if (a) printf ("\nFile da duoc ghi tai ./matrix.txt");
else printf ("\nKhong co so chan trong ma tran");
}
Я знаю, что у него есть ограничение от 0->n, но я не знаю, что такое ограничение i, и я попробовал установить ограничение на 100, но он все равно распечатывает 3 значения и отображает 100 diff-адресов:
//but this didnt work
void DocTep(int **p, int n) {
int *ptr=(int*)malloc(n*sizeof(int));
FILE *f = fopen("matran.txt", "r");
if (f == NULL) {
printf("\nLoi file.");
exit (1);
}
for (int i = 0; i < n; i++) {
fscanf(f, "%d ",ptr[i]);
}
fclose(f);
printf ("\n");
for (int i = 0; i < n; i++) {
printf ("%d\t",ptr[i]);
}
}
Это полная программа
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void nhapmt (int **p,int n)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("a[%d][%d] = ", i, j);
scanf("%d", &p[i][j]);
}
}
}
void inmt (int **p,int n)
{
for (int i=0;i<n;i++)
{
printf ("\n");
for (int j=0;j<n;j++)
{
printf ("%d\t",p[i][j]);
}
}
}
void tongcheo(int **p,int n)
{
int sum=0;
for (int i=0;i<n;i++)
{
sum += p[i][i];
}
printf ("\nTong cac so tren duong cheo chinh la: %d",sum);
}
void tongh(int **p,int n,int h)
{
int sum=0;
for (int i=0;i<n;i++)
{
sum += p[i][h];
}
printf ("Tong cot %d la: %d",h,sum);
}
void infile(int **p,int n)
{
bool a=false;
FILE *f=fopen("matran.txt","w");
if (f==NULL)
{
printf ("\nLoi file.");
exit(1);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if ((p[i][j]) % 2 == 0) {
fprintf (f,"%d\t",p[i][j]);
a=true;
}
}
if (a) printf ("\nFile da duoc ghi tai ./matran.txt");
else printf ("\nKhong co so chan trong ma tran");
}
void DocTep(int **p, int n) {
int *ptr=(int*)malloc(100*sizeof(int));
FILE *f = fopen("matran.txt", "r");
if (f == NULL) {
printf("\nLoi file.");
exit (1);
}
// fscanf(f,"%d",&ptr[0]);
for (int i = 0; i < n; i++) {
fscanf(f, "%d ",ptr[i]);
}
fclose(f);
printf ("\n");
for (int i = 0; i < n; i++) {
printf ("%d\t",ptr[i]);
}
}
int main()
{
int **p,n,h;
printf ("Hay nhap vao n: ");
scanf("%d",&n);
p=(int**)malloc(n*sizeof(int*));
for (int i=0;i<n;i++){
p[i]=(int*)malloc(n*sizeof(int));
}
nhapmt(p,n);
inmt(p,n);
tongcheo(p,n);
printf ("\nHay nhap vao h: ");
scanf("%d",&h);
tongh(p,n,h);
infile (p,n);
DocTep(p,n);
free(p);
return 0;
}
Введите n=32468
в matran.txt: 2 4 6 8
Вывод: 2 4 6 8
Несвязано: пожалуйста, возьмите за привычку использовать завершающую новую строку в вызове printf. Когда stdout (это FILE *, где пишет printf) подключен к консоли или терминалу, он будет буферизован по строкам. Это означает, что вывод будет фактически записан, когда вы печатаете новую строку. Используя начальную новую строку, вы печатаете предыдущую строку, а не текущую. Это может привести к ошибочному выводу при использовании printf для отладки.





В рутине DocTep вы не будете знать заранее, сколько пунктов вам нужно прочитать. (Так откуда же берется параметр n?)
Если все, что вам нужно сделать, это распечатать четные значения, найденные в infile, вам не нужно беспокоиться об управлении памятью для **p или хранении значений. Вы можете использовать цикл while, который завершается при достижении конца файла (о чем вам может сообщить процедура feof()), или использовать возвращаемое значение fscanf, чтобы сообщить, когда больше не осталось значений для чтения.
Не зная, как выглядит код, вызывающий ваш код, что находится в файле «matrix.txt» и для чего предназначена эта функция, мы не сможем сказать, корректен ли этот код, а если нет, то что с ним не так. это. Единственное, что мы можем сказать наверняка, это то, что он пропускает память, выделенную из
malloc, потому что нет свободного сопоставления и он не возвращает указатель. Но дальше этого мы можем только догадываться.