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

//счисления в десятеричную

str2[i2 ++] = d;

str2[i2 ++] = str1[i1];

} else {str2[i2 ++] = str1[i1 - 1];str2[i2 ++] = str1[i1];}   //если после «\» идет не цифра, а любой другой

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

// строку и «\» и идущий за ним символ

} else str2[i2 ++] = str1[i1];     // если встретили любые символы кроме «\», записываем их в

//результирующую строку без изменения

}

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

return 0;

}

/*функция преобразующая число из восьмеричной системы счисления в десятеричную*/

int make_int(int d){  //в функцию передается число в восьмеричной системе счисления                      

int tmp = 0;

int c, w = 1;

while(d != 0){   // делаем преобразования пока число не станет равным нулю

c = d % 10;  //выделяем цифру и умножаем на w, а w – это степень восьмерки

tmp += c * w;

w *= 8;

d /= 10;

}

return tmp;    //возвращаем преобразованное число

}


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

Постановка задачи : Дана строка, состоящая из набора слов, слова разделены пробелами, слова составлены из любых символов. Наша задача, найти слово начинающиеся с самой младшей латинской буквы (a – является самой младшей, z – самой старшей) и вернуть указатель на начало этого слова. Если таких слов несколько, то возвращаем указатель на последнее в строке.

 


да

 


Блок-схема: решение: *str1 != '\0'                                                                                                                                 да

 


да

                               

 


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

программа:

#define CHECK(c) (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))

#define MAL(c) ((c >='a') && (c<='z'))

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

char* func(char *str1){

int i, len;

char min, tmp;

char *str2;

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

while((!CHECK(*str1)) && (*str1 != '\0')) // пропускаем  все символы не являющиеся буквами латинского

str1 ++;                                        // алфавита

min = (MAL(*str1)) ? (*str1 - 32) : *str1; //встретили первую латинскую букву, запоминаем код прописной

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

// прописные буквы, для удобства сравнения пользуемся кодами

// прописных букв

str2 = str1;

for (;*str1 != '\0';str1 ++){          //цикл, до конца строчке

if (*str1 == ' '){                  //если встретили пробел

while((!CHECK(*str1)) && (*str1 != '\0')) //а за пробелам следует символ, не являющийся буквой

str1 ++;                                       // латинского алфавита, пропускаем его

if (*str1 != '\0'){                           //если не дошли до конца строки

tmp = (MAL(*str1)) ? (*str1 - 32) : *str1; //сравниваем текущую букву с ранее записанной

if (min >= tmp) {                                             //если она младшей или равна, то запоминаем ее