1

Тема: Робота з масивами C

У мене є масив який запивнюється з клавіатури, потрібно визначити чи елементи цього масиву впорядковані за спаданням.

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

void main()
{
    setlocale(0,"");
    int maxSize = 100;
    int n, i, col=0;
    do
    {
            printf("Введiть розмiр масиву вiд 2 до %d: ", maxSize);
            scanf("%d", &n);
            if(n<maxSize && n>1)
                break;
    }while(1);

    int *X = malloc (sizeof(int) * n);

    for(i=0; i<n; i++)
    {
        printf("Введiть елемент масиву X[%d]: ", i);
        scanf("%d", &X[i]);
    }

    printf("Одержаний масив:\n{");
    for(i=0; i<n; i++)
    {
        printf("%4.1d", X[i]);
    }
    printf("}\n");

    for(i=0; i<n; i++)
    {
        if( X[i] >  X[i+1] )
            col++;
    }

    if (col==n)
        printf("Елементи масиву упорядкованi за спаданням");
    else
        printf("Елементи масиву не упорядкованi за спаданням");

    free(X);
}

Але чомусь це не працює з числами меншими за нуль. В чому моя помилка?
https://replace.org.ua/uploads/images/10577/ae887c5cd3620f1cb2c00ddb3fa92ad8.png
https://replace.org.ua/uploads/images/10577/0e933ec9b9ce12f44b7b065c3cbffead.png

2 Востаннє редагувалося koala (24.11.2020 20:40:39)

Re: Робота з масивами C

Річ не в тому, що елементи від'ємні, річ у тім, що C не перевіряє межі масиву. Тому

    for(i=0; i<n; i++)
    {
        if( X[i] >  X[i+1] )
            col++;
    }

при i==n-1 (остання ітерація) порівнюватиме X[n-1] з X[n], а що трапиться в тій пам'яті - невизначено, звідси і невизначена поведінка програми. Хоча все ж припущу, що там трапляється 0, тому ви й бачите проблеми з від'ємними числами. Цикл має бути до n-1.

3 Востаннє редагувалося koala (24.11.2020 21:30:07)

Re: Робота з масивами C

Пара порад.

   if(n<maxSize && n>1)

значно краще виглядає як

   if(1<n && n<maxSize)

Одразу видно, що n між 1 та maxSize.

Тут не треба лічити кількість впорядкованих елементів - достатньо однієї невпорядкованої пари, і можна переривати цикл. Тому десь так:

    int isSorted = 1; //будемо вважати, що воно впорядковане
    for(i=0; isSorted && i<n-1; i++) //цикл виконуємо, поки is_sorted
    {
        if( X[i] <=  X[i+1] )
            isSorted=0;
    }
    if( isSorted ) {//якщо не 0, то впорядковано
Подякували: SaintMal1

4

Re: Робота з масивами C

Тобто виправити дану проблему ніяк не можна?

5

Re: Робота з масивами C

А, так, вибачте, не виправив у останньому фрагменті коду. Тепер працює.

Подякували: SaintMal1