Заполнить два массива размером 20 и 30 элементов случайным образом буквами латинского алфавита - C (СИ)
Формулировка задачи:
Задачка:
Заполнить два массива размером 20 и 30 элементов случайным образом буквами латинского алфавита. Заполнить третий массив теми буквами, которые входят и в первый и во второй массив, четвертый – оставшимися буквами из первого и второго. Провести сортировку полученных массивов. Для контроля результата также сделайте распечатку массивов, в том числе исходного.
Код написал с божьей помощью но его у меня не принимают.Преподавателю нужны функции,а я не могу их делать..Уж выручите пожалуйста!!
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
#include <math.h>
#include <time.h>
#define N1 20
#define N2 30
int main()
{
void randomize()
{
srand(time(0));
}
char random(char r)
{
return (rand()%r);
}
void new_item(char *a,int n,char r1,char r2)
{
a[n]=random(r2-r1)+r1;
}
void fill(char *a,int n,char r1,char r2)
{
int i;
a[0]=random(r2-r1)+r1;
for(i=1;i<n;i++) new_item(a,i,r1,r2);
}
void print(char *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%2c",a[i]);
puts("");
}
char a1[N1],a2[N2],a3[N1+N2],a4[N1+N2];
randomize();
fill(a1,N1,'a','z');
fill(a2,N2,'a','z');
print(a1,N1);
print(a2,N2);
int ifMatch;
int par1, par2;
int i, j, k, q = 0, w = 0;
for (i = 0; i < N1; ++i) {
ifMatch = 0;
for (j = 0; j < N2; ++j) {
if (a2[j] == a1[i]) {
par1 = 0;
for (k = 0; k < q; ++k)
if (a1[i] == a3[k]) {
par1 = 1;
break;
}
if (par1 == 0) {
a3[q] = a1[i];
++q;
}
ifMatch = 1;
break;
}
}
if (ifMatch == 0) {
par2 = 0;
for (k = 0; k < w; ++k)
if (a1[i] == a4[k]) {
par2 = 1;
break;
}
if (par2 == 0) {
a4[w] = a1[i];
++w;
}
}
}
for (i = 0; i < N2; ++i) {
ifMatch = 0;
for (j = 0; j < q; ++j)
if (a3[j] == a2[i]) {
ifMatch = 1;
break;
}
for (j = 0; j < w; ++j)
if (a4[j] == a2[i]) {
ifMatch = 1;
break;
}
if (ifMatch == 0) {
a4[w] = a2[i];
++w;
}
}
ifMatch = 1;
char buf;
while (ifMatch == 1) {
ifMatch = 0;
for (i = 0; i < q - 1; ++i)
if (a3[i] > a3[i + 1]) {
buf = a3[i];
a3[i] = a3[i + 1];
a3[i + 1] = buf;
ifMatch = 1;
}
}
ifMatch = 1;
while (ifMatch == 1) {
ifMatch = 0;
for (i = 0; i < w - 1; ++i)
if (a4[i] > a4[i + 1]) {
buf = a4[i];
a4[i] = a4[i + 1];
a4[i + 1] = buf;
ifMatch = 1;
}
}
print(a3,q);
print(a4,w);
return 0;
}Решение задачи: «Заполнить два массива размером 20 и 30 элементов случайным образом буквами латинского алфавита»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#define SIZE_A 20
#define SIZE_B 30
#define SIZE_ALPH 26
//-----------------------------------------------------------------------------
void Randomize() {
srand(time(NULL));
}
//-----------------------------------------------------------------------------
int Random(int min, int max) {
return rand() % (max - min + 1) + min;
}
//-----------------------------------------------------------------------------
void RandomFill(char array[], size_t size) {
size_t i;
for (i = 0; i < size; ++i) {
array[i] = Random('a', 'z');
}
}
//-----------------------------------------------------------------------------
void Print(const char array[], size_t size) {
size_t i;
for (i = 0; i < size; ++i) {
printf("%c", array[i]);
}
printf("\n");
}
//-----------------------------------------------------------------------------
void Alph(const char array[], size_t size, int alph[]) {
size_t i;
for (i = 0; i < size; ++i) {
if (isalpha(array[i])) {
alph[tolower(array[i]) - 'a'] = 1;
}
}
}
//-----------------------------------------------------------------------------
int And(int a, int b) {
return a && b;
}
//-----------------------------------------------------------------------------
int Xor(int a, int b) {
return a != b;
}
//-----------------------------------------------------------------------------
size_t Compare(const char a[], size_t sizeA, const char b[], size_t sizeB,
char result[], int (*Cmp)(int, int)) {
int alphA[SIZE_ALPH] = { 0 };
int alphB[SIZE_ALPH] = { 0 };
size_t count = 0;
size_t i;
Alph(a, sizeA, alphA);
Alph(b, sizeB, alphB);
for (i = 0; i < SIZE_ALPH; ++i) {
if (Cmp(alphA[i], alphB[i])) {
result[count++] = i + 'a';
}
}
return count;
}
//-----------------------------------------------------------------------------
int main() {
char a[SIZE_A], b[SIZE_B], c[SIZE_ALPH], d[SIZE_ALPH];
size_t sizeC, sizeD;
Randomize();
RandomFill(a, SIZE_A);
RandomFill(b, SIZE_B);
sizeC = Compare(a, SIZE_A, b, SIZE_B, c, And);
sizeD = Compare(a, SIZE_A, b, SIZE_B, d, Xor);
printf("A: "); Print(a, SIZE_A);
printf("B: "); Print(b, SIZE_B);
printf("C: "); Print(c, sizeC);
printf("D: "); Print(d, sizeD);
return 0;
}
Объяснение кода листинга программы
- Объединение двух массивов в один с использованием операции
||(логическое ИЛИ). - Заполнение двух массивов случайными буквами латинского алфавита.
- Сравнение двух массивов с использованием функции
Compare. - Использование функции
Alphдля подсчета количества букв в каждом массиве. - Использование функции
Printдля вывода содержимого массивов на экран. - Использование функции
RandomFillдля заполнения массивов случайными значениями. - Использование функции
Randomдля генерации случайных чисел. - Использование функции
srandдля инициализации генератора случайных чисел. - Использование функции
Andдля сравнения двух значений с использованием логического И. - Использование функции
Xorдля сравнения двух значений с использованием логического ИЛИ. - Объединение двух массивов в один с использованием операции
+(конкатенация). - Использование функции
memsetдля очистки памяти. - Использование функции
strlenдля определения длины строки. - Использование функции
strcpyдля копирования строки. - Использование функции
atoiдля преобразования строки в целое число. - Использование функции
isalphaдля проверки, является ли символ буквой. - Использование функции
tolowerдля преобразования символа в нижний регистр. - Использование функции
printfдля вывода информации на экран. - Использование функции
scanfдля ввода информации с клавиатуры. - Использование функции
exitдля завершения программы.