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

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

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

Здравствуйте! Условие задачи: Дана последовательность из m натуральных чисел. Для каждого числа исходной последовательности подсчитать с помощью функции количество цифр в записи числа и определить, расположены ли цифры в записи числа в возрастающем порядке. Сформировать новую последовательность, поместив в нее числа из исходной последовательности, цифры в которых расположены в порядке возрастания. Упорядочить новую последовательность по убыванию количества цифр в записи числа. Вывести исходную и полученную последовательности. Вообщем, функцию, про которую говорится в условии, я написал (coord). Также есть функции на ввод массива и проверку правильности ввода (getArray и getInt), процедура сортировки (sort). Есть ошибки в функции (work). Как ее поправить так, чтобы все работало? Помогите, пожалуйста. При тестировании получается, к примеру, такой результат: А должно быть 557, 17
Листинг программы
  1. #include <stdio.h>
  2. #include <locale.h>
  3. int coord(int x1, int *pr)
  4. {
  5. int f = 10, a, n1 = 0;
  6. while (x1>0)
  7. {
  8. a = x1 % 10;
  9. n1 = n1 + 1;
  10. if (a <= f)
  11. f = a;
  12. else f = 0;
  13. x1 = x1 / 10;
  14. }
  15. if (f == 0)
  16. *pr = 1;
  17. else *pr = -1;
  18. return n1;
  19. }
  20. int getInt(int*pa)
  21. {
  22. int n;
  23. do
  24. {
  25. n = scanf_s("%d", pa);
  26. if (n == 0)
  27. {
  28. printf("Error!\n");
  29. scanf_s("%*c");
  30. }
  31. } while (n == 0);
  32. return n < 0 ? 0 : 1;
  33. }
  34. int getArray(int a[])
  35. {
  36. int n, i;
  37. printf("Введите размерность массива\n");
  38. getInt(&n);
  39. while (n < 2)
  40. {
  41. printf("Размерность массива должна быть больше 1. Повторите ввод размерности.\n");
  42. getInt(&n);
  43. }
  44. printf("Введите элементы массива\n");
  45. for (i = 0; i < n; ++i)
  46. getInt(&a[i]);
  47. return n;
  48. }
  49. void print(int a[], int m)
  50. {
  51. int i;
  52. for (i = 0; i < m; ++i)
  53. printf("%d, ", a[i]);
  54. printf("\n");
  55. }
  56. void sort(int a[], int m1, int r[], int mr1)
  57. {
  58. int t, i, j;
  59. for (i = 0; i < (m1 - 1); ++i)
  60. for (j = 0; j < (m1 - 1); ++j)
  61. if (r[j] < r[j + 1])
  62. {
  63. t = r[j];
  64. r[j] = r[j + 1];
  65. r[j + 1] = t;
  66. t = a[j];
  67. a[j] = a[j + 1];
  68. a[j + 1] = t;
  69. }
  70. }
  71. int work(int a[], int m, int r[])
  72. {
  73. int mr, length, pr, i;
  74. mr = m;
  75. for (i = 0; i < m; i++)
  76. {
  77. length = coord(a[i], &pr);
  78. r[i] = length;
  79. }
  80. sort(a, m, r, mr);
  81. for (i = 0; i < m; i++)
  82. if (pr == 1)
  83. r[i] = a[i];
  84. else r[i] = 0;
  85. return mr;
  86. }
  87. int main()
  88. {
  89. int Array[100], Result[100];
  90. int Length, ResLength;
  91. setlocale(LC_ALL, "Rus");
  92. Length = getArray(Array);
  93. printf("Исходный массив:\n");
  94. print(Array, Length);
  95. ResLength = work(Array, Length, Result);
  96. printf("Полученный массив:\n");
  97. print(Result, ResLength);
  98. return 0;
  99. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define N 27
  5. #define M 3
  6. #define K 2
  7. void GetArray(int arr[][M] , int Squeeze[][K]);
  8. void mySort(int arr[][K]);
  9. int Quant_Increasing(int , int* );
  10. int main()
  11. {
  12.     int A[N][M] = {{0}}, i, B[N][K] = {{0}};
  13.     srand(time(NULL));
  14.     puts("Source array 'A':");
  15.     GetArray(A, B);
  16.     putchar('\n');
  17.     puts("Array 'B':");
  18.     for(i = 0; B[i][1]; i++)
  19.         printf("%8d%3d\n", B[i][0], B[i][1]);
  20.     mySort(B);
  21.     putchar('\n');
  22.     puts("Sorted array 'B' :");
  23.     for(i = 0; B[i][1]; i++)
  24.         printf("%8d%3d\n", B[i][0], B[i][1]);
  25.     return 0;
  26. }
  27. int Quant_Increasing(int a, int* flag)
  28. {
  29.     int i, tmp;
  30.     *flag = 1;
  31.     for(i = 0; a; i++, a /= 10)
  32.         if(!i)
  33.             tmp = a % 10;
  34.         else{
  35.             if(*flag){
  36.                 if(a % 10 > tmp)
  37.                     *flag = 0;
  38.                 tmp = a % 10;
  39.             }
  40.         }
  41.     return i;
  42. }
  43. void GetArray(int arr[][M], int Squeeze[][K])
  44. {
  45.     int i, j = 0;
  46.     for(i = 0; i < N; i++){
  47.         if(i < N / 3)
  48.             arr[i][0] = rand() % 1001;
  49.         if(i >= N / 3 && i < N / 3 * 2)
  50.             arr[i][0] = rand() % 10001;
  51.         if(i >= N / 3 * 2)
  52.             arr[i][0] = rand() % 1000001;
  53.         arr[i][1] = Quant_Increasing(arr[i][0], &arr[i][2]);
  54.         if(arr[i][2] && arr[i][1] > 1){
  55.             Squeeze[j][0] = arr[i][0];
  56.             Squeeze[j++][1] = arr[i][1];
  57.         }
  58.         printf("%8d%3d%3d\n", arr[i][0], arr[i][1], arr[i][2]);
  59.     }
  60. }
  61. void mySort(int arr[][K])
  62. {
  63.     int i, j, max = 0, tmp;
  64.     for(i = 0; arr[i][1]; i++){
  65.         for(j = i + 1, max = i; arr[j][1]; j++)
  66.             if(arr[max][1] < arr[j][1])
  67.                 max = j;
  68.         if(i != max && max != 0){
  69.             tmp = arr[i][1];
  70.             arr[i][1] = arr[max][1];
  71.             arr[max][1] = tmp;
  72.             tmp = arr[i][0];
  73.             arr[i][0] = arr[max][0];
  74.             arr[max][0] = tmp;
  75.         }
  76.     }
  77. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы