Разработка программного обеспечения. Функция, оставляющую в строке по одному пробелу между словами, страница 2

                       //index – счётчик выходного массива, он увеличивается,
                       // если будет найден новый множитель. 
    int len = 2;       // счетчик кол-ва элементов в выходном массиве
    for(i=2;i<=par;)   // цикл для перебора всевозможных множителей
        if((par%i)==0){        //если число делится без остатка значит, 
                // i является простым множителем 
            a[index ++] = i;   // заносим текущий множитель в выходной массив, 
                               //и увеличиваем index на 1
            a = realloc(a, (index+2) * sizeof(int));  //выделяем память для
                                                     // следующего элемента
            par/=i;    //делим число на текущий множитель ,
                       // чтоб получит число для 
                       //определения следующего множителя
        } else i++;    //если число не делится нацело, берём следующий множитель
   
        a[index] = 0;  //заполняем последний или единственный 
                       //(если вдруг множители были не обнаружены) элемент нулём
return 0;
}

 

3.1.3. Написать функцию, "переворачивающую" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илыб дед и абаб").

Постановка задачи : Задана строка, состоящая из слов, слова могут содержать любые символы. Слова разделены пробелами.

 


                                                да

 


pos2=i-1

 
                                        да  

 


 

да

 


Описание алгоритма: на вход функции поступает указатель на начало заданной строки и указатель на результирующую строку. Программа  определяет какова длина заданной строки, т.е. сколько символов в ней находится. Задается цикл по всей длине заданной строки. Если в самом начале строки встречаются пробелы, записываем их в результирующую строчку.  И запоминаем позицию последнего пробела, если встретили символ, идем до следующего пробела и запоминаем позицию. Организуем цикл по позициям, в котором записываем в результирующую слова наоборот. таким образом дойдя до конца заданной строчки мы в результирующей строке получим все слова наоборот. в конце результирующей строки ставим символ конца строки («\0») .

программа:

/* в функцию передаются указатели на начало исходной строки (*str1) и на начало результирующей (*str2)*/

int func(char *str1, char *str2){  

int i, j, len, pos1 = 0, pos2 = 0;

int index = 0;

char *tmp;

len = strlen(str1); // определяем длину исходной строки, кол-во символов

for(i = 0; i <= len; i++){     // цикл, по всем символам исходной строки

if ((str1[i] == ' ') && (i == 0)){ //если встретили пробел, в начале

while(str1[i] == ' '){         //пробегаем все пробелы

str2[index ++] = str1[i ++]; //и записываем их в результирующую

//строчку, так же как они были

//в исходной строчки

}

pos1 = i;                       //запоминаем позицию                    

}

if (((str1[i] == ' ') && (i != 0)) || (i == len)){ //если встретили пробел

//не вначале строчке

//или в конце строчке

//запоминаем вторую позицию

pos2 = i - 1;

for(j = pos2;j >= pos1;j --){        //цикл, со второй до первой

//позиции (т.е. с конца до начала

// слова)

str2[index ++] = str1[j];          //записываем в результирующую

//строку слово наоборот

}

if (str1[i] == ' ') str2[index ++] = ' ';// если встретили пробел

//записываем его в результирующую

//строку на ту же позицию как и в

//исходной строке

pos1 = i + 1;       //запоминаем позицию

}

}

str2[len] = '\0';         //записываем в конец результирующей строки, символ

// конца строки

return 0;

}


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

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