Для чего size_t? - C (СИ)
Формулировка задачи:
И как объявить size_t через type def,или лучше size_t объявить через что нибудь другое
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void Print(int* arr, size_t size)
{
for(size_t i = 0; i < size; i++)
printf( "%d ", *(arr+i) );
printf("\n");
}
void Sort(int* arr, size_t size)
{
int temp;
size_t j;
for (size_t i=0; i < size; i++)
{
temp = arr[ i ];
for ( j = i-1; j >= 0 && arr[ j ] > temp; j--)
arr[ j+1 ] = arr[ j ];
arr[ j+1 ] = temp;
}
}
int main()
{
size_t size_a, size_b = 0;
bool flag = true;
printf("A array size > ");
scanf("%d", &size_a);
if(size_a>20)
size_a = 20; //так как размер максимум 20, ставлю лимит
int* arr_a = (int*)malloc((size_a+1)*sizeof(int));
int* arr_b = NULL, *temp = NULL;
printf("Filling A array...\n");
for(size_t i = 0; i < size_a; i++)
{
printf("%d > ",i);
scanf("%d", (arr_a + i));
}
Print(arr_a,size_a);
arr_b = (int*)malloc(size_a*sizeof(int));
for(size_t i = 2; i < size_a; i+=2)
{
if( arr_a[ i-1 ] % 2 )
{
arr_b[size_b] = arr_a[ i ];
size_b++;
}
}
if(!size_b)
{
free(arr_a);
free(arr_b);
printf("Nothing to copy...");
return 0;
}
temp = (int*)realloc(arr_b, size_b*sizeof(int));
if(!temp)
{
free(arr_a);
free(arr_b);
perror("Error occured while rellocating B array");
return 0;
}
arr_b = temp;
temp = NULL;
Print(arr_b, size_b);
Sort(arr_b, size_b);
Print(arr_b, size_b);
printf("Done...");
free(arr_b);
free(arr_a);
getch();
return 0;
}Решение задачи: «Для чего size_t?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
// #include <conio.h>
#include <stdbool.h>
void Print(int* arr, size_t size)
{
for(size_t i = 0; i < size; i++)
printf( "%d ", *(arr+i) );
printf("\n");
}
void Sort(int* arr, size_t size)
{
int temp;
size_t j;
for (size_t i=0; i < size; i++)
{
temp = arr[ i ];
for ( j = i-1; j >= 0 && arr[ j ] > temp; j--)
arr[ j+1 ] = arr[ j ];
arr[ j+1 ] = temp;
}
}
int main()
{
size_t size_a, size_b = 0;
bool flag = true;
printf("A array size > ");
scanf("%d", &size_a);
if(size_a>20)
size_a = 20; //так как размер максимум 20, ставлю лимит
int* arr_a = (int*)malloc((size_a+1)*sizeof(int));
int* arr_b = NULL, *temp = NULL;
printf("Filling A array...\n");
for(size_t i = 0; i < size_a; i++)
{
printf("%d > ",i);
scanf("%d", (arr_a + i));
}
Print(arr_a,size_a);
arr_b = (int*)malloc(size_a*sizeof(int));
for(size_t i = 2; i < size_a; i+=2)
{
if( arr_a[ i-1 ] % 2 )
{
arr_b[size_b] = arr_a[ i ];
size_b++;
}
}
if(!size_b)
{
free(arr_a);
free(arr_b);
printf("Nothing to copy...");
return 0;
}
temp = (int*)realloc(arr_b, size_b*sizeof(int));
if(!temp)
{
free(arr_a);
free(arr_b);
perror("Error occured while rellocating B array");
return 0;
}
arr_b = temp;
temp = NULL;
Print(arr_b, size_b);
Sort(arr_b, size_b);
Print(arr_b, size_b);
printf("Done...");
free(arr_b);
free(arr_a);
// getch();
return 0;
}
Объяснение кода листинга программы
- В этом коде определены три функции:
Print,Sortиmain. - Функция
Printпринимает два аргумента: указатель на массив целых чисел и его размер. Она выводит все элементы массива на экран через пробел. - Функция
Sortпринимает два аргумента: указатель на массив целых чисел и его размер. Она сортирует этот массив по возрастанию. - В функции
mainопределены следующие переменные:size_aиsize_b- размер массивовarr_aиarr_bсоответственно.flag- флаг, который сбрасывается при достижении размера массива 20.arr_a- указатель на массив целых чисел, заполняемый пользователем.arr_b- указатель на массив целых чисел, который заполняется при помощи алгоритманаибольший общий делитель.temp- временный указатель, используемый при динамическом выделении памяти.
- В цикле пользователь вводит размеры массивов
arr_aиarr_b. - Затем происходит заполнение массива
arr_aцелыми числами, введенными пользователем. - Выводится на экран содержимое массива
arr_a. - Создается массив
arr_bразмером в два раза меньше, чемarr_a, и заполняется элементами, которые являются чётными числами вarr_a. - Если массив
arr_bпуст, то оба массива освобождаются и выводится сообщение об ошибке. - Массив
arr_bсортируется функциейSort. - Выводится на экран отсортированный массив
arr_b. - Оба массива освобождаются.