Ошибка чтения контрольных примеров из файла в C - PullRequest
1 голос
/ 11 июля 2011

для домашней работы по программированию, я реализую алгоритм Прима, формат входного файла для тестовых случаев следующий:

Первой строкой ввода будет целое число C, которое указывает количество тестов. Первая строка каждого теста содержит два целых числа N и E, где N представляет количество узлов в графе, а E - количество ребер соответственно. Затем идут E строки, каждая с 3 целыми числами I, J и P, где I и J представляют узлы ребра (неориентированные графы, где 0 ≤ I, J

Хотя даже я начинаю код (я новичок в программировании), я не понимаю, почему мой код читает только записи для тестовых случаев, что я делаю неправильно?

это код, читающий файл entradaA.in:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv []){

int testCases;
int numberNodes;
int numberEdges;

freopen("entradaA.in", "r", stdin);
int i, j, cont=1;
int total = 0;
int a, b, c;

scanf ("%d", &testCases);



    for (i=0; i<testCases; ++i)
    {

    scanf ("%d %d", &numberNodes, &numberEdges); //Number Nodes & Edges

        for (i=0; i<numberEdges; i++)
        {
        scanf ("%d %d %d", &a,&b,&c);//
        printf ("%d %d %d\n", a, b, c);
        }

    printf ("Caso %d: Total Weight %d\n", cont++, total);
    }

return (0);

}

Входной файл (entradaA.in) выглядит примерно так

2
7 11
0 1 17
0 2 10
0 6 14
1 2 6
1 3 1
2 3 4
2 6 3
3 4 7
4 6 10
4 5 2
5 6 9
6 9
0 1 30
0 2 30
1 3 22
1 5 33
2 3 20
2 4 33
3 4 15
3 5 20
5 4 20

Ответы [ 2 ]

1 голос
/ 11 июля 2011

У вас есть переменная цикла i, измененная внутри цикла, которая обычно нежелательна.В этом случае, поскольку i зациклено на 11 (число ребер), это привело к завершению вашей программы, поскольку 11 не меньше 2 (количество тестовых примеров во входных данных).

Вы можетеиспользуйте временную переменную (если вы используете C ++, спасибо aardvarkk):

for (int i=0; i<testCases; ++i)
    {
        scanf ("%d %d", &numberNodes, &numberEdges); //Number Nodes & Edges
        for (int j=0; j<numberEdges; j++)

Обратите внимание, что int j также может быть int i, но я бы не рекомендовал его.Просто использовать переменную с другим именем будет понятнее.Или, если вы находитесь в C, просто отбросьте две int и используйте переменные, которые являются локальными для функции.

Для получения дополнительной информации вы можете прочитать this .

0 голосов
/ 11 июля 2011

Ваш код выдал следующий вывод на мою машину.Единственное изменение, которое я сделал, было объявить int значения i, j и т. Д. Перед вызовом freopen, чтобы сделать код стандартным C.

0 1 17
0 2 10
0 6 14
1 2 6
1 3 1
2 3 4
2 6 3
3 4 7
4 6 10
4 5 2
5 6 9
Caso 1: Total Weight 0

Это определенно читает больше, чем ваштестовые случаи, поэтому я не уверен, в чем проблема?

...