Member 12775576 Ответов: 5

Показать выходные данные в соответствии с 3 правилами (нечетные, четные, сортировка) - массивы


Я попытался написать следуйте этим спецификациям:

1. У меня есть массив почитать от пользователей
2. нечетные числа должны быть в начале
3. четные числа должны быть в конце массива
4. сортировка по возрастанию нечетного и четного чисел
Это мой код.:

Что я уже пробовал:

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

int n;

int main(void){
	scanf("%d", &n);
	int arr[n], aux[n], count = 0;
	for(int i = 0; i < n; i++){
		scanf("%d", &arr[i]);
	}

	for(int i = 0; i < n; i++){
		if(arr[i] % 2 != 0){
			aux[i] = arr[i];
			count = i;
		}
		else
		{
			aux[n - i - 1] = arr[i];
		}
	}	

	for(int i = 0; i < count; i++){
		if( aux[i] > aux[i+1])
		{
			aux[i]   = aux[i] + aux[i+1];
			aux[i+1] = aux[i] - aux[i+1];
			aux[i]   = aux[i] - aux[i+1];

		}
	}

	for(int i = count; i < n; i++){
		if( aux[i] > aux[i+1])
		{
			aux[i]   = aux[i] + aux[i+1];
			aux[i+1] = aux[i] - aux[i+1];
			aux[i]   = aux[i] - aux[i+1];
		}
	}
	
	for(int i = 0; i < n; i++){
		printf("%d ", aux[i]);
	}

	printf("\n");

	return 0;
}


Но вывод неверен. Например, если я ввел размерность массива 4, а элементы массива равны 4 3 2 1, то выход будет:2 4196800 1 4196832, но я хочу быть 1 3 2 4. Можете ли вы мне помочь? Спасибо!

5 Ответов

Рейтинг:
1

Patrice T

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

Member 12775576

Правильный код здесь! :D Спасибо за помощь! :Д

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

#define n 4

int arr[n], aux[n];

int main(void)
{
	int count, j = 0, k = 0;
	
	for(int i = 0; i < n; i++){
		scanf("%d", &arr[i]);
	}

	for(int i = 0; i < n; ++i)
	{
		if(arr[i] % 2 != 0)
		{
			aux[k] = arr[i];
			k++;
		}
		else
		{
			aux[n - j - 1] = arr[i];
			j++;
		}
	}

	for(int o = 0; o < k - 1; o++)
	{
		for(int i = 0; i < k - o - 1; i++)
		{
			if( aux[i] > aux[i+1])
			{
				aux[i]   = aux[i] + aux[i+1];
				aux[i+1] = aux[i] - aux[i+1];
				aux[i]   = aux[i] - aux[i+1];

			}
		}
	}

	for(int o = k; o < n - 1; o++)
	{
		for(int i = k; i < n - o - 1; i++)
		{
			if( aux[i] > aux[i+1])
			{
				aux[i]   = aux[i] + aux[i+1];
				aux[i+1] = aux[i] - aux[i+1];
				aux[i]   = aux[i] - aux[i+1];
			}
		}
	}

	for(int i = 0; i < n; i++){
		printf("%d ", aux[i]);
	}

	printf("\n");

	return 0;
}


Graeme_Grant

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

Рейтинг:
0

Doug Joseph

Я не компилировал это, но что-то вроде этого должно работать: я предпочитаю просто определять массивы... просто старая школа, наверное.

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

int n;
int tmp;

#define swap( a, b ) { tmp = (a); (a) = (b); (b) = tmp; }

int main( void )
{
    int i, j, k;
    int arr[500], aux[500];
    int count = 0; 
    int odds = 0, evens = 0;
    
    printf( "How many numbers? " ); 
    scanf( "%d", &n );

    for ( i = 0; i < n; i++)
    {
        printf( "Entry #%0d:", i );
        scanf( "%d", &arr[i] );
    }

    // First break into odds and evens
    for ( i = 0; i < n, i++ )
    {
        // if it is odd
        if ( arr[i] & 0x01 )
        {
           aux[i] = arr[i];
           odds++;
        }
        else
        { 
           aux[n-1-i] = arr[i];
           evens++;
        };
    };
    
    // Now sort the odds... then sort the evens	
    if ( odds > 1 )
    {
        for ( j = 0; j < odds; j++ )
        {
            for ( k = 0; k < ( odds - 1 - j ); k++ )
            {
                if ( aux[k] > aux[k+1] ) swap( aux[k], aux[k+1] );
            };
        };
    };
    
    if ( evens > 1 )
    {
        for ( j = odds; j < n; j++ )
        {
            for ( k = odds; k < ( n - 1 - j ); k++ )
            {
                if ( aux[k] > aux[k+1] ) swap( aux[k], aux[k+1] );
            };
        };
    };
    
	
    for( i = 0; i < n; i++ )
    {
        printf("%d ", aux[i] );
    }

    printf("\n");

    return 0;
}


Надеюсь, это поможет.
-Дуга


Patrice T

Если вы прочтете решение 4, то увидите, что ОП решил свою проблему.

Doug Joseph

Я думаю, что это лучшее решение... но whatevs.

Рейтинг:
0

Jochen Arndt

Ваш aux массив unitialized содержит случайные значения в начале, и вы не гарантируете, что все элементы правильно установлены.

Я бы использовал две вспомогательные переменные для нечетного и четного индексов (нечетный индекс равен нулю в начале, а четный - n-1). Затем наполнить aux в первом цикле используется индекс, соответствующий значению, и инкремент соотв. уменьшите этот показатель.

Чем бы вы его заполнили aux при нечетных значениях в начале, четных-в конце, а нечетный индекс должен быть на единицу больше четного индекса (из - за инкремента/декремента).

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


Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

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

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
for(int i = 0; i < n; i++){

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Да, я, вероятно, мог бы сказать вам, в чем "проблема" - но это не трудно сделать самому, и вы узнаете что-то действительно стоящее в то же время!