Rick York
What you have here is a monolithic program - there is one function. That is only reasonable for the most trivial of programs and, in my opinion, your program is not quite trivial enough for that to be acceptable. For this reason, I think you need to break this into functions. This will also help you sort things out because you can focus on and debug one thing at a time. This needs to be broken into a series of functions. I would make one function to read the file and create the matrix. The creation of the matrix should also be its own function and there needs to be a corresponding matrix free function the releases all the memory it allocated. Then you should make a function to sort the matrix and one to write the matrix. The matrix writer should take a file object pointer as an argument so you can pass it a handle to an open file to write it or pass it stdout to display it in your console. BTW - you know that "printf" and "fprintf to stdout" are essentially the same thing, right?
У вас есть весь код для каждой из этих функций, поэтому просто нужно вызвать их соответствующим образом. Самое трудное, вероятно, будет разобраться, как распределить вашу матрицу. Ответ прост - вы передаете аргумент типа "int**", так как именно так вы объявили m. Как только вы разберетесь с этими функциями и их прототипами ваша основная функция должна выглядеть примерно так :
int main(void)
{
const char * inputFile = "input.dat";
const char * outputFile = "output.dat";
FILE *pfile = nullptr;
int **m = nullptr;
m = ReadMatrix( inputFile ); // read the file and allocate the matrix
if( ! m )
return -1; // failed to read the file
printf( "file %s was read - matrix is :\n", inputFile );
WriteMatrix( m, stdout );
SortMatrix( m );
printf( "sorted matrix is :\n" );
WriteMatrix( m, stdout );
pfile = fopen( outputFile, "w");
if( ! pfile )
{
fprintf( stderr, "Error opening file '%s'!\n", outputFile );
return -1;
}
WriteMatrix( m, pfile );
fclose( pfile );
printf( "file %s was written\n", outputFile );
ReleaseMatrix( m );
printf( "matrix was released - sayonara\n" );
return 0;
}
Таким образом, вам нужно написать четыре функции, и у вас уже есть код для всех из них. Теперь вы можете сосредоточиться на отладке каждого из них, как они называются в вашей программе. Если вы разделите создание матрицы и чтение файла на две функции, то у вас будет пять функций.
Так пишутся более крупные программы и библиотеки - вы разбиваете код на компоненты, которые потенциально могут использоваться много раз в разных местах.
-редактировать-
Я вижу, что noOfRows приходит откуда-то еще. Это означает, что вы можете легко отделить чтение и распределение матрицы.
User-14784327
Спасибо за решение, но, пожалуйста, не могли бы вы включить и эти функции? Я немного новичок в языке Си.
Rick York
Теперь у вас уже есть код для всех функций. Вам просто нужно сделать объявления для них и добавить код. Вы можете видеть, как они вызываются в решении, и вы знаете типы всех аргументов - вы просто передаете их точно так, как они объявлены. Например, WriteMatrix принимает указатель на файловый объект и матрицу. Указатель на файл-это файл*, а матрица-это int**, так что это то, что вы передаете ему. Он не имеет возврата интереса, поэтому его прототип будет выглядеть следующим образом : void WriteMatrix( int **matrix, FILE * fp );
Вот, собственно, и все.
Пройдите через этот процесс для других функций, и вы получите его. Убедитесь, что имена переменных в функциях совпадают с именами, которые вы даете аргументам.