Задача на последовательности из натуральных чисел - 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;
- Если в текущей строке число в первом столбце больше числа во втором столбце, то они меняются местами;
- Если текущая строка была отсортирована, то она больше не участвует в сортировке.