input & output library

main
Stepan Pilipenko 1 year ago
parent b8e2bbf3c7
commit 97365c3253

@ -1,170 +1,135 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "my_funcs.h" #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_array(void * p_array, size_t size, char * specifier)
{ {
int scan_el_cnt = 0; int scan_el_cnt = 0;
size_t spec_size = strlen(specifier); size_t spec_size = strlen(specifier);
if (spec_size == 1) if (spec_size > 1 && specifier[0] == '%')
{ {
switch (specifier[0]) switch (specifier[1])
{ {
case 'c': case 'c':
{ typed_scan(char);
for (unsigned int i = 0; i < size; i++) break;
{
if (scanf("%c", ((char *) p_array) + i))
scan_el_cnt++;
}
} break;
case 'd': case 'd':
{ typed_scan(int);
for (unsigned int i = 0; i < size; i++) break;
{
if (scanf("%d", ((int *) p_array) + i))
scan_el_cnt++;
}
} break;
case 'f': case 'f':
typed_scan(float);
break;
case 'l':
{ {
for (unsigned int i = 0; i < size; i++) if (spec_size > 2)
{
if (scanf("%f", ((float *) p_array) + i))
scan_el_cnt++;
}
} break;
}
}
else if (spec_size == 2)
{
if (specifier[0] == 'l')
{
switch (specifier[1])
{ {
case 'd': switch (specifier[2])
{
for (unsigned int i = 0; i < size; i++)
{
if (scanf("%ld", ((long *) p_array) + i))
scan_el_cnt++;
}
} break;
case 'f':
{ {
for (unsigned int i = 0; i < size; i++) case 'l':
{ typed_scan(long);
if (scanf("%lf", ((double *) p_array) + i)) break;
scan_el_cnt++; case 'd':
} typed_scan(double);
} break; break;
}
} }
} }
}
} }
return scan_el_cnt; 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); switch (type[0])
if (spec_size > 1 && specifier[0] == '%')
{ {
switch (specifier[1]) case 'c':
{ typed_print(char);
case 'c': break;
{ case 'd':
char * new_p = p_array; {
for (unsigned int i = 0; i < size; i++) typed_print(int);
printf(specifier, new_p[i]); break;
} break; } break;
case 'd': case 'f':
case 'x': {
case 'X': typed_print(float);
{ break;
int * new_p = p_array; } break;
for (unsigned int i = 0; i < size; i++) case 'l':
printf(specifier, new_p[i]); {
} break; if (strlen(type) > 1)
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':
{ {
if (spec_size > 2) switch (type[1])
{ {
switch (specifier[2]) case 'd':
{ typed_print(long);
case 'd': break;
case 'x': case 'f':
case 'X': typed_print(double);
{ break;
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;
}
} }
} 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); unsigned int type_size = 0;
if (spec_size == 1 && specifier[0] == 'e') switch (type[0])
{ {
float * new_p = p_array; case 'c':
for (unsigned int i = 0; i < size; i++) 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 (type[1] == 'd')
{ type_size = sizeof(long);
if (i + j + 2 > size) if (type[1] == 'f')
return; type_size = sizeof(double);
printf("%5e ", new_p[i]);
}
printf("\n");
} }
} break;
} }
else if (spec_size == 2 && specifier[0] == 'l' && specifier[1] == 'd')
{ if (type_size) {
long * new_p = p_array; char * new_p = p_array;
for (unsigned int i = 0; i < size; i++) 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++) print_array(new_p, colomn, type, specifier);
{ printf("\n");
if (i + j + 1 > size) new_p += colomn * type_size;
return; }
printf("%10ld ", *(new_p + i + j)); if (last_row_size) {
} print_array(new_p, last_row_size, type, specifier);
printf("\n"); printf("\n");
} }
} }
printf("\n"); }
void clear_input(void)
{
scanf("%*[^\n]");
} }

@ -1,38 +1,56 @@
#include <stdio.h>
#ifndef my_funcs_h #ifndef my_funcs_h
#define my_funcs_h #define my_funcs_h
/* /**
Функция ввода массива через enter * @brief
void * p_array - указатель на первый элемент массива *
size_t size - размер массива * @param p_array указатель на первый элемент массива
char * specifier - спецификатор * @param size размер массива
Список спецификаторов: * @param specifier спецификатор для scanf
с - char * @return количество считанных элементов
d - int */
f - float
ld -long
lf - double
*/
int scan_array(void * p_array, size_t size, char * specifier); int scan_array(void * p_array, size_t size, char * specifier);
/* /**
Функция вывода массива с разделителей * @brief
void * p_array - указатель на первый элемент массива * Функция вывода массива
size_t size - размер массива *
char * specifier - спецификатор * @param p_array указатель на первый элемент массива
char * separator - разделитель * @param size размер массива
Список спецификаторов: * @param type тип элементов массива:
с - char * c - char;
d - int * d - int;
f - float * f - float;
e - экспонентная форма * ld - long;
x - шестнадцатиричная прописными * lf - double
X - шестнадцатиричная заглавными * @param specifier спецификатор для printf, применяется к каждому элементу
ld -long * @return int
lf - double */
*/ void print_array(void * p_array, size_t size, char * type, char * specifier);
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, применяется к каждому элементу
* @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 #endif

Loading…
Cancel
Save