diff --git a/my_c/my_funcs.c b/my_c/my_funcs.c index c04c98b..9d857a3 100644 --- a/my_c/my_funcs.c +++ b/my_c/my_funcs.c @@ -1,170 +1,135 @@ #include +#include #include #include "my_funcs.h" +#define typed_scan(type) for (unsigned int i = 0; i < size; i++) \ +{ \ + if (scanf(specifier, ((type *) p_array) + i)) \ + scan_el_cnt++; \ +} + +#define typed_print(type) for (unsigned int i = 0; i < size; i++) printf(specifier, *(((type *) p_array) + i)); + int scan_array(void * p_array, size_t size, char * specifier) { int scan_el_cnt = 0; size_t spec_size = strlen(specifier); - if (spec_size == 1) + if (spec_size > 1 && specifier[0] == '%') { - switch (specifier[0]) + switch (specifier[1]) { case 'c': - { - for (unsigned int i = 0; i < size; i++) - { - if (scanf("%c", ((char *) p_array) + i)) - scan_el_cnt++; - } - } break; + typed_scan(char); + break; case 'd': - { - for (unsigned int i = 0; i < size; i++) - { - if (scanf("%d", ((int *) p_array) + i)) - scan_el_cnt++; - } - } break; + typed_scan(int); + break; case 'f': + typed_scan(float); + break; + case 'l': { - for (unsigned int i = 0; i < size; i++) - { - if (scanf("%f", ((float *) p_array) + i)) - scan_el_cnt++; - } - } break; - } - } - else if (spec_size == 2) - { - if (specifier[0] == 'l') - { - switch (specifier[1]) + if (spec_size > 2) { - case 'd': - { - for (unsigned int i = 0; i < size; i++) - { - if (scanf("%ld", ((long *) p_array) + i)) - scan_el_cnt++; - } - } break; - case 'f': + switch (specifier[2]) { - for (unsigned int i = 0; i < size; i++) - { - if (scanf("%lf", ((double *) p_array) + i)) - scan_el_cnt++; - } - } break; + case 'l': + typed_scan(long); + break; + case 'd': + typed_scan(double); + break; + } } } + } } return scan_el_cnt; } -int print_array(void * p_array, size_t size, char * specifier) +void print_array(void * p_array, size_t size, char * type, char * specifier) { - size_t spec_size = strlen(specifier); - if (spec_size > 1 && specifier[0] == '%') + switch (type[0]) { - switch (specifier[1]) - { - case 'c': - { - char * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - case 'd': - case 'x': - case 'X': - { - int * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - case 'f': - { - float * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - case 'e': - { - double * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - case 'l': + case 'c': + typed_print(char); + break; + case 'd': + { + typed_print(int); + break; + } break; + case 'f': + { + typed_print(float); + break; + } break; + case 'l': + { + if (strlen(type) > 1) { - if (spec_size > 2) + switch (type[1]) { - switch (specifier[2]) - { - case 'd': - case 'x': - case 'X': - { - long * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - case 'f': - { - double * new_p = p_array; - for (unsigned int i = 0; i < size; i++) - printf(specifier, new_p[i]); - } break; - } + case 'd': + typed_print(long); + break; + case 'f': + typed_print(double); + break; } - } break; - - default: - return 0; } + } break; } - else - return 0; - - printf("\n"); - return 1; } -void print_array_table(void * p_array, size_t size, char * specifier, int colomn) +void print_array_table(void * p_array, size_t size, char * type, char * specifier, unsigned int colomn) { - size_t spec_size = strlen(specifier); - if (spec_size == 1 && specifier[0] == 'e') + unsigned int type_size = 0; + switch (type[0]) { - float * new_p = p_array; - for (unsigned int i = 0; i < size; i++) + case 'c': + type_size = sizeof(char); + break; + case 'd': + type_size = sizeof(int); + break; + case 'f': + type_size = sizeof(float); + break; + case 'l': + { + if (strlen(type) > 1) { - for (int j = 0; j < colomn; i++) - { - if (i + j + 2 > size) - return; - printf("%5e ", new_p[i]); - } - printf("\n"); + if (type[1] == 'd') + type_size = sizeof(long); + if (type[1] == 'f') + type_size = sizeof(double); } + } break; } - else if (spec_size == 2 && specifier[0] == 'l' && specifier[1] == 'd') - { - long * new_p = p_array; - for (unsigned int i = 0; i < size; i++) + + if (type_size) { + char * new_p = p_array; + size_t row_count = size / colomn; + size_t last_row_size = size % colomn; + for (unsigned int i = 0; i < row_count; i++) { - for (int j = 0; j < size / colomn; j++) - { - if (i + j + 1 > size) - return; - printf("%10ld ", *(new_p + i + j)); - } + print_array(new_p, colomn, type, specifier); + printf("\n"); + new_p += colomn * type_size; + } + if (last_row_size) { + print_array(new_p, last_row_size, type, specifier); printf("\n"); } } - printf("\n"); +} + +void clear_input(void) +{ + scanf("%*[^\n]"); } diff --git a/my_c/my_funcs.h b/my_c/my_funcs.h index d406763..9d3abd0 100644 --- a/my_c/my_funcs.h +++ b/my_c/my_funcs.h @@ -1,38 +1,56 @@ +#include + #ifndef my_funcs_h #define my_funcs_h -/* - Функция ввода массива через enter - void * p_array - указатель на первый элемент массива - size_t size - размер массива - char * specifier - спецификатор - Список спецификаторов: - с - char - d - int - f - float - ld -long - lf - double -*/ +/** + * @brief + * + * @param p_array указатель на первый элемент массива + * @param size размер массива + * @param specifier спецификатор для scanf + * @return количество считанных элементов + */ int scan_array(void * p_array, size_t size, char * specifier); -/* - Функция вывода массива с разделителей - void * p_array - указатель на первый элемент массива - size_t size - размер массива - char * specifier - спецификатор - char * separator - разделитель - Список спецификаторов: - с - char - d - int - f - float - e - экспонентная форма - x - шестнадцатиричная прописными - X - шестнадцатиричная заглавными - ld -long - lf - double -*/ -int print_array(void * p_array, size_t size, char * specifier); +/** + * @brief + * Функция вывода массива + * + * @param p_array указатель на первый элемент массива + * @param size размер массива + * @param type тип элементов массива: + * c - char; + * d - int; + * f - float; + * ld - long; + * lf - double + * @param specifier спецификатор для printf, применяется к каждому элементу + * @return int + */ +void print_array(void * p_array, size_t size, char * type, char * specifier); + +/** + * @brief + * Функция вывода массива в виде таблицы + * + * @param p_array указатель на первый элемент массива + * @param size размер массива + * @param type тип элементов массива: + * c - char; + * d - int; + * f - float; + * ld - long; + * lf - double + * @param specifier спецификатор для printf, применяется к каждому элементу + * @param colomn количество стобцов + * @return int + */ +void print_array_table(void * p_array, size_t size, char * type, char * specifier, unsigned int colomn); -void print_array_table(void * p_array, size_t size, char * specifier, int colomn); +/** + * @brief Функция очистки потока ввода + */ +void clear_input(void); #endif