Неправильная работа с указателями на массивы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ДД! Написал такой вот код, компилится нормально, но при выводе результатов в консоль видно, что в первых элементах просто нули, хотя должны быть данные, которые теперь значатся во вторых элементах массивов, т.е. сдвиг на одну позицию. Как это побороть?
#include <stdlib.h>
#include <stdio.h>
 
int N;
int *ptr;
double *a, *b;
 
void print( int *ptr, int n )
{
  int j;
 
  printf("\n%d points:\n", n);
  for (j=0; j<n; j++)
    printf("point %d = (%.2lf;%.2lf)\n", ptr[j], a[j], b[j] );
  printf("\n");
}

int main( void )
{
  int j=0;
 
  FILE *ffile = fopen("test.txt", "r");
  while (!feof(ffile)){
      if(!j){
          fscanf(ffile, "%d", &N);
          a=(double*)malloc(N*sizeof(double));
          b=(double*)malloc(N*sizeof(double));
          ptr=(int*)malloc(N*sizeof(int));
      }
      else{fscanf(ffile, "%d %lf %lf", &ptr[j], &a[j], &b[j]);
        printf("%d %lf %lf\n", ptr[j], a[j], b[j]);
      }j++;
  }
  fclose(ffile);
 
  print(ptr, N);
 
  return 0;
}
Вот входной файл: 5 0 2.1 1.3 1 5.0 2.2 2 1.2 1.2 3 1.8 1.0 4 3.0 2.8 Вот полученный результат: 0 2.100000 1.300000 1 5.000000 2.200000 2 1.200000 1.200000 3 1.800000 1.000000 4 3.000000 2.800000 5 points: point 10630592 = (0.00;0.00) point 0 = (2.10;1.30) point 1 = (5.00;2.20) point 2 = (1.20;1.20) point 3 = (1.80;1.00)

Решение задачи: «Неправильная работа с указателями на массивы»

textual
Листинг программы
int j = 0;
//...
while (!feof(ffile)) {
    if(!j) {
    //...
    }
    else { //  тут у вас j уже равно 1. Как вариант в след писать j-1.
        fscanf(ffile, "%d %lf %lf", &ptr[j], &a[j], &b[j]);
        printf("%d %lf %lf\n", ptr[j], a[j], b[j]);
    }
    j++;
}

Объяснение кода листинга программы

В данном коде происходит считывание данных из файла и их вывод на экран.

  1. Объявлены три массива: ptr, a, b, которые будут хранить считанные данные.
  2. Инициализирована переменная j = 0, которая будет использоваться как счетчик для считывания данных.
  3. В цикле while с условием !feof(ffile) происходит считывание данных из файла до тех пор, пока файл не будет считаться пустым.
  4. Внутри цикла проверяется значение переменной j. Если оно равно 0, то выполняется определенный блок кода, если больше 0, то выполняется другой блок кода.
  5. В блоке кода для j=0 выполняется инициализация указателя ptr[0] и считывание данных по этому указателю, а также считывание данных в массив a и b.
  6. В блоке кода для j>0 выполняется считывание данных по указателю ptr[j], а также их вывод на экран вместе с значениями из массива a и b.
  7. После каждой итерации цикла переменная j увеличивается на 1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы