Member 13113109 Ответов: 3

В чем тут проблема?


вопрос в том, чтобы написать функцию, чтобы взять массив и проверить, отсортирован ли он

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

#include <stdio.h>
#include <stdlib.h>
int check(int n,int a[]);
int main()
{
    int a[100],n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
    printf("%d",a[n]);
    check(int n,int a[]);
    if (check(int n,int a[]) = 1)
        {
            printf("the array isn't sorted");
        }`
    return 0;
}
int check(int n,int a[])
{
  int i,s;
  for(i=0;i<n;i++)
    {
        if(a[i] < a[i+1])
        {
            s = a[i];
            a[i] = a[i+1];
            a[i+1] = s;
            return 0;

    }
        else {
            return 1;
        }
    }
}

[no name]

Скажите своему учителю, что он должен научить свои классы, как использовать отладчик для отладки своих домашних заданий.

nv3

Как это верно! Мой виртуальный 10.

3 Ответов

Рейтинг:
2

Jochen Arndt

Существует множество проблем. Некоторые из них уже должны быть указаны компилятором.

Смотрите комментарии:

int main()
{
    int a[100],n,i;
    /* Hopefully the user know what to enter without guiding him. */
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    /* The element a[n] is not initialised: Garbage will be printed out */
    printf("%d",a[n]);
    /* C basics: How to call a function. The compiler should complain about this */
    check(int n,int a[]);
    /* As above.
       Using a value of 1 as not sorted is rather uncommon. 
    */
    if (check(int n,int a[]) = 1)
    {
        printf("the array isn't sorted");
    }
    return 0;
}

int check(int n,int a[])
{
    int i,s;
    for(i=0;i<n;i++)
    {
        /* Whith the last loop iteration (i == n-1) 
           this will access again the unitialised element a[n].
            So the loop should start at 1 when comparing with the previous item 
            or the end condition should be < n-1.
        */
        if(a[i] < a[i+1])
        {
            s = a[i];
            a[i] = a[i+1];
            a[i+1] = s;
            return 0;
        }
        else {
            return 1;
        }
    }
}

Требование состоит в том, чтобы проверить, отсортирован ли массив, но приведенный выше код изменит один элемент и вернет ноль, когда какой-нибудь элемент меньше, чем следующий. С моей точки зрения, массив не должен быть изменен. Кроме того, я бы подумал, что сортировка означает, что все элементы расположены в порядке возрастания. Таким образом, условие выхода из цикла и возврата "не отсортированного" будет заключаться в том, что любой элемент больше следующего (или меньше предыдущего).


Рейтинг:
0

OriginalGriff

Посмотрите на ваш код: я удалю биты, не имеющие отношения к вашей проблеме.

int check(int n,int a[])
    {
    for(i=0;i<n;i++)
        {
        if(a[i] < a[i+1])
            {
            return 0;
            }
        else 
            {
            return 1;
            }
        }
    }
Итак, если n больше 1, как это происходит i когда-нибудь тебе будет 2?

Когда вы исправите это, он потерпит неудачу, вероятно, с ошибкой сегментации, потому что вы смотрите на один элемент больше, чем содержит входной массив:
if(a[i] < a[i+1])
Но i колеблется от 0 к n - 1, так i+1 это от 1 к n в то время как индексы вашего массива запускаются из 0 к n - 1


Рейтинг:
0

Patrice T

Вас просят проверить, отсортирован ли массив или нет ,вас не просят сортировать массив, так почему же вы меняете элементы в массиве?

s = a[i];
a[i] = a[i+1];
a[i+1] = s;

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

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