Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- char *CreateStr(int N){
- char *mas = NULL;
- mas = (char*) malloc(sizeof(char)*N);
- if(mas == NULL) return NULL; // ну выделяем память понятно надеюсь уже
- int space = N-3; // переменная space(от англ. - место), переменная которая отвечает за то, сколько свободно места в строке (N-3) - чтоб не выйти за границы
- int Lword = 0; // Lword - длина слова (LengthWord)
- int pos = 0; // pos - на какой мы щас позиции в строке
- while(space > 0) // Пока есть свободное место, выполняем цикл
- {
- Lword = space%6+2; // находим длину каждого слова в диапазоне от 2 до 7
- for(int k = 0; k < Lword; k++) // Заполняем слово в строку
- {
- mas[pos] = rand()%26+97; // diapason ot 97 do 122(a-z)
- pos++; // Меняем позицию и уменьшем место, т.к мы его заняли
- space--;
- }
- if(rand()%2 == 0) mas[pos] = ','; // Тут типо рандомный выбор что
- else mas[pos] = ' '; // ставить запятую или пробел
- pos++; // Меняем позицию и уменьшем место, т.к мы его заняли разделителем
- space--;
- }
- mas[N-1] = '.'; // Ставим точку в конец строки
- return mas;
- }
- // Каждый цикл фор записывает в строку одно слово
- // Слова записываются пока есть место
- int SearchSubStr(char *str, char *substr){ // Функция поиска подстроки в строке. На вход передается указатель на элемент строки и подстрока
- int SizeSubStr = 0;
- int SizeStr = 0;
- int pos = 0, m = 0;
- while(str[SizeStr] > 13) SizeStr++; // Определяется размер строки
- while(substr[SizeSubStr] > 13) SizeSubStr++; // Размер подстроки
- while(pos <= (SizeStr - SizeSubStr)){ // Ищем подстроку в строке
- for(m = 0; m < SizeSubStr && str[pos + m] == substr[m]; m++);
- if(m == SizeSubStr) return pos;
- pos++;
- }
- return -1; // Когда не будет вхождения подстроки в строке, функция отдаст значение -1
- }
- int main(void) {
- srand(time(NULL));
- const int N = rand()%50 + 20;
- char * Str = CreateStr(N);
- for(int k = 0; k < N; k++)
- {
- printf("%c", Str[k]);
- }
- printf("\n");
- char dot[] = ".";
- char delimiter1[] = ",";
- char delimiter2[] = " ";
- int L = SearchSubStr(Str, dot); // Находим расстояние до точки(длинну строки)
- int length = 0;
- if(L < 0 || Str[L+1] > 17){ // Если не нашлась точка, или после точки еще что то есть
- printf("Error. Net konca stroki.\n"); // Выдаем ошибку
- return 0;
- }
- int a = SearchSubStr(Str, delimiter1); // Расстояние до запятой
- int b = SearchSubStr(Str, delimiter2); // Расстояние до пробела
- int counter = 0;
- while(length < L) // Пока не пройдем всю строку
- {
- if(a == 0 || b == 0) // На тот случай если будет комбинация двух пробелов, двух запятых
- { // Или запятой пробела. По условию все слова непустые
- printf("Pustoe slovo. Error.\n");
- return 0;
- }
- if((a < b && a > 0) || (a > 0 && b < 0)) // Когда запятая ближе чем пробел
- {
- if(Str[length] == Str[length + a-1]) counter++; // Проверка, подходит ли слово по условию
- length = length + a;
- }
- if((b < a && b > 0) || (b > 0 && a < 0)) // Когда пробел ближе чем запятая
- {
- if(Str[length] == Str[length + b -1]) counter++;
- length = length + b;
- }
- length++;
- a = SearchSubStr(&Str[length], delimiter1);
- b = SearchSubStr(&Str[length], delimiter2);
- if(a < 0 && b < 0){ // Когда не осталось ни запятой, ни пробела, проверяем удовлетворяет ли условию последнее слово и выходим из цикла
- if(Str[length] == Str[L-1]){
- counter++;
- }
- length = L + 1;
- }
- }
- printf("slov: %d\n", counter);
- free(Str);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement