#c #sorting #printf
#c #сортировка #printf
Вопрос:
Я следую «C путем разбиения», поскольку я новичок, и я пытаюсь распечатать каждую итерацию алгоритма сортировки транспозиции с ожидаемым результатом:
Unordered: 7 3 66 3 -5 22 -77 2
After pass 1: -77 7 66 3 3 22 -5 2
After pass 2: -77 -5 66 7 3 22 3 2
...
Ordered: -77 -5 2 3 3 7 22 66
Однако я могу дойти только до распечатки:
Unordered: 7 3 66 3 -5 22 -77 2
After pass 1:
After pass 2:
...
Ordered: -77 -5 2 3 3 7 22 66
И, таким образом, я упускаю основную суть упражнения. Я попытался разместить printf(«%d», a[i]); во многих местах, но это не дает желаемого результата, поэтому любая помощь будет оценена.
#include <stdio.h>
void swap (int *p, int *q);
void transposition (int a[], int n);
#define SIZE 8
int main (void)
{
int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
int i;
printf(" Unordered: ");
for (i = 0; i < SIZE; i ) {
printf("%d ", arr[i]);
}
transposition(arr, SIZE);
printf("n Ordered: ");
for (i = 0; i < SIZE; i ) {
printf("%d ", arr[i]);
}
printf("n");
return 0;
}
void swap (int *p, int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
void transposition (int a[], int n)
{
int i, j;
for (i = 0; i < n; i ) {
for (j = i 1; j < n; j ) {
if (a[i] > a[j]) {
swap(amp;a[i], amp;a[j]);
}
}
printf("nAfter pass %d: ", i);
}
}
Комментарии:
1. Я рекомендую вызывать вашу функцию сортировки
sort
илиsort_by_transposition
илиtransposition_sort
, а не простоtransposition
; названиеtransposition
звучит так, как будто функция применяет одну транспозицию, тогда как на самом деле она сортирует массив, применяя до n ^ 2 транспозиций.
Ответ №1:
Чтобы распечатать последовательность, вы должны добавить операторы в последовательность печати.
void transposition (int a[], int n)
{
int i, j;
for (i = 0; i < n; i ) {
for (j = i 1; j < n; j ) {
if (a[i] > a[j]) {
swap(amp;a[i], amp;a[j]);
}
}
printf("nAfter pass %d: ", i);
/* add this */
for (j = 0; j < n; j ) {
printf("%d ", a[j]);
}
}
}
Указывает на изменение кода в main()
for (i = 0; i < SIZE; i ) {
printf("%d ", arr[i]);
}
являются:
i
j
i
Во внешнем цикле используется изменение на because .- Изменить
arr
наa
в соответствии с аргументом. - Изменить
SIZE
наn
в соответствии с аргументом.
Комментарии:
1. В этом ответе рекомендуется копировать
for (j = 0; j < n; j ) { printf("%d ", a[j]); }
каждое место, где требуется печать массива. Но не было бы намного лучше перенести этот код в функциюprint_array
?2. @Stef Вы можете написать ответ, предполагающий это.
3. Кроме того, вы забыли
printf("n");
.4. @Stef Я этого не делал. Новая строка находится в
printf("nAfter pass %d: ", i);
Ответ №2:
Избегайте дублирования кода, инкапсулируя полезный код в функцию
Поскольку печать массива — это то, что вам нужно делать более одного раза, вы должны написать функцию, которая это делает:
void print_array(int arr[], int n, char const *title)
{
printf("n %s: ", title);
for (i = 0; i < SIZE; i ) {
printf("%d ", arr[i]);
}
printf("n");
}
Используя нашу функцию print_array
Затем вы можете вызывать эту функцию всякий раз, когда захотите распечатать массив:
- Один раз перед сортировкой под названием «Неупорядоченный»;
- Один раз после сортировки заголовок «Упорядоченный»;
- На каждой итерации
for
циклов — с заголовком, указывающим значениеi
.
#include <stdio.h>
void swap (int *p, int *q);
void sort_by_transpositions (int a[], int n);
void print_array (int a[], int n, char const *title);
#define SIZE 8
int main (void)
{
int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
int i;
print_array(arr, SIZE, "Unordered");
sort_by_transpositions(arr, SIZE);
print_array(arr, SIZE, "Ordered");
return 0;
}
void swap (int *p, int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
# define BUFFERSIZE 100
void sort_by_transpositions (int a[], int n)
{
int i, j;
char after_pass_i_title[BUFFERSIZE];
for (i = 0; i < n; i ) {
for (j = i 1; j < n; j ) {
if (a[i] > a[j]) {
swap(amp;a[i], amp;a[j]);
}
}
snprintf(after_pass_i_title, BUFFERSIZE, "After pass %d", i);
print_array(a, n, after_pass_i_title);
}
}
Обратите внимание на использование функции snprintf
из заголовка stdio.h
, которая похожа на printf
, но печатает в строку вместо печати в стандартный вывод.
Позволяет пользователю выбирать, хочет ли он, чтобы сортировка была тихой или подробной
Возможно, пользователь хочет отсортировать массив, но не хочет получать тонны строк вывода в результате сортировки. Вы можете добавить параметр в свою функцию сортировки, указав, следует ли выполнять всю печать:
void sort_by_transpositions (int a[], int n, int verbose)
{
int i, j;
char after_pass_i_title[BUFFERSIZE];
if (verbose)
print_array(arr, SIZE, "Unordered");
for (i = 0; i < n; i )
{
for (j = i 1; j < n; j )
{
if (a[i] > a[j])
{
swap(amp;a[i], amp;a[j]);
}
}
if (verbose)
{
snprintf(after_pass_i_title, BUFFERSIZE, "After pass %d", i);
print_array(a, n, after_pass_i_title);
}
}
if (verbose)
print_array(arr, SIZE, "Ordered");
}
Затем вы можете вызвать свою функцию из main
и указать verbose ( 1
) или not verbose ( 0
):
# define VERBOSE 1
# define SILENT 0
int main (void)
{
int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
int i;
sort_by_transpositions(arr, SIZE, VERBOSE);
return 0;
}
Обратите внимание, что я переместил все вызовы print_array
во внутреннюю функцию sort_by_transpositions
вместо того, чтобы иметь некоторые вызовы внутри sort_by_transpositions
и некоторые другие внутри main
. Проще, если все операторы печати расположены внутри одной и той же функции, а не разбросаны повсюду.