найти макс в куче массивов в C - PullRequest
0 голосов
/ 09 марта 2011

У меня есть пара вопросов. У меня есть текстовый файл, который содержит эту информацию

x0,x1,y0,y1
142,310,0,959
299,467,0,959
456,639,0,959
628,796,0,959
  1. Сначала я хочу прочитать текстовый файл, используя fscanf и получить только числа в 4 массива, c1, c2, c3 и c4, пропустив первую строку. Итоговый результат будет

    c[1] = {142, 310, 0, 959}
    c[2] = {299, 467, 0, 959}
    c[3] = {456, 639, 0, 959}
    c[4] = {628, 796, 0, 959}
    
  2. Затем для каждого c[1] до c[4] я хочу найти максимальное целое число и сохранить его в типе данных [x, y]. Так, например, в c[1] максимальное значение будет max[1] = [310, 959].

Кто-нибудь может помочь? Также приветствуется другое решение C, кроме использования массивов для решения этой проблемы.

В Matlab код

fid = fopen('foo.txt','r');
c = textscan(fid,'%d%d%d%d','delimiter',',','headerlines',1);
fclose(fid);

Это просто проигнорирует первую строку, а затем скопирует оставшиеся числа в массивы в matlab. Я хотел бы перевести этот код на C. Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Хотя я не удовлетворяю ваш вопрос напрямую, я привел пример точек чтения, используя struct, std::istream и std::vector. Они предпочтительнее, чем fscanf и массивы.

struct Point
{
  unsigned int x;
  unsigned int y;

  friend std::istream& operator>>(std::istream& inp, Point& p);
};

std::istream& operator>>(std::istream& inp, Point& p)
{
  inp >> p.x;
  //Insert code here to read the separator character(s)
  inp >> p.y;
  return inp;
}

void Read_Points(std::istream& input, std::vector<Point>& container)
{
  // Ignore the first line.
  inp.ignore(1024, '\n');

  // Read in the points
  Point p;
  while (inp >> p)
  {
     container.push_back(p);
  }
  return;
}

Структура Point обеспечивает большую читабельность и, IMHO, большую универсальность, поскольку вы можете объявлять другие классы, используя Point:

class Line
{
  Point start;
  Point end;
};

class Rectangle
{
  Point upper_left_corner;
  Point lower_right_corner;
  friend std::istream& operator>>(std::istream& inp, Rectangle& r);
};

Вы можете добавить методы для чтения из файла, используя operator>> для точки:

std::istream& operator>> (std::istream& input, Rectangle& r)
{
  inp >> r.upper_left_corner;
  //Insert code here to read the separator character(s)
  inp >> r.lower_left_corner;
  return inp;
}

Массивы являются проблемой и могут привести к неприятным ошибкам во время выполнения, таким как переполнение буфера. Перенесите std::vector, классы или структуры в массивы.

Кроме того, поскольку используется std::istream, эти структуры и классы можно легко использовать с std::cin и файлами (std::ifstream):

  // Input from console
  Rectangle r;
  std::cin >> r;
0 голосов
/ 09 марта 2011

На всякий случай, ваш

Также приветствуется другой формат для решения этой проблемы.

также означает другой язык, код Python для решения этой проблемы будет выглядеть так:

fo = open('a.txt','r')
line = fo.readline() #ignore first line
max = [sorted(map(int,line.split(',')))[-2:] for line in fo]

и результат будет

[[310, 959], [467, 959], [639, 959], [796, 959]].

...