Выполнить функциями calloc() или malloc() - C (СИ)
Формулировка задачи:
Написать пользовательскую функцию, решающую указанную ниже задачу. Массивы А и В динамические, выделение памяти выполнить функциями calloc() или malloc(), обращение к элементам массива только через указатель.
Предусмотреть реакцию программы на ситуации, при которых задача не имеет решения.
Может помочь свести эту задачу к функциям malloc() и calloc()?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 10
int main (void)
{
double a = -8.0,b=8.0,t,a1=-11.0,b1=11.0,m1,m2;
double arr1[N],arr2[N], *pDop[N];
int i;
// Заполнение 1 массива случайными числами
for(i = 0; i < N; ++i)
arr1[i] = a + (b - a)*(double)rand()/RAND_MAX;
//Вывод 1 массива
printf("\n\t The initial array of [%1.4f, %1.4f]:\n", a, b);
for (i = 0; i < N; ++i)
printf("\n\t%2d) %8.4f", i+1, arr1[i]);
// Заполнение 2 массива случайными числами
for(i = 0; i < N; ++i)
arr2[i] = a + (b - a)*(double)rand()/RAND_MAX;
//Вывод 2 массива
printf("\n\t The initial array of [%1.4f, %1.4f]:\n", a, b);
for (i = 0; i < N; ++i)
printf("\n\t%2d) %8.4f", i+1, arr2[i]);
// Взятие адресов элементов исходного массива
for (i = 0; i < N; ++i)
pDop[i] = &arr1[i];
//Поиск элемнтов больше t в первом массиве
t=-2.0;
m1=0.0;m2=0.0;
for (i=0; i<N; ++i) {
if (arr1[i]>t) m1=m1+1.0;
}
printf("\nm1=%2.0lf",m1);
// Взятие адресов элементов исходного массива
for (i = 0; i < N; ++i)
pDop[i] = &arr2[i];
//Поиск элемнтов больше t в вторым массиве
for (i=0; i<N; ++i) {
if (arr2[i]>t) m2=m2+1.0;
}
printf("\nm2=%2.0lf",m2);
if(m1<m2){
for (i = 0; i < N; ++i) printf("\n\t%2d) %8.4f\n", i+1, arr1[i]);
for (i = 0; i < N; ++i) printf("\n\t%2d) %8.4f\n", i+1, arr2[i]);
}
else
{for (i = 0; i < N; ++i) printf("\n\t%2d) %8.4f\n", i+1, arr2[i]);
for (i = 0; i < N; ++i) printf("\n\t%2d) %8.4f\n", i+1, arr1[i]);
};
printf("\n\n Press any key: ");
_getch();
}Решение задачи: «Выполнить функциями calloc() или malloc()»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <malloc.h>
void Output(int *,int);
int Search(int *,int, int);
int main()
{
setlocale(LC_CTYPE,"Russian");
int *A,*B;
int n,m,v,y,z,i,j=0,y1,y2;
printf("\nВведите v:");
scanf_s("%d", &v);
printf("\nВведите n:");//Формирование 1 массива
scanf_s("%d", &n);
y=n;
A = (int *) (malloc(y*sizeof(int)));
if(!A)
{ printf("Предел размерности!");
}
printf("\nВведите элементы:");
for (i=0; i<n; i++) {
printf("\n A[%d]=",i);
scanf_s("%d", A+i);
}
printf("\nВведите m:");//Формирование 2 массива
scanf_s("%d", &m);
z=m;
B = (int *) (malloc(z*sizeof(int)));
if(!B)
{ printf("Предел размерности!");
}
printf("\nВведите элементы:");
for (i=0; i<m; i++) {
printf("\n B[%d]=",i);
scanf_s("%d", B+i);}
y1=Search(A,n,v);
y2=Search(B,m,v);
if (y1==y2) printf("Количество чисел меньше заданного в обоих массивах одинаково"); else {
if (y1<y2)
{Output(A,n);Output(B,m);}
else {Output(B,m);Output(A,n);}}
_getch();
}
int Search(int *a1, int n1, int v1){// Функция поиска количества элементов в массиве меньше заданного числа
int j=0;
for ( int i1=0; i1<n1; i1++)
{if (a1[i1]<v1) j++;
}
return j;
}
void Output(int *mas, int n1)//Функция вывода массива
{
for( int i=0; i<n1; i++){
printf("\n\n");
printf(" %d ", *(mas+i));
}
}
Объяснение кода листинга программы
- Объявление переменных: n, m, v, y, z, i, j=0, y1, y2;
- Ввод числа v с помощью scanf_s();
- Ввод размера первого массива n с помощью scanf_s();
- Выделение памяти под первый массив с помощью malloc();
- Если память под первый массив не выделена, выводится сообщение об ошибке;
- Ввод элементов первого массива с помощью scanf_s();
- Ввод размера второго массива m с помощью scanf_s();
- Выделение памяти под второй массив с помощью malloc();
- Если память под второй массив не выделена, выводится сообщение об ошибке;
- Ввод элементов второго массива с помощью scanf_s();
- Вызов функции Search(), которая ищет количество чисел меньше заданного в обоих массивах;
- Вызов функции Output(), которая выводит первый массив;
- Вызов функции Output(), которая выводит второй массив;
- Если количество чисел меньше заданного в обоих массивах одинаково, выводится соответствующее сообщение;
- Если количество чисел меньше заданного в обоих массивах не одинаково, выводится сообщение, указывающее, в каком из массивов больше чисел меньше заданного;
- Вывод первого массива;
- Вывод второго массива;
- Возвращение из функции main();
- Вывод сообщения, что программа успешно завершилась;
- Ожидание нажатия клавиши с помощью _getch().