|
|
|
|
@ -1,65 +1,49 @@
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.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_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')
|
|
|
|
|
if (spec_size > 2)
|
|
|
|
|
{
|
|
|
|
|
switch (specifier[1])
|
|
|
|
|
switch (specifier[2])
|
|
|
|
|
{
|
|
|
|
|
case 'l':
|
|
|
|
|
typed_scan(long);
|
|
|
|
|
break;
|
|
|
|
|
case 'd':
|
|
|
|
|
{
|
|
|
|
|
for (unsigned int i = 0; i < size; i++)
|
|
|
|
|
{
|
|
|
|
|
if (scanf("%ld", ((long *) p_array) + i))
|
|
|
|
|
scan_el_cnt++;
|
|
|
|
|
typed_scan(double);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
case 'f':
|
|
|
|
|
{
|
|
|
|
|
for (unsigned int i = 0; i < size; i++)
|
|
|
|
|
{
|
|
|
|
|
if (scanf("%lf", ((double *) p_array) + i))
|
|
|
|
|
scan_el_cnt++;
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -67,104 +51,85 @@ int scan_array(void * p_array, size_t size, char * specifier)
|
|
|
|
|
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 (specifier[1])
|
|
|
|
|
switch (type[0])
|
|
|
|
|
{
|
|
|
|
|
case 'c':
|
|
|
|
|
{
|
|
|
|
|
char * new_p = p_array;
|
|
|
|
|
for (unsigned int i = 0; i < size; i++)
|
|
|
|
|
printf(specifier, new_p[i]);
|
|
|
|
|
} break;
|
|
|
|
|
typed_print(char);
|
|
|
|
|
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]);
|
|
|
|
|
typed_print(int);
|
|
|
|
|
break;
|
|
|
|
|
} 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]);
|
|
|
|
|
typed_print(float);
|
|
|
|
|
break;
|
|
|
|
|
} break;
|
|
|
|
|
case 'l':
|
|
|
|
|
{
|
|
|
|
|
if (spec_size > 2)
|
|
|
|
|
if (strlen(type) > 1)
|
|
|
|
|
{
|
|
|
|
|
switch (specifier[2])
|
|
|
|
|
switch (type[1])
|
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
typed_print(long);
|
|
|
|
|
break;
|
|
|
|
|
case 'f':
|
|
|
|
|
{
|
|
|
|
|
double * new_p = p_array;
|
|
|
|
|
for (unsigned int i = 0; i < size; i++)
|
|
|
|
|
printf(specifier, new_p[i]);
|
|
|
|
|
} break;
|
|
|
|
|
typed_print(double);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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':
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < colomn; i++)
|
|
|
|
|
if (strlen(type) > 1)
|
|
|
|
|
{
|
|
|
|
|
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++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < size / colomn; j++)
|
|
|
|
|
|
|
|
|
|
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++)
|
|
|
|
|
{
|
|
|
|
|
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]");
|
|
|
|
|
}
|
|
|
|
|
|