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