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

//как минимум

min = tmp;

str2 =  str1;

}

}

}

}

return str2; //возвращаем указатель на начало слова, начинающегося с самой младшей латинской буквы

}


3.1.8. Написать функцию, удаляющую из строки комментарии вида "/* ... */". Игнорировать вложенные комментарии.

Постановка задачи: В фал записывается строка. В этой строке есть комментарии. Исходя из условия задачи, делаем вывод, что вложенные комментарии удаляются. Если в строке есть открытие комментарий, но нет их закрытия, то все что идет после начала комментарий удаляется до конца строки.

Описание алгоритма: Передаём в функцию имя файла. Считываем из него по одному символу из файла если видим открывающийся комментарий  поднимаем флаг, если закрывающийся то опускаем и в зависимости от флага печатаем символ или нет.

текст

#include <stdio.h>

#include <stdlib.h>

char* comment (char * fname){

FILE *in;

char input;

int stat;

char *text;

int kol=0;

in=fopen(fname,"ro"); //открываем файл

stat=0;

text=calloc(1,sizeof(char));               //выделение памяти для выходной строки

while(fscanf(in,"%c",&input)!=EOF){

if(input=='/'){                          // если встретили «/»

fscanf(in,"%c",&input);              // считываем из файла один символ

if(input=='*') stat++;               //и встретили «*» после «/», поднимаем флаг

}

if((input=='*')&&(stat>0))

{

fscanf(in,"%c",&input);        // считываем из файла один символ

if(input=='/') {stat--;        //если встретили “*/” опускаем флаг

fscanf(in,"%c",&input);}       // считываем из файла один символ

}    

        if(stat==0){   
               text = realloc(text, (kol+2) * sizeof(char));        //выделяем память для
                                                     // следующего элемента

text[kol]=input;          //заносим текущий символ в выходную строку

kol++;

}    }

fclose(in);              

return text;            //возвращаем указатель на начало результирующей строки

}

 

 

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

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

 


да

 


да

 


Блок-схема: решение: max < tmp_max                                                                                                                      да

 


Блок-схема: решение: str1[i] == c                                                                                                                                    

                                                                   нет                                                            да

 


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

текст программы:

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

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

int i, j, len;

int max = 0, tmp_max = 0;

char c;

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

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