Удалить из последовательности все числа, удовлетворяющие условию - 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; }
Объяснение кода листинга программы
Код представляет собой набор функций и процедур для работы с массивом целых чисел. В нем реализована сортировка массива по возрастанию, а также удаление чисел, удовлетворяющих определенному условию. Список функций и процедур:
- get_size - функция для получения размера массива
- alloc_vector - функция для выделения памяти под массив
- destroy_vector - процедура для освобождения памяти, выделенной под массив
- input_array - функция для заполнения массива случайными числами
- print - функция для вывода содержимого массива на экран
- printmm - функция для вывода на экран чисел, удовлетворяющих определенному условию
- sort - функция для сортировки массива по возрастанию
- rebuild - функция для перестройки массива, удаляя числа, удовлетворяющие определенному условию
- minmax - функция для вычисления произведения минимального и максимального чисел в массиве Пользователь вводит размер массива, затем вводит исходные данные. После этого происходит сортировка массива, вывод его содержимого на экран, перестройка массива с удалением чисел, удовлетворяющих определенному условию, и вывод нового массива на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д