Удалить из последовательности все числа, удовлетворяющие условию - 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 - функция для вычисления произведения минимального и максимального чисел в массиве Пользователь вводит размер массива, затем вводит исходные данные. После этого происходит сортировка массива, вывод его содержимого на экран, перестройка массива с удалением чисел, удовлетворяющих определенному условию, и вывод нового массива на экран.