Удалить из последовательности все числа, удовлетворяющие условию - C (СИ)

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

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

Здравствуйте, подскажите где накосячил с алгоритмом - никак не пойму где(подозреваю, что в void move()). Всё написал и отладил, но работает некорректно, не знаю точно, может я в синтаксисе кое-какие нюансы не учёл. жду помощи. заранее спасибо Задание: Код:
#include <stdio.h>
#define M 100;
#include <locale.h>
 
void fill_arr (int *array, int n){
    int i;
    printf("Ââåäèòå ýëåìåГ*ГІГ» Г¬Г*Г±Г±ГЁГўГ*:\n");
    for (i = 0; i < n; ++i) { scanf("%d", array); ++array; }
}
 
void show_arr (int *array, int n){
    int i;
    for (i = 0; i < n; ++i) { printf("%d ", array); ++array; }
    printf("\n"); 
}
 
void swap (int *x, int *y) {
    int tmp;
    tmp=*x; *x=*y; *y=tmp;
}
 
void sort (int *array, int n){
    int k=0;
    int *curr;
    int *next;
    curr=array;
    next=curr+1;
 
    do
    {
        if (*curr>*next)
            swap(curr, next);
        curr=curr+1; next=next+1;
        ++k;
    } while (k<n-1);
}
 
int figlen (int x) { 
    int k; k=0;
    do
    {
        x=x/10;
         ++k;
    } while (x!=0);
    return k;
}
 
void desintegrate (int x, int *t_a){  
    int l;
    int dgt;
    dgt=0;
    l=figlen(x);

    do
    {
        dgt=x%10; 
        *t_a=dgt;
        x=x/10;
        t_a=t_a+1;
    } while (x!=0);
}
 
int count (int x, int *p){
    int k=0, i = 0;
    int n=figlen(x);
    for (; i < n; ++i){
        if (*p==x) ++k;
    ++p;
    }
    return k;
}
 
int findmin(int *ptr,int n, int k){
    int *curr, *next;
    int i = 0;
    
    curr=ptr; next=ptr+1;
    int min=0;
 
    for (; i < n-1; ++i) {
        if (*curr<*next) min=*curr;
        ++curr; ++next;
    }
    k=count(min, ptr);
    return min;
}
 
int findmax(int *ptr, int n, int k){
    int *curr, *next;
    
    curr=ptr; next=ptr+1;
    int max=0, i = 0;
 
    for (; i < n-1; ++i) {
        if (*curr>*next) max=*curr;
        ++curr; ++next;
    }
    k=count(max, ptr);
    return max;
}
 
int multi_minmax(x){
    int tmp_ar[100];
    int *ptr=tmp_ar;
    int mi=1, ma=1, min=0, max=0, n=0, res=0;
    n=figlen(x);
    
    desintegrate (x, ptr);
    min=findmin(ptr, n, mi);
    max=findmax(ptr, n, ma);
    res=(max*ma)*(mi*min);
}

void move(int *ptr, int *array, int n){
    ptr=array;
    int i = 0;
    int *curr=ptr;
    int *next=curr+1;
    for (; i < n; ++i)  {
        swap(curr, next);
        ++curr; ++next;
    }
}
 
void edit_arr (int *array, int n){
    int k=0, i = 0;
    int *curr=array+1;
    int *next=curr+1;
    for (; i < n-1; ++i)
    {
        if (multi_minmax(*array)<multi_minmax(*curr))
        {
            *curr=*next; 
            move(curr, array, n); 
            ++k;
        }
    ++curr; ++next;
    }
    n-=k;
}
 
int main() {
setlocale(LC_ALL, "");
int a[100];
int *ptr=a;
int n=0;
 
printf("Ââåäèòå Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ*\n");
scanf("%d", &n);
 
fill_arr(ptr, n);
show_arr(ptr,n);
 
edit_arr (ptr, n);
show_arr(ptr, n);
 
sort(ptr, n);
show_arr(ptr, n);
 
scanf("%d", &n);
return 0;
}
Работает так:

Решение задачи: «Удалить из последовательности все числа, удовлетворяющие условию»

