- •Предисловие
- •Лабораторная работа №1 “ Простые (скалярные) типы данных языка Си. Составление и отладка простейшей Си-программы”
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Лабораторная работа №3 “ Реализация циклов в языке Си ”
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 11
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 2
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 8
- •Вариант 9
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 4
- •Вариант 5
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Лабораторная работа №8 “ Работа со структурами ”
- •Вариант 22
- •Вариант 23
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Лабораторная работа №9 “ Потоки ввода/вывода в Си ”
- •Содержание
Вариант 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 “ Обработка символьных строк”
Методические указания
Строковый литерал в Си представляется в памяти как массив элементов типа char, в конце которого расположен нуль-терминатор (‘\0'). Как и с любым массивом, со строковым литералом связан указатель на первый элемент массива (элемент с индексом 0). Таким образом, к отдельным символам строки можно обращаться по индексу – s[0], s[1],s[i],s[i+1] и т.д. – и по адресу – *s, *(s+1),*(s+i),*(s+i+1) и т.д.
Следует помнить, что при использовании многих библиотечных функций (таких, как strcat(), strcpy() и т.п.) программисту самому следует позаботиться о том, чтобы для строки-результата было выделено достаточно памяти.
Сравнивать две строки str1 и str2 в посимвольно следует только с помощью функции strcmp(). Сравнение str1==str2 есть сравнение значений указателей, а не символов этих строк.
Если есть строка 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
Определить функцию для нахождения действительных корней квадратного уравнения по его коэффициентам. Предусмотреть случай, когда уравнение не имеет действительных корней. Считать, что коэффициент при старшем члене отличен от нуля.
#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 уровня сложности
