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