Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по программированию на языке Си - A4.doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
670.21 Кб
Скачать

Вариант 2

Пусть задан одномерный массив вещественных чисел x[0], x[1], ... , x[n-1] (n - заданное натуральное число). Требуется получить и распечатать элементы этого массива в следующем порядке: подпоследовательность из элементов, стоящих в исходном массиве на нечетных местах, должна быть отсортирована в порядке возрастания, а подпоследовательность элементов, стоящих на четных местах - в порядке убывания.

Одномерные динамические массивы

Вариант 1

Задан одномерный массив целых чисел x. Получить новый массив y, элементами которого являются такие однозначные числа, которые получены из всех цифр последовательно записанных значений элементов массива x.

Например: x: 35, 8, 310, 80. y: 3, 5, 8, 3, 1, 0, 8, 0.

Вариант 2

Задан одномерный массив целых чисел x, состоящий только из 0 и 1. Получить новый массив y по правилу: заменить каждую группу подряд идущих нулей одним элементом, равным нулю, а каждую группу подряд идущих элементов, равных 1, заменить числом, равным количеству единиц в группе.

Например:

x: 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0. y: 1, 0, 4, 0, 2, 0.

Вариант 3

Задан одномерный массив целых чисел x, состоящий только из 0 и 1. Получить новый массив y по правилу: заменить каждую группу подряд идущих одинаковых элементов парой значений: значение самого элемента (0 или 1); количество повторений этого элемента.

Например: x: 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0. y: 0, 2, 1, 5, 0, 3, 1, 1, 0, 2. (Данная задача представляет собой фрагмент т.н. алгоритма группового сжатия данных.)

Вариант 4

Решить задачу 2, принимая в качестве исходного массив y, а в качестве получаемого – массив x.

Вариант 5

Задан одномерный массив целых чисел x, среди которых имеется достаточно большое количество подряд идущих одинаковых элементов. Получить новый массив y по правилу: заменить каждую группу подряд идущих одинаковых элементов парой значений: значение самого элемента; количество повторений этого элемента.

Например: x: 0, 0, 0, 5, 5, 5, 5, 5, 5, 8, 8, 8, 3, 3, 3, 3. y: 0, 3, 5, 6, 8, 3, 3, 4.

Вариант 6

Решить задачу 4, принимая в качестве исходного массив y, а в качестве получаемого – массив x.

Вариант 7

Задан одномерный массив целых чисел x, состоящий только из 0 и 1, причем нулевые элементы могут образовывать группы подряд идущих нулей, а каждая такая группа отделена от соседней только одним элементом-разделителем, равным 1. Для определенности положим, что первый и последний элементы массива всегда равны единице-раздели­телю. Получить новый массив y по правилу: заменить группу подряд идущих нулей одним элементом, значение которого равно количеству нулей в группе. Элементы, равные 1, оставить.

Например: x: 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1. y: 1, 3, 1, 7, 1, 2, 1, 1, 1.

Вариант 8

Решить задачу 6, принимая в качестве исходного массив y, а в качестве получаемого – массив x.

Вариант 9

Задан одномерный массив целых чисел x, состоящий только из 0 и 1, причем нулевые элементы могут образовывать группы подряд идущих нулей, а каждая такая группа отделена от соседней только одним элементом-разделителем, равным 1. Для определенности положим, что первый и последний элементы массива всегда равны единице-раздели­телю. Получить новый массив y по правилу: заменить группу подряд идущих нулей одним элементом, значение которого равно количеству нулей в группе. Элементы, равные 1, исключить.

Например: x: 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1. y: 3, 7, 2, 1.

Вариант 10

Решить задачу 8, принимая в качестве исходного массив y, а в качестве получаемого – массив x.

Вариант 11

Дан массив a размером n и число m<=n. Для каждого участка из m стоящих рядом элементов (а таких участков, очевидно, n-m+1), вычислить его сумму.

Двумерные динамические массивы

Вариант 1

Удалить из заданного массива все одинаковые строки (т.е. те, соответствующие элементы которых совпадают; очевидно, что и длины этих строк совпадают), оставив в массиве по одному представителю от каждой группы повторяющихся строк.

Например: 1 3 0 3 1 3 0 3 3 0 8 7 7 → 3 0 8 7 7 1 -3 -4 1 -3 –4 1 3 0 3 1 –3 -4

Вариант 2

Оставить в массиве только такие строки, длина каждой из которых не совпадает ни с какой длиной другой строки (другими словами, удалить из заданного массива все строки, длины которых совпадают, не оставив ни одной такой строки, длина которой совпадает с какой-либо другой).

Например: 1 3 0 3 3 0 8 7 7 3 0 8 7 7 1 3 4 0 → 1 8 4 1 3 0 3 1 8 4

Лабораторная работа №6 “ Обработка символьных строк”

Методические указания

  1. Строковый литерал в Си представляется в памяти как массив элементов типа char, в конце которого расположен нуль-терми­натор (‘\0'). Как и с любым массивом, со строковым литералом связан указатель на первый элемент массива (элемент с индексом 0). Таким образом, к отдельным символам строки можно обращаться по индексу – s[0], s[1],s[i],s[i+1] и т.д. – и по адресу – *s, *(s+1),*(s+i),*(s+i+1) и т.д.

  2. Следует помнить, что при использовании многих библиотечных функций (таких, как strcat(), strcpy() и т.п.) программисту самому следует позаботиться о том, чтобы для строки-результата было выделено достаточно памяти.

  3. Сравнивать две строки str1 и str2 в посимвольно следует только с помощью функции strcmp(). Сравнение str1==str2 есть сравнение значений указателей, а не символов этих строк.

  4. Если есть строка str1 и требуется создать её копию – строку srt2, то следует воспользоваться функцией strcpy(). Операция присваивания str2=str1 приведёт к присваиванию указателей, а не к созданию копии строки.

Пример

Поменять порядок символов, расположенных между первой и последней точкой, на обратный.

#include <windows.h>

#include <wincon.h>

#include <stdio.h>

#include<stdlib.h>

char* srev(char* str);

void main()

{

SetConsoleOutputCP(1251);

char str[50]="In.for mat i.ka ";

puts(str);

srev(str);

puts(str);

}

/*

Функция меняет в строке str порядок символов, расположенных между первой и последней точкой, на обратный.

*/

char* srev(char* str)

{

char* first,*last;

first=strchr(str,'.'); //Адрес первой точки

last=strrchr(str,'.'); //Адрес последней точки

//Если точек нет или она одна, строку не меняем:

if (first==NULL || first==last)

return str;

//На время “обрезаем” строку:

*last='\0';

strrev(first+1);

//Восстанавливаем последнюю точку:

*last='.';

return str;

}

Задания для самостоятельного выполнения.

Примечание.

Во всех задачах этой темы текст задан в виде строкового литерала. Группы символов этого текста, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами.

Задания I уровня сложности

Вариант 1

Определить, содержит ли текст символы, отличные от малых латинских букв и пробела.

Вариант 2

Выяснить, является ли заданный текст идентификатором.

Вариант 3

Если в тексте нет символа * , то оставить этот текст без изменения, иначе каждую из малых латинских букв, предшествующих первому вхождению символа *, заменить на цифру 3.

Вариант 4

Если в тексте нет символа + , то оставить этот текст без изменения, иначе каждую из цифр, предшествующих первому вхождению символа +, заменить символом -.

Вариант 5

Если в тексте нет малых латинских букв, то оставить его без изменения, иначе каждый из символов, следующих за первой группой малых латинских букв, заменить точкой.

Вариант 6

Подсчитать количество русских гласных букв в последнем слове текста.

Вариант 7

Подсчитать количество цифр в первом слове текста.

Вариант 8

В каждом из слов текста заменить первую букву звездочкой.

Вариант 9

Первое слово текста заменить тремя звездочками.

Вариант 10

Последнее слово текста заменить тремя звездочками.

Вариант 11

Заменить каждую цифру, расположенную между первой и последней точкой, символом ‘*’.

Вариант 12

Пусть первая часть текста есть все символы, расположенные до первого встретившегося пробела. Вторая часть - все остальные. Поменять местами первую и вторую части текста.

Вариант 13

Даны две строки. Вставить все символы второй строки в первую строку, поместив их после символа с заданным индексом.

Вариант 14

Даны две строки. Если первое слово одной строки совпадает с первым словом другой строки, то удалить первое слово той строки, длина которой больше. Иначе оставить строки без изменения.

Задания II уровня сложности

Вариант 1

Выяснить, является ли заданный текст десятичной записью целого числа.

Вариант 2

В тех словах, которые оканчиваются сочетанием букв ing, заменить это окончание на ed.

Вариант 3

Заменить каждый символ “.” (точка) на символ “...” (многоточие).

Вариант 4

Заменить каждый одиночный пробел двумя подряд идущими пробелами.

Вариант 5

Удалить из текста все пробелы.

Вариант 6

Удалить из текста все цифры.

Вариант 7

Заменить каждую цифру 1 на слово “один”.

Вариант 8

В заданном тексте заменить все словосочетания прикладное программное обеспечение на сокращение ППО.

Вариант 9

Удалить из заданного текста все пробелы, предшествующие первой попавшейся точке.

Вариант 10

Пусть текст содержит буквы и цифры. Преобразуйте его так, чтобы сначала в нем шли все цифры, а потом - все буквы исходного текста (в том порядке, в котором они встречаются в исходном тексте).

Задания III уровня сложности

Вариант 1

Проверить, правильно ли в заданном тексте написано слово программа (с удвоенным м). Если нет, то исправить ошибку. Учесть, что слово программа (с ошибкой или без) может встречаться в тексте не один раз. Определить также количество слов программа, записанных с ошибкой (с одним м).

Вариант 2

Проверить, все ли слова в тексте, оканчивающиеся на –ова, -ов, -ина, -ин, начинаются с заглавной буквы. Если нет, то исправить первую букву таких слов на заглавную.

Лабораторная работа №7 “ Указатели в параметрах функций ”

Методические указания

  1. Указатели в параметрах функций используются в следующих случаях: если параметр является модифицируемым, т.е., через него в функцию передаются данные, и через него же получают результат работы функции (типичным примером модифицируемых параметров являются аргументы функции обмена значений двух переменных); если параметр является выходным параметром, т.е., через него получают от функции результат её работы (например, функция нахождения действительных корней квадратного уравнения); если объём передаваемых в функцию данных достаточно велик.

  2. Если параметр функции является её выходным параметром, то необходимо следить за тем, чтобы объект, адрес которого передаётся в функцию как соответствующий фактический параметр, занимал в памяти достаточно места для размещения результатов работы функции.

Пример 1

Определить функцию для нахождения действительных корней квадратного уравнения по его коэффициентам. Предусмотреть случай, когда уравнение не имеет действительных корней. Считать, что коэффициент при старшем члене отличен от нуля.

#include <stdio.h>

#include <time.h>

#include <windows.h>

#include <wincon.h>

#include <math.h>

int roots(double a, double b, double c, double* x1, double* x2);

void main()

{

SetConsoleOutputCP(1251);

double a,b,c; //Коэффициенты уравнения

double x1,x2; //Корни уравнения

puts("Введите коэффициенты:");

scanf("%lf%lf%lf", &a,&b,&c);

int flag;

flag=roots(a,b,c,&x1,&x2);

if (flag==0)

puts("Уравнение не имеет корней");

else

{ puts("Корни уравнения:");

printf("x1=%.2lf\n", x1);

printf("x2=%.2lf\n",x2);

}

}

/*

Функция находит действительные корни квадратного уравнения с коэффициентами a, b, c. Возвращаемое значение – признак наличия или отсутствия действительных корней. Если они существуют, то по адресам x1 и x2 функция помещает найденные корни и возвращает 1. Иначе функция возвращает 0.

*/

int roots(double a, double b, double c, double* x1, double* x2)

{

double d; //Дискриминант уравнения

d=b*b-4*a*c;

if (d<0)

return 0; //Уравнение не имеет действительных корней

*x1=(-b+sqrt(d))/(2*a);

*x2=(-b-sqrt(d))/(2*a);

return 1; //Уравнение имеет действительные корни

}

Пример 2

Задан одномерный числовой массив. Получить новый массив, переписав в него все отрицательные элементы исходного массива без изменения порядка их следования.

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <windows.h>

#include <wincon.h>

int* create_vector(int n,int a,int b);

void print_vector(int*x,int n);

int*new_arr(int*x,int n,int*m);

void main()

{

//Формирование и печать исходного массива:

int n=10;

int *a;

a=create_vector(n,-10,10);

print_vector(a,n);

//Формирование и печать нового массива:

int size; //Число элементов

int* b;

b=new_arr(a,n,&size);

print_vector(b,size);

}

/*

Функция формирует динамический массив, помещая в него все отрицательные элементы массива x размером n. Возвращаемое значение – указатель на начало сформированого массива, по адресу m функция помещает количество элементов в новом массиве. Если в массиве x нет ни одного отрицательного элемента, то функция возвращает NULL, в этом случае значение по адресу m есть 0.

*/

int*new_arr(int*x, int n, int*m)

{

int count=0; //Счетчик отрицательных элементов

int i;

for(i=0;i<n;i++)

{

if(x[i]<0)

count++;

}

//Проверяем, не будет ли пуст новый массив:

if (count == 0)

{

*m = 0;

return NULL;

}

/*Объявляем указатель на новый массив и выделяем для него память: */

int*y;

y=(int*)malloc(count*sizeof(int));

//Заполняем новый массив:

int j = 0;

for(i=0;i<n;i++)

{

if(x[i]<0)

y[j++]=x[i];

}

/*По адресу m помещаем количество элементов в новом массиве: */

*m=j;

return y;

}

/*

Функция формирует одномерный динамический массив из n элементов типа int, заполняет его случайными числами из промежутка [a,b] и возвращает указатель созданный массив.

*/

int* create_vector(int n,int a,int b)

{

int*x;

x=(int*)malloc(n*sizeof(int));

for(int i=0;i<n;i++)

{

x[i]=(int)((double)rand()/RAND_MAX*(b-a+1)+a);

}

return x;

}

/*

Функция печатает на экране массив x размером n.

*/

void print_vector(int*x,int n)

{

for(int i=0;i<n;i++)

{

printf("%5d",x[i]);

}

puts("");

}

Задания для самостоятельного выполнения.

Задания I уровня сложности