Advertisement
semenrbt

4.3 dinamic

Feb 18th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. char *CreateStr(int N){
  6.     char *mas = NULL;                      
  7.     mas = (char*) malloc(sizeof(char)*N);
  8.     if(mas == NULL) return NULL; // ну выделяем память понятно надеюсь уже
  9.     int space = N-3; // переменная space(от англ. - место), переменная которая отвечает за то, сколько свободно места в строке (N-3) - чтоб не выйти за границы
  10.     int Lword = 0; // Lword - длина слова (LengthWord)
  11.     int pos = 0; // pos - на какой мы щас позиции в строке
  12.  
  13.     while(space > 0) // Пока есть свободное место, выполняем цикл
  14.     {
  15.       Lword = space%6+2; // находим длину каждого слова в диапазоне от 2 до 7
  16.       for(int k = 0; k < Lword; k++) // Заполняем слово в строку
  17.       {
  18.         mas[pos] = rand()%26+97; // diapason ot 97 do 122(a-z)
  19.         pos++; // Меняем позицию и уменьшем место, т.к мы его заняли
  20.         space--;
  21.       }
  22.       if(rand()%2 == 0) mas[pos] = ','; // Тут типо рандомный выбор что
  23.       else mas[pos] = ' '; // ставить запятую или пробел
  24.       pos++; // Меняем позицию и уменьшем место, т.к мы его заняли разделителем
  25.       space--;
  26.     }
  27.     mas[N-1] = '.'; // Ставим точку в конец строки
  28.     return mas;
  29. }
  30. // Каждый цикл фор записывает в строку одно слово
  31. // Слова записываются пока есть место
  32.  
  33. int SearchSubStr(char *str, char *substr){ // Функция поиска подстроки в строке. На вход передается указатель на элемент строки и подстрока
  34.     int SizeSubStr = 0;      
  35.     int SizeStr = 0;
  36.     int pos = 0, m = 0;
  37.     while(str[SizeStr] > 13) SizeStr++; // Определяется размер строки
  38.     while(substr[SizeSubStr] > 13) SizeSubStr++; // Размер подстроки
  39.     while(pos <= (SizeStr - SizeSubStr)){ // Ищем подстроку в строке
  40.         for(m = 0; m < SizeSubStr && str[pos + m] == substr[m]; m++);
  41.         if(m == SizeSubStr) return pos;        
  42.         pos++;
  43.     }
  44.     return -1;  // Когда не будет вхождения подстроки в строке, функция отдаст значение -1
  45. }
  46.  
  47.  
  48. int main(void) {  
  49.   srand(time(NULL));
  50.   const int N = rand()%50 + 20;
  51.   char * Str = CreateStr(N);
  52.   for(int k = 0; k < N; k++)
  53.   {
  54.     printf("%c", Str[k]);
  55.   }
  56.   printf("\n");
  57.   char dot[] = ".";
  58.   char delimiter1[] = ",";
  59.   char delimiter2[] = " ";
  60.   int L = SearchSubStr(Str, dot); // Находим расстояние до точки(длинну строки)
  61.   int length = 0;
  62.   if(L < 0 || Str[L+1] > 17){ // Если не нашлась точка, или после точки еще что то есть
  63.     printf("Error. Net konca stroki.\n"); // Выдаем ошибку
  64.     return 0;
  65.   }
  66.   int a = SearchSubStr(Str, delimiter1); // Расстояние до запятой
  67.   int b = SearchSubStr(Str, delimiter2); // Расстояние до пробела
  68.   int counter = 0;
  69.   while(length < L) // Пока не пройдем всю строку
  70.   {
  71.     if(a == 0 || b == 0) // На тот случай если будет комбинация двух пробелов, двух запятых
  72.     { // Или запятой пробела. По условию все слова непустые
  73.       printf("Pustoe slovo. Error.\n");
  74.       return 0;
  75.     }
  76.     if((a < b && a > 0) || (a > 0 && b < 0)) // Когда запятая ближе чем пробел
  77.     {
  78.       if(Str[length] == Str[length + a-1]) counter++; // Проверка, подходит ли слово по условию
  79.       length = length + a;
  80.     }
  81.     if((b < a && b > 0) || (b > 0 && a < 0)) // Когда пробел ближе чем запятая
  82.     {
  83.       if(Str[length] == Str[length + b -1]) counter++;
  84.       length = length + b;
  85.     }
  86.     length++;
  87.     a = SearchSubStr(&Str[length], delimiter1);
  88.     b = SearchSubStr(&Str[length], delimiter2);
  89.     if(a < 0 && b < 0){ // Когда не осталось ни запятой, ни пробела, проверяем удовлетворяет ли условию последнее слово и выходим из цикла
  90.       if(Str[length] == Str[L-1]){
  91.         counter++;
  92.       }
  93.       length = L + 1;
  94.     }
  95.   }
  96.   printf("slov: %d\n", counter);
  97.  
  98.  
  99.   free(Str);
  100.   return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement