Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include<strings.h>
  5.  
  6. char** input_text(int* quantity_line){
  7. char c;
  8. int i = 0;
  9. int j = 0;
  10. char**line;
  11. line = (char**)calloc(1,sizeof(char*));
  12. if (line == NULL){
  13. printf("\nОшибка выделения памяти.\n");
  14. exit(1);
  15. }
  16. line[i] = (char*)calloc(1,sizeof(char));
  17. if (line[i] == NULL){
  18. printf("\nОшибка выделения памяти.\n");
  19. exit(1);
  20. }
  21. while ('\n' != (c = getchar())){
  22. if (c!='.'){
  23. line[i]=(char*)realloc(line[i],(j+2)*sizeof(char));
  24. if (line[i] == NULL){
  25. printf("\nОшибка выделения памяти.\n");
  26. exit(1);
  27. }
  28. line[i][j] = c;
  29. j++;
  30. }
  31. else{
  32. line[i]=(char*)realloc(line[i],(j+3)*sizeof(char));
  33. if (line[i] == NULL){
  34. printf("\nОшибка выделения памяти.\n");
  35. exit(1);
  36. }
  37. line[i][j] = c;
  38. j++;
  39. line[i][j] = '\0';
  40. j=0;
  41. i++;
  42. line = (char**)realloc(line,(i+1)*sizeof(char*));
  43. if (line == NULL){
  44. printf("\nОшибка выделения памяти.\n");
  45. exit(1);
  46. }
  47. line[i] = (char*)calloc(3,sizeof(char));
  48. if (line[i] == NULL){
  49. printf("\nОшибка выделения памяти.\n");
  50. exit(1);
  51. }
  52. (*quantity_line)++;
  53. }
  54. }
  55. free(line[i]);
  56. return line;
  57. }
  58.  
  59.  
  60. void delete_identical_sentences(char** line,int* quantity_line){
  61. for(int i=0;i<*quantity_line;i++){
  62. int j=i+1;
  63. while(j<*quantity_line){
  64. if (strcasecmp(line[i],line[j])==0){
  65. free(line[j]);
  66. for (int e = j;e<=*quantity_line-1;e++)
  67. line[e]=line[e+1];
  68. (*quantity_line)--;
  69. }
  70. else{
  71. j++;
  72. }
  73. }
  74. }
  75.  
  76. }
  77.  
  78. void memory_clearing(char** line,const int* quantity_line){
  79. int i;
  80. for (i=0; i<*quantity_line; i++){
  81. free(line[i]);
  82. }
  83. free(line);
  84.  
  85. }
  86.  
  87.  
  88. void deleting_an_offer(char**line,int* quantity_line){
  89. int i = 0;
  90. int j;
  91. int e;
  92. int flag = 0;
  93. while (i < *quantity_line){
  94. for (j = 0;j < strlen(line[i]);j++){
  95. if (line[i][j] == ','){
  96. flag = 1;
  97. }
  98. }
  99. if (flag == 1){
  100. free(line[i]);
  101. for (e = i;e<*quantity_line;e++){
  102. line[e]=line[e+1];
  103. }
  104. (*quantity_line)--;
  105. flag = 0;
  106. }
  107. else {
  108. i++;
  109. }
  110. }
  111. }
  112.  
  113.  
  114. void display_the_text(char**line,const int*quantity_line){
  115. for(int i=0;i<*quantity_line;i++){
  116. printf("%s", line[i]);
  117. }
  118. printf("\n");
  119. }
  120.  
  121.  
  122. void amount_of_words(char**line, const int*quantity_line){
  123. int lenth = 0;
  124. int sum = 0;
  125. int index = 0;
  126. char ** arrWords =(char **)calloc(sum, sizeof(char *));
  127. char * word;
  128. word = (char *)calloc(1000, sizeof(char));
  129. for(int i = 0; i<*quantity_line; i++){
  130.  
  131. for (int j = 0; j < strlen(line[i]) ; j++) {
  132. if((line[i][j]==' ')||(line[i][j]==',')||(line[i][j]=='.')){
  133. sum++;
  134. arrWords = realloc(arrWords, sum* sizeof(char *));
  135. word[lenth] = '\0';
  136. arrWords[sum-1] = (char *)calloc(lenth, sizeof(char));
  137. strncpy(arrWords[sum-1], word, strlen(word));
  138. free(word);
  139. word = (char *)calloc(1000, sizeof(char));
  140. lenth = 0;
  141. } else{
  142. word[lenth] = line[i][j];
  143. lenth++;
  144. }
  145. }
  146. }
  147. sum--;
  148. char ** neWords =(char **)calloc(sum, sizeof(char *));
  149. int arrSum[10000];
  150. neWords[index] = (char *)calloc(strlen(arrWords[0]), sizeof(char ));
  151. strcpy(neWords[index], arrWords[index]);
  152. index++;
  153. for (int k = 0; k < sum ; ++k) {
  154. for (int i = 0; i < index ; ++i) {
  155. if(strcmp(arrWords[k], neWords[i])==0){
  156. arrSum[i]++;
  157. break;
  158. }
  159. if (i== index-1){
  160. arrSum[index] = 1;
  161. neWords[index] = arrWords[k];
  162. index++;
  163. }
  164. }
  165. }
  166. for (int d=0;d<index;d++)
  167. printf("Слово: %s встречается в тексте %d раз(а)\n",neWords[d], arrSum[d]);
  168.  
  169. }
  170.  
  171.  
  172. void words_shifters(char**line,const int*quantity_line){
  173. char* beginning_word;
  174. char* end_word;
  175. char symbol;
  176. int index;
  177. for(int i=0;i<*quantity_line;i++){
  178. int beginning_index=0;
  179. beginning_word=&line[i][0];
  180. for (int j=0;j<strlen(line[i]);j++){
  181. if ((line[i][j]==' ')||(line[i][j]==',')||(line[i][j]=='.')){
  182. end_word=&line[i][j-1];
  183. index = 0;
  184. while (index!=((j-beginning_index)/2)){
  185. symbol=*(beginning_word+index);
  186. *(beginning_word+index)=*(end_word-index);
  187. *(end_word-index)=symbol;
  188. index++;
  189. }
  190. if (line[i][j]=='.')
  191. break;
  192. beginning_word=&line[i][j+1];
  193. beginning_index=j+1;
  194. }
  195. }
  196. }
  197. }
  198.  
  199.  
  200. int sorting_offers_on_the_fifth_character(const void* x1, const void * x2)
  201. {
  202. int value_str1;
  203. int value_str2;
  204. char* str1=*(char**)x1;
  205. char* str2=*(char**)x2;
  206. int i = 4;
  207. if (strlen(str1)<5)
  208. {
  209. value_str1=-1;
  210. }
  211. else
  212. {
  213. if(str1[i]==' '||str1[i]==',')
  214. {
  215. value_str1=(int)str1[i+1];
  216. }
  217. else
  218. {
  219. value_str1=(int)str1[i];
  220. }
  221. }
  222.  
  223. if (strlen(str2)<5)
  224. {
  225. value_str2=-1;
  226. }
  227. else
  228. {
  229.  
  230. if(str2[i]==' '||str2[i]==',')
  231. {
  232. value_str2=(int)str2[i+1];
  233. }
  234. else
  235. {
  236. value_str2=(int)str2[i];
  237. }
  238. }
  239. if (value_str1==value_str2)
  240. {
  241. return 0;
  242. }
  243. if (value_str1>value_str2)
  244. {
  245. return -1;
  246. }
  247. if (value_str1<value_str2)
  248. {
  249. return 1;
  250. }
  251. return 0;
  252. }
  253.  
  254. void sorting_offers(char**line,const int*quantity_line){
  255. qsort(line,*quantity_line,sizeof(char*),sorting_offers_on_the_fifth_character);
  256.  
  257. }
  258.  
  259.  
  260.  
  261. int main(){
  262. int command;
  263. int flag = 1;
  264. int quantity_line = 0;
  265. printf("Введите текст!\nПодсказка: Текст представляет собой предложения, разделенные точкой. Предложения - набор слов, разделенные пробелом или запятой, слова - набор латинских букв и цифр.\nЗамечание: Между словами может быть только один разделитель,в иных случаях программа будет работать некорректно!!!\n");
  266. char**line = input_text(&quantity_line);
  267. delete_identical_sentences(line,&quantity_line);
  268. printf("Введите номер команды для обработки текста:\n0)Вывести текст на экран\n1)Распечатать каждое слово и количество его повторений в тексте.\n2)Преобразовать каждое предложение так, что символы в каждом слове шли в обратном порядке.\n3)Удалить предложения в котором встречается запятая.\n4)Отсортировать предложения по уменьшению значения кода 5 символа предложения. Если 5 символ является разделителем между словами, то брать следующий символ. Если символов в предложении меньше 5, то для этого предложения значение равняется -1.\n5)Завершить программу.\n");
  269. do{
  270. printf("Введите номер команды: ");
  271. scanf("%d",&command);
  272. switch(command){
  273. case 0: display_the_text(line,&quantity_line);
  274. break;
  275. case 1: amount_of_words(line,&quantity_line);
  276. break;
  277. case 2: words_shifters(line,&quantity_line);
  278. break;
  279. case 3: deleting_an_offer(line,&quantity_line);
  280. break;
  281. case 4: sorting_offers(line,&quantity_line);
  282. break;
  283. case 5: memory_clearing(line,&quantity_line);
  284. flag = 0;
  285. break;
  286. default: printf("Данные некорректны!\n");
  287. break;
  288. }
  289. }while(flag==1);
  290. return 0;
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement