РАЗДЕЛ 3. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
3.1. Программирования на языках высокого уровня
3.1.1. Написать функцию, оставляющую в строке по одному пробелу между словами.
Постановка задачи : в файле записана исходная строка, содержащая цифры, буквы, пробелы, символы. Наша задача: оставить между словами по одному пробелу, в независимости сколько их было в исходной строчке.
да нет
да нет
да нет
да
Описание алгоритма: На вход функции передаются указатели на начало исходной строки и на начало результирующей. Программа начинает пробегать по символу всю строчку. Если в начале строки находиться множество пробелов, программа записывает их в результирующую строку, как только встретили символ, считаем, что это начало слова. Слово, это набор любых символов, слова разделены пробелами. Записываем символы в результирующую строку до тех пор пока не встретили пробел. Как только встречаем пробел, программа пробегает по исходной строчки до следующего символа, не являющегося пробелом, и в результирующую строку записываем один пробел и текущий символ и т.д. до того пока не встретим символ конца строки («\0»). Функция завершена. Так же в функции реализована проверка на заполнение результирующей строки, если заполнения не происходит, программа аварийно завершается, выдавая сообщение об ошибки.
программа:
/* в функцию передается, указатель на начало исходной строки (*tmp1) и на начало результирующей строки(*tmp2)*/
int func(char *tmp1, char *tmp2){
int not_f = 0;
int len = 1; //переменная для динамического выделения памяти,
//каждый раз увеличивается на один при добавлении
//нового символа
int index = 0;
/*если исходная строка оказалось пустой, выдаем сообщение об ошибки и заканчиваем программу*/
if (tmp2 == NULL) {printf("ERROR->1\n"); abort();}
tmp2[len - 1] = '\0'; // записываем в конец результирующей строки знак //конца строки
len ++; //проходим всю строку по символам
for (;*tmp1 != '\0';tmp1 ++)
{
if(*tmp1 == ' ') // если текущий символ равен пробелу
{
while (*tmp1 == ' ') //пропускаем все пробелы
tmp1++;
if (*tmp1 == '\0') //если дошли до конца строки, выходим из
{ //условия
break;
} else
{ //если не конец строки
if (not_f)
{
tmp2 = realloc(tmp2, len); //динамически выделяем память
//под результирующую строку
tmp2[index ++] = ' '; //и записываем в нее один пробел
len ++;
}
tmp2 = realloc(tmp2, len); //выделяем память под следующий
//символ
tmp2[index ++] = *tmp1; //записываем текущий символ из
//исходной строчки в результирующую
len ++;
}
}
else{ // текущий символ не пробел
tmp2[index++] = *tmp1; //записываем текущий символ из
//исходной строчки в результирующую
tmp2 = realloc(tmp2, len); //выделяем память
len ++;
/*проверяем, если результирующая строка нулевая, значит произошла ошибка, выдаем сообщение и выходим из программы*/
if (tmp2 == NULL) {printf("ERROR->2\n");abort();}
}
not_f = 1; //приравниваем флаг 1
}
tmp2[len-2] = '\0'; //после того как прочитали всю строку записываем
//в результирующую строку символ конца строки
return 0;
}
3.1.2. Написать функцию, раскладывающую число на простые множители (например, 36=3*3*2*2). Результат – последовательность множителей в массиве, ограниченная 0.
Постановка задачи : Дано число, разложить его на простые множества.
нет да
Описание алгоритма: В функцию передается заданное число. Организуется цикл от двух, до заданного числа. Если заданное число делится на текущее нацело, то значит, текущее число является простым множителем. Записываем множитель в массив и уменьшаем заданное число путем деления на множитель. Таким образом пробегая все числа мы получаем массив простых множителей.
программа:
/* в функцию передаются, само число и указатель на начало массива выходной строки (*а), в нем будут содержаться простые множители */
int func(int par, int *a)
{
int i, index = 0; //i- счетчик для перебора всевозможных множителей,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.