Задача на последовательности из натуральных чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Условие задачи: Дана последовательность из m натуральных чисел. Для каждого числа исходной последовательности подсчитать с помощью функции количество цифр в записи числа и определить, расположены ли цифры в записи числа в возрастающем порядке. Сформировать новую последовательность, поместив в нее числа из исходной последовательности, цифры в которых расположены в порядке возрастания. Упорядочить новую последовательность по убыванию количества цифр в записи числа. Вывести исходную и полученную последовательности. Вообщем, функцию, про которую говорится в условии, я написал (coord). Также есть функции на ввод массива и проверку правильности ввода (getArray и getInt), процедура сортировки (sort). Есть ошибки в функции (work). Как ее поправить так, чтобы все работало? Помогите, пожалуйста. При тестировании получается, к примеру, такой результат: А должно быть 557, 17
#include <stdio.h>
#include <locale.h>
 
int coord(int x1, int *pr)
{
    int f = 10, a, n1 = 0;
    while (x1>0)
    {
        a = x1 % 10;
        n1 = n1 + 1;
        if (a <= f)
            f = a;
        else f = 0;
        x1 = x1 / 10;
    }
    if (f == 0)
        *pr = 1;
    else *pr = -1;
    return n1;
}
 
int getInt(int*pa)
{
    int n;
    do
    {
        n = scanf_s("%d", pa);
        if (n == 0)
        {
            printf("Error!\n");
            scanf_s("%*c");
 
        }
    } while (n == 0);
    return n < 0 ? 0 : 1;
}
 
int getArray(int a[])
{
    int n, i;
    printf("Введите размерность массива\n");
    getInt(&n);
    while (n < 2)
    {
        printf("Размерность массива должна быть больше 1. Повторите ввод размерности.\n");
        getInt(&n);
    }
    printf("Введите элементы массива\n");
    for (i = 0; i < n; ++i)
        getInt(&a[i]);
    return n;
}
 
void print(int a[], int m)
{
    int i;
    for (i = 0; i < m; ++i)
        printf("%d, ", a[i]);
    printf("\n");
}
 
void sort(int a[], int m1, int r[], int mr1)
{
    int t, i, j;
    for (i = 0; i < (m1 - 1); ++i)
    for (j = 0; j < (m1 - 1); ++j)
    if (r[j] < r[j + 1])
    {
        t = r[j];
        r[j] = r[j + 1];
        r[j + 1] = t;
        t = a[j];
        a[j] = a[j + 1];
        a[j + 1] = t;
    }
}
 
int work(int a[], int m, int r[])
{
    int mr, length, pr, i;
    mr = m;
    for (i = 0; i < m; i++)
    {
        length = coord(a[i], &pr);
        r[i] = length;
    }
    sort(a, m, r, mr);
    for (i = 0; i < m; i++)
    if (pr == 1)
        r[i] = a[i];
    else r[i] = 0;
    return mr;
}
 
int main()
{
    int Array[100], Result[100];
    int Length, ResLength;
    setlocale(LC_ALL, "Rus");
    Length = getArray(Array);
    printf("Исходный массив:\n");
    print(Array, Length);
    ResLength = work(Array, Length, Result);
    printf("Полученный массив:\n");
    print(Result, ResLength);
    return 0;
}

Решение задачи: «Задача на последовательности из натуральных чисел»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 27
#define M 3
#define K 2
void GetArray(int arr[][M] , int Squeeze[][K]);
void mySort(int arr[][K]);
int Quant_Increasing(int , int* );
int main()
{
    int A[N][M] = {{0}}, i, B[N][K] = {{0}};
    srand(time(NULL));
    puts("Source array 'A':");
    GetArray(A, B);
    putchar('\n');
    puts("Array 'B':");
    for(i = 0; B[i][1]; i++)
        printf("%8d%3d\n", B[i][0], B[i][1]);
    mySort(B);
    putchar('\n');
    puts("Sorted array 'B' :");
    for(i = 0; B[i][1]; i++)
        printf("%8d%3d\n", B[i][0], B[i][1]);
    return 0;
}
int Quant_Increasing(int a, int* flag)
{
    int i, tmp;
    *flag = 1;
    for(i = 0; a; i++, a /= 10)
        if(!i)
            tmp = a % 10;
        else{
            if(*flag){
                if(a % 10 > tmp)
                    *flag = 0;
                tmp = a % 10;
            }
        }
    return i;
}
void GetArray(int arr[][M], int Squeeze[][K])
{
    int i, j = 0;
    for(i = 0; i < N; i++){
        if(i < N / 3)
            arr[i][0] = rand() % 1001;
        if(i >= N / 3 && i < N / 3 * 2)
            arr[i][0] = rand() % 10001;
        if(i >= N / 3 * 2)
            arr[i][0] = rand() % 1000001;
        arr[i][1] = Quant_Increasing(arr[i][0], &arr[i][2]);
        if(arr[i][2] && arr[i][1] > 1){
            Squeeze[j][0] = arr[i][0];
            Squeeze[j++][1] = arr[i][1];
        }
        printf("%8d%3d%3d\n", arr[i][0], arr[i][1], arr[i][2]);
    }
}
void mySort(int arr[][K])
{
    int i, j, max = 0, tmp;
    for(i = 0; arr[i][1]; i++){
        for(j = i + 1, max = i; arr[j][1]; j++)
            if(arr[max][1] < arr[j][1])
                max = j;
        if(i != max && max != 0){
            tmp = arr[i][1];
            arr[i][1] = arr[max][1];
            arr[max][1] = tmp;
            tmp = arr[i][0];
            arr[i][0] = arr[max][0];
            arr[max][0] = tmp;
        }
    }
}

Объяснение кода листинга программы

  1. Объявлены переменные:
    • A[N][M] - массив из N строк по M элементов, инициализированный нулями;
    • B[N][K] - массив из N строк по K элементов, инициализированный нулями;
    • i, j - переменные для работы с массивами;
    • N, M, K - константы, определяющие размеры массивов;
    • Quant_Increasing - функция, принимающая целое число и флаг, возвращающая количество цифр в числе и обновляющая флаг;
    • GetArray - функция, принимающая два массива и заполняющая их случайными числами;
    • mySort - функция, принимающая массив и сортирующая его по убыванию количества увеличивающихся разрядов.
  2. В функции main():
    • Задается начальное значение для генератора случайных чисел;
    • Выводится шапка таблицы;
    • Вызывается функция GetArray для заполнения массива B;
    • Выводится содержимое массива B;
    • Вызывается функция mySort для сортировки массива B;
    • Выводится отсортированное содержимое массива B;
    • Возвращается 0, заканчивая работу программы.
  3. В функции GetArray():
    • Задаются условия для заполнения первого, второго и третьего столбцов массива A;
    • Вычисляется количество увеличивающихся разрядов для каждого числа в массиве A;
    • Если число в массиве A удовлетворяет условию, то оно копируется в массив Squeeze;
    • Выводится содержимое массива A.
  4. В функции mySort():
    • Происходит перебор всех строк массива B;
    • Если в текущей строке число в первом столбце больше числа во втором столбце, то они меняются местами;
    • Если текущая строка была отсортирована, то она больше не участвует в сортировке.

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы