КР ОАиП 1 семестр ФЗО 3 вариант
.docxВариант 3
Задача №1
Условие:
3. Массив длиной N заполнен в случайном порядке числами из диапазона от
1 до k < N. Не используя других массивов, подсчитать количество раз-
личных чисел. Число действий должно быть порядка N+k.
Решение:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
void hoar(int *, int, int, int); // прототип функции сортировки методом Хоара
int main()
{
int *ms;
int i, j, N;
printf("Vvedite N="); // ввод размера массива
scanf_s("%d", &N);
ms = (int *)malloc(10);
fflush(stdin);
for (i = 0; i < N; i++)
{
printf("Vvedite element %d\n", i + 1); // ввод элементов массива
scanf_s("%d", &ms[i]);
}
for (i = 0; i < N; i++)
{
printf("%d", ms[i]); // вывод элементов введенного массива
}
printf("\n");
hoar(ms, 0, N-1, N); // вызов функции сортировки
for (i = 0; i < N; i++) // вывод отсортированного массива
{
printf("%d", ms[i]);
}
printf("\n");
j = 0; // пересчёт количества одинаковых чисел
for (i = 0; i < N; i++)
{
if (ms[i] != ms[i + 1])
j++;
}
printf("\nKolichestvo razlichnih chisel ravno %d\n", j);
return 0;
}
void hoar(int *ms, int l, int r, int N) // определение функции сортировки
int i, j, k;
int sr = ms[(l + r) / 2];
i = l; j = r;
do
{
while (ms[i] < sr) i++;
while (ms[j] > sr) j--;
if (i <= j)
{
k = ms[i];
ms[i] = ms[j];
ms[j] = k;
i++; j--;
}
} while (i <= j);
if (i < r)
hoar(ms, i, r, N);
if (j >l)
hoar(ms, l, j, N);
}
Задача №2
Условие:
3. Ввести матрицу. Элементы матрицы – строки. Подсчитать сумму кодов
символов каждого слова и, если сумма оказалась четной, развернуть зер-
кально это слово в строке. Полученные матрицы вывести на экран. Стан-
дартных функций работы со строками не использовать.
Решение:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#define N 2
void reverse(char *str, int n);
int main()
{
int i, s = 0, n, k = 0, ost, j = 0;
char *str[N];
for (i = 0; i < N; i++) //* Ввод матицы, состоящей из строк
{
printf("Vvedite stroky %d\n", i + 1);
str[i] = (char*)malloc(25);
fgets(str[i], 24, stdin);
}
for (i = 0; i < N; i++) //* Вывод её же сразу же
{
printf("Stroka %d ravna\n", i + 1);
puts(str[i]);
}
for (i = 0; i < N; i++) //*Цикл для строк матрицы
{
while (*(str[i] + j) != '\n' && *(str[i] + j) != '\0') //*пока символ, на который указывает указатель, не пробел и не конец строки
{
if (*(str[i] + j) > 32) //если Ascii- код символа, на который указывает указатель, больше 32 (т.е. если символ не пробел)
{
s += *(str[i] + j); // s-сумма aski-кодов символов слова
k++; // к-количество букв в слове
printf("symbol of str=%c\n", *(str[i] + j));
}
if (*(str[i] + j+1) < 33)
{
printf("Kolichestvo simvolov ravno %d \n", k); //* вывод к до его зануления, так как при переходе к следующему слову, его нужно занулить
printf("Summa aski-kodov slova ravna %d \n", s); //* вывод суммы aski-кодов
ost = s % 2; //* остаток от деления суммы aski-кодов слова на 2
printf("Ost=%d\n", ost);
if (ost == 0)//* если остаток от деления суммы aski-кодов слова на 2 равен нулю, то
{
printf("REVERS pos %d, ascii_sum %d Char=%c\n", j, s, *(str[i]+j));
reverse(str[i], j);
}
k = 0;
s = 0;
}
j++; //*j-переменная, на которую увеличивается указатель (для прохода по строке)
}
j = 0;
}
getchar();
return 0;
}
void reverse(char *str, int j) {// функция реверс сюда передаётся указатель на строку и j-номер последнего символа слова, которое нужно перевернуть
int n = 0, i;
char *str1;
str1 = (char*)malloc(25);
printf("in REV: J=%d, Char=%c\n", j, *(str + j));
while (j >= 0 && *(str + j) != ' ')
{
*(str1 + n) = *(str + j); // запись из последнего элемента j строки str в первый элемент n строки str1;
n++;// n растёт
j--;// j уменьшается
printf("n=%d\n", n);
}
j++;
for (i = 0; i < n; i++, j++)
*(str + j) = *(str1 + i); // прямая запись содержимого строки str1 в строку str
printf("Stroka 1 ravna\n");
puts(str1);
free(str1);// очистка строки str1
printf("Stroka ravna\n");
puts(str);
}