Вернуть массивы и их размеры из void-функции - C (СИ)
Формулировка задачи:
Всем привет, я в этом деле новичок.
программа вылетает посредине.
в задании попрасили распечатать 2 массива в main, как мне передать в него 2 массива и 2 их размера.
и функция должна выглядеть именно так.
void func(int num,int *arr1, int *arr2)
заранее спасибо за помощь.
void func(int num,int *arr1, int *arr2) { int size=1 arr1=(int*)malloc(size* sizeof(int)); arr2=(int*)malloc(size* sizeof(int)); //разные изменения над массивами. size++; arr1=(int*)realloc(arr1, size*sizeof(int)); arr2=(int*)realloc(arr2, size*sizeof(int)); } int main() { int num, *bigarr=NULL, *smallarr=NULL; printf("input num: ",num); scanf("%d",&num); func(num,smallarr,bigarr); printf("%d%d%d",smallarr[0],smallarr[1],bigarr[0]);
Решение задачи: «Вернуть массивы и их размеры из void-функции»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdlib.h> void split(const int num, int** const smallDigitsPtr, int* const smallDigitsLengthPtr, int** const bigDigitsPtr, int* const bigDigitsLengthPtr) { int temp = num; int bigLength = 0; int smallLength = 0; int i = 0; int j = 0; int* big = NULL; int* small = NULL; /* counting digits */ while (temp > 0) { if ((temp % 10) >= 5) { bigLength++; } else { smallLength++; } temp = temp / 10; } /* special cases */ if (bigLength == 0) { bigLength = 1; } if (smallLength == 0) { smallLength = 1; } /* allocating memory */ big = malloc(bigLength * sizeof(*big)); small = malloc(smallLength * sizeof(*small)); memset(big, 0, bigLength * sizeof(*big)); memset(small, 0, smallLength * sizeof(*small)); /* writing digits into arrays */ i = bigLength - 1; j = smallLength - 1; temp = num; while (temp > 0) { if ((temp % 10) >= 5) { big[i] = temp % 10; i--; } else { small[j] = temp % 10; j--; } temp = temp / 10; } /* exporting results */ (*bigDigitsPtr) = big; (*smallDigitsPtr) = small; (*bigDigitsLengthPtr) = bigLength; (*smallDigitsLengthPtr) = smallLength; } int main(void) { int* big = NULL; int* small = NULL; int M = 0; int N = 0; int i = 0; const int num = 380512; split(num, &small, &M, &big, &N); printf("%d --> big = ", num); for (i = 0; i < N; i++) { printf("%d", big[i]); } printf(", small = "); for (i = 0; i < M; i++) { printf("%d", small[i]); } printf("\n"); free(big); free(small); return 0; }
Объяснение кода листинга программы
- В функции split(), код разделяет число на две части: большие цифры и маленькие цифры.
- Переменная
temp
инициализируется значением входного числаnum
. - Переменные
bigLength
иsmallLength
используются для отслеживания количества больших и маленьких цифр соответственно. - Переменные
big
иsmall
используются для хранения больших и маленьких цифр соответственно. - Код проверяет каждую цифру числа
num
, и если она больше или равна 5, то она считается большой цифрой и увеличивается значение переменнойbigLength
. В противном случае, она считается маленькой цифрой и увеличивается значение переменнойsmallLength
. - После прохождения всего числа
num
, код проверяет, были ли найдены большие или маленькие цифры. Если нет, то переменнымbigLength
иsmallLength
присваивается значение 1. - Код выделяет память для массивов
big
иsmall
с помощью функции malloc(). - Затем, с помощью функции memset(), код очищает выделенную память, заполняя ее нулями.
- Код записывает цифры в массивы
big
иsmall
, начиная с самых больших и заканчивая самыми маленькими. - Наконец, результаты работы функции split() экспортируются в функцию main().
- В функции main(), код вызывает функцию split() с входным числом
num
. - Затем, код выводит на экран массивы
big
иsmall
. - После вывода, память, выделенная для массивов
big
иsmall
, освобождается с помощью функции free(). - Функция main() возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д