Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР ОАиП 1 семестр ФЗО 3 вариант

.docx
Скачиваний:
4
Добавлен:
24.12.2018
Размер:
22.78 Кб
Скачать

Вариант 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);

}