2016-12-01 21 views
0

PPM1C создать файл txt.ppm из Цфата текстового файла

Textfile

Я попытался создать код C, который может создать промилле, как на рисунке 1 из текстового файла, как на рисунке 3. Когда somemone может помочь, это где здорово. Я новый программист, я попытался сделать этот код за 6 часов. Я попытался выполнить сканирование в данных из текстового файла и поместить его в массив и попытаться сделать withhe, что ppm, но мой код неприменим: /.

+0

Никто не может вам помочь, если вы не разместите код. –

+0

Мой код неприменим: / – BossJer

ответ

0

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

Поскольку ОП не разместил ни одного кода, я также не буду публиковать какой-либо полезный код. Если OP действительно заблокирован из-за отсутствия каких-либо дальнейших действий даже после попытки, это фактически должно быть практическим использованием. Если ОП просто ищет кого-то, кто сделает домашнее задание, это должно сильно их досадить. Оба работают для меня. :)

Первая подзадача - считывание ввода в массиве. В Интернете есть несколько примеров и связанные с ними вопросы. Вы хотите поместить это в отдельную функцию, поэтому легче слить ее в полный проект. Поскольку вы начинающий программист, вы могли бы пойти на функцию как

int read_numbers(double data[], int max); 

так, что вызывающие объявляют максимальное число точек данных, а функция возвращает число точек данных, считываемых; или отрицательный, если возникает ошибка. Ваш main() для тестирования этой функции должна быть тривиальной, скажем

#define MAX_NUMBERS 500 

int main(void) 
{ 
    double x[MAX_NUMBERS]; 
    int  i, n; 

    n = read_numbers(x, MAX_NUMBERS, stdin); 
    if (n <= 0) { 
     fprintf(stderr, "Error reading numbers from standard input.\n"); 
     return EXIT_FAILURE; 
    } 

    printf("Read %d numbers:\n", n); 
    for (i = 0; i < n; i++) 
     printf("%.6f\n", x[i]); 

    return EXIT_SUCCESS; 
} 

Вторая подзадача заключается в создании образа PPM. PPM - фактически группа близких форматов изображений, также называемая Netpbm format. Пример изображения - это растровое изображение - только черно-белое; без цветов, без оттенков серого - поэтому формат PBM (или вариант PPM) подходит для этого.

Я подозреваю, что проще всего атаковать эту подзадачу, используя двумерный массив размером с наибольшее изображение, которое вы можете сгенерировать (т. Е. unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX];), но обратите внимание, что вы также можете просто использовать его часть. (Вы также можете генерировать изображение «на лету» без какого-либо массива, но это гораздо более подвержено ошибкам, а не так универсально, как использование массива для хранения изображения.)

Вам, вероятно, придется решить ширину растрового изображения на основе максимального значения данных и высоту растрового изображения на основе количества точек данных.

Для тестирования просто заполните массив с помощью простых шаблонов или, возможно, только диагональной линии от верхнего левого угла до нижнего правого угла.

Затем рассмотрите возможность записи функции, которая задает прямоугольную область для заданного значения (0 или 1). На основе изображения вам также понадобится функция, которая рисует вертикальные пунктирные линии, изменяя (исключая-OR'ing) состояние каждого бита. Например,

#define WIDTH_MAX 1024 
#define HEIGHT_MAX 768 

unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX]; 
int   width = 0; 
int   height = 0; 

void write_pbm(FILE *out); /* Or perhaps (const char *filename)? */ 

void fill_rect(int x, int y, int w, int h, unsigned char v); 

void vline_xor(int x, int y, int h); 

На данный момент, вы должны были понять, что функция write_pbm(), тот, который сохраняет PBM изображение, должны быть написаны и протестированы первым. Затем вы можете использовать функцию , чтобы не просто нарисовать заполненные прямоугольники, но и инициализировать изображение - часть массива, который вы собираетесь использовать, - к цвету фона (0 или 1).Все три функции, которые вы можете выполнять и должны делать в отдельных подэтапах, так что в любой момент вы можете положиться на то, что ранее написанный вами код правилен и проверен. Таким образом, вам нужно только просмотреть ошибки в коде, который вы написали с момента последнего успешного тестирования! Это может показаться медленным шагом вперед, но на самом деле это самый быстрый способ заставить код работать. Вы очень быстро начинаете любить уверенность, которую испытывает тестирование, и тот факт, что вам нужно только сосредоточиться и беспокоиться об одной вещи за раз.

Третья подзадача заключается в том, чтобы определить способ рисования прямоугольников и вертикальных пунктирных линий для различных входов.

(я обманул немного выше, и включал в себя fill_rect() и vline_xor() функции в предыдущей подзадачи, потому что я мог бы сказать тем, которые необходимы, чтобы сделать пример изображения.)

Вертикальные пунктирные линии являются самыми легкими рисовать потом, используя функцию, которая рисует вертикальную линию, оставляя каждый другой пиксель нетронутым, но эксклюзивным - или любой другой пиксель. (Подсказка: for (y = y0; y < y0 + height; y += 2) bitmap[y][x] ^= 1;)

Это оставляет заполненные прямоугольники. Их высота, очевидно, постоянна, и между ними есть немного вертикального пространства, и они начинаются с левого края; поэтому единственное, что нужно, - рассчитать, насколько должен быть каждый прямоугольник. (И, насколько широким должно быть все растровое изображение, и насколько высок, как упоминалось ранее, наибольшее значение данных и количество значений данных диктуют их.)

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

Известно, что такой рабочий поток является надежным, эффективным и масштабируемым: неважно, насколько велик проект, описанный выше подход работает. Конечно, есть инструменты, которые помогут нам сделать это простым, структурированным образом (с комментариями к каждому commit - завершенный блок кода, если хотите); и git является популярным, бесплатным, но очень мощным. Просто просмотрите веб-сайт для git for beginners, если вы заинтересованы.

Если вы потрудились прочитать всю указанную выше стену текста и поняли рабочий процесс, который он описывает, вам не составит большого труда узнать, как использовать такие инструменты, как git, чтобы помочь вам в рабочем процессе. Вам также понравится, как много таких инструментов, как makeMakefiles, содержащих рецепты make), и как легко создавать и поддерживать проекты, которые не только работают, но и выглядят профессионально. Тем не менее, не пытайтесь понять все это сразу: сделайте это по одному маленькому шагу за раз, и убедитесь, что у вас твердая основа, прежде чем идти дальше. Таким образом, когда вы спотыкаетесь, вы не повредите себе; просто учиться.

Удачи!