textual
Листинг программы
/*
 ============================================================================
 Name        : min_max_num.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
 
#include <stdio.h>
#include <stdlib.h>
int get_size();
long int *alloc_vector(int size);
void destroy_vector(long int *a);
void input_array(long int* a, int size);
void print(long int *a, int size);
void print_mm(long int *a, int size);
void sort(long int *a, int size);
long int *rebuild(long int *a, int size, int *newsize);
long int minmax(int n);
 
int main(void) {
    int s = 0;
    int news = 0;
    long int *v;
    long int *newv;
    s = get_size();
    v = alloc_vector(s);
    input_array(v, s);
    print(v, s);
    printmm(v,s);
    newv = rebuild(v, s, &news);
    print(newv, news);
    sort(newv, news);
    print(newv, news);
    destroy_vector(v);
    destroy_vector(newv);
    return 0;
}
int get_size() {
    int size = 0;
    printf("VVedi n - kol-vo chisel v  posl.");
    do {
        scanf("%d", &size);
    } while (size == 0);
    return size;
}
long int *alloc_vector(int size) {
    return (long int*) malloc(size * sizeof(long int));
}
;
void destroy_vector(long int *a) {
    if (a)
        free(a);
}
;
void input_array(long int*a, int size) {
    int i = 0;
    for (i = 0; i < size; ++i)
        a[i] = rand() % 2000;
}
void print(long int *a, int size) {
    int i = 0;
    printf("\n");
    for (i = 0; i < size; ++i)
        printf("%8ld", a[i]);
}
 
void printmm(long int *a, int size) {
    int i = 0;
    printf("\n");
    for (i = 0; i < size; ++i)
        printf("%8ld", minmax(a[i]));
}
 
void sort(long int *a, int size) {
    int i, j, tmp;
    for (i = 1; i < size; ++i) // цикл проходов, i - номер прохода
            {
        tmp = a[i];
        for (j = i - 1; j >= 0 && a[j] < tmp; --j) // поиск места элемента в готовой последовательности
            a[j + 1] = a[j];    // сдвигаем элемент направо, пока не дошли
        a[j + 1] = tmp; // место найдено, вставить элемент
    }
}
 
long int * rebuild(long int *a, int size, int *newsize) {
    int i = 0, j = 0;
    int comp = minmax(a[0]);
    *newsize = 1; // так как 1 элемент есть +1 на размер;
    for (i = 1; i < size; ++i)
        if (minmax(a[i]) <= comp)
            (*newsize)++;
    long int *newa = alloc_vector(*newsize);
    for (i = 0; i < size; ++i) {
        if (minmax(a[i]) <= comp) {
            newa[j++] = a[i];
        }
    }
    return newa;
}
 
long int minmax(int n) {
// считает произведение минимапльного на максимальное
    int min = 0, cmin = 0, pmin = 1;
    int max = 0, cmax = 0, pmax = 1;
    int save_n = n;
    if (!(n / 10))
        min = max = n;
    else {
        min = max = n % 10;
        do {
            n /= 10;
            if (!n)
                break;
            if (n % 10 > max)
                max = n % 10;
            if (n % 10 < min)
                min = n % 10;
        } while (n);
    }
    n = save_n;
// считаем число минимальных и максимальных
    while (n) {
        if (n % 10 == max)
            ++cmax;
        if (n % 10 == min)
            ++cmin;
        n /= 10;
    }
    // находим произведение минимального и максимального нужное число раз
    while (cmin-- > 0)
        pmin *= min;
    while (cmax-- > 0)
        pmax *= max;
 
    return pmin * pmax;
}

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

Код представляет собой набор функций и процедур для работы с массивом целых чисел. В нем реализована сортировка массива по возрастанию, а также удаление чисел, удовлетворяющих определенному условию. Список функций и процедур:

  1. get_size - функция для получения размера массива
  2. alloc_vector - функция для выделения памяти под массив
  3. destroy_vector - процедура для освобождения памяти, выделенной под массив
  4. input_array - функция для заполнения массива случайными числами
  5. print - функция для вывода содержимого массива на экран
  6. printmm - функция для вывода на экран чисел, удовлетворяющих определенному условию
  7. sort - функция для сортировки массива по возрастанию
  8. rebuild - функция для перестройки массива, удаляя числа, удовлетворяющие определенному условию
  9. minmax - функция для вычисления произведения минимального и максимального чисел в массиве Пользователь вводит размер массива, затем вводит исходные данные. После этого происходит сортировка массива, вывод его содержимого на экран, перестройка массива с удалением чисел, удовлетворяющих определенному условию, и вывод нового массива на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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