Guest User

Untitled

a guest
Aug 21st, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. using namespace std;
  6. const int SIZE =80;
  7. void form (char*, char*); //это прототип функции form (говорит, что функция ничего не возвращает - void, но принимает 2 параметра - 2 указателя на char), его надо обязательно написать до использования самой функции
  8.  
  9. void main()
  10. {
  11. char buf[SIZE], outbuf[SIZE]={' '}; //2 массива: один входные данные, что введены с клавиатуры (у вас из файла), второй. чтобы было куда поместить найденные слова
  12. while(cout<<"Vvedite stroky: ",
  13. cin.getline(buf, SIZE))
  14. {
  15. form (buf, outbuf); //вызов функции form (передаем 2 указателя на 2 массива)
  16.  
  17. cout<<"Rez: ";
  18. cout<<outbuf; //печать результата
  19. cout<<endl<<endl;
  20. }
  21. }
  22. void form (char *a,char *out) //описание функции form (функция получает 2 параметра: два указателя на 1-е элементы переданных в нее массивов, а именно на buf и outbuf (см main) просто в самой функции они названы a и out)
  23. {
  24. char *first=a, *end=a; //обыявляем два указателя на char и присваиваем и значение а, т. е. первый элемент массива buf
  25. *out='\0'; // out - это указатель на 1-й элемент outbuf, а outbuf пустой, мы ему присваиваем 0 байт,т.е. конец строки
  26. int k=0, flag=false, flag2=false; //создается два флага
  27. char b[]={"AEIUOYaeiuoy"};
  28.  
  29. while (*first!='\0') //в конце символьной строки записывается всегда 0 байт - это признак конца строки, так вот, пока указатель *first не будет равен 0 байт, т.е пока не конец строки (это еще можно записать, как while(*first) - значит тоже самое)
  30. {
  31. flag=false; flag2=false; //флагам устанавливаем ложь (если это не сделать, то как только программа найдет первое подходящее слово, запишет его и задаст флагам истину, если их не обнулить, все остальные слова будет подходить по заданным ниже критериям) обнуляем для каждого слова
  32.  
  33. while (*first==' '&&*first!='\0') //цикл, пока ук-ль *first равен пробелу и не равен концу строки (если равен концу строки,и считать нечего))
  34. first++; //сдвигаем адрес указателя на 1позицию, на 1 символ
  35. //теперь *first у нас стоит на следующем сомволе после пробелов - первая буква слова
  36. end=first; //адресу end присваиваем адрес first, ставим end на ту же букву
  37.  
  38. while (*end!=' '&&*end) //пока *end не равен пробелу и концу файла
  39. end++; //двигаем указатель end
  40. //теперь end стоит на первом пробеле! после пройденного слова
  41. for (int i=0; i<12; i++) //проверяем равна ли первая буква элементу массива
  42. if (*first==b[i])
  43. {
  44. flag=true; //если да, флаг - истина
  45. break; //заканчиваем цикл - зачем нам сравнивать дальше
  46. }
  47. for (int i=0; i<12; i++) //проверяем равна ли пследняя буква элементу массива *(end-1) - эти последняя буква (указатель на (end-1 позиция), т.к end - указатель на первый пробел после слова
  48. if (*(end-1)==b[i])
  49. {
  50. flag2=true; //все как в предидущем цикле
  51. break;
  52. }
  53. if (flag==true&&flag2==true) //если оба флага истинны ( и 1-я и последняя буквы есть в массиве)
  54. {
  55. while (first!=end) //пока адрес первой буквы не равен первого пробела после слова
  56. *out++=*first++; //в массив out записывается содержимое массива buf, на который указывает *first (++ сдвигаем оба указателя на 1 позицию)
  57. *out++=' '; //как только скопировали слово, ставим после него пробел
  58. *out='\0'; //присваиваем конец файла
  59. //во время этих манипуляций указатель на первую букву пройдет до первого после слова пробела
  60. }
  61. else first=end; //если слово не подходит, просто присваиваем указателю на первую букву адрес первого после слова пробела и цикл продолэается...
  62. }
Add Comment
Please, Sign In to add comment