Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.80 KB | None | 0 0
  1. /*Задан текстовый файл Input.txt , в котором записана последовательность некоторых
  2. слов, разделенных  одним или несколькими разделителями из заданного множества  
  3. разделителей [пробел,  точка, запятая, точка с запятой, двоеточие, плюс].
  4. 1.  Найти все слова-числа, т.е. такие, которые состоят только из цифр. Известно,
  5. что количество цифр в каждом числе не более 9 (девяти).
  6. a.   Для проверки, является ли слово числом использовать функцию (С++)
  7. 2.  Найденные слова-числа записать  в динамический массив DArray.  
  8. 3.  Получить новый массив NewArray, преобразовав каждое число динамического
  9. массива в  наименьшее число, составленное из его цифр.
  10. a.  Для преобразования числа в наименьшее использовать функцию (С++Рекурсию***)
  11. 4.  Найти наименьшее Min и наибольшее Max  числа  у полученного массива NewAarray.
  12. a.  Для нахождения  наименьшего и наибольшего в массиве использовать функции С++,
  13. алгоритм поиска должен быть реализован  на Ассемблере.
  14. 5.  Получить динамическую матрицу Matr, количество строк которой будет равно
  15. количеству чисел массива Darray,    меньших Max и больших  Min.
  16. a.  В первый столбец  записать сами числа, во второй их номера в массиве Darray и
  17. в третий - сумму их цифр.  
  18. 6.  Найти сумму строки матрицы, номер которой вводит пользователь.
  19. a.  Для нахождения суммы строки использовать подпрограмму (Assemble)
  20. 7.  Все промежуточные результаты в процессе решения задачи записать в текстовый
  21. файл.*/
  22.  
  23.  
  24.  
  25.  
  26. #include <stdio.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <math.h>
  30.  
  31. void breakup(char str[], int* a, int *x)   // для разбиения и засылки чисел
  32. {
  33.     char sep[]=" .,:;+";
  34.     char letter[]="АБВГДЕЖЗИКЛМНОПРСТУФХЧШЩЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяQWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
  35.     char *p;
  36.     int n;
  37.     p=strtok(str,sep);
  38.     if (!p)
  39.         return;
  40.     n=atoi(p);
  41.     if(n && (!strpbrk(p,letter)))
  42.     {
  43.         (*x)++;
  44.         a[*x-1]=n;
  45.     }
  46.    
  47.     while (p)
  48.     {
  49.         p=strtok(NULL, sep);
  50.         if (!p)
  51.             break;
  52.         n=atoi(p);
  53.         if (n && (!strpbrk(p,letter)))
  54.         {
  55.             (*x)++;
  56.             a[*x-1]=n;
  57.            
  58.         }
  59.        
  60.     }
  61.    
  62. }
  63. void sortinsert(int* array_, int dimension)
  64. {
  65.     _asm
  66.     {
  67.         mov ecx, dimension
  68.         dec ecx
  69.         mov eax, array_
  70.         mov esi,1
  71. fr_out: push ecx
  72.         mov edx,[eax][esi*4]
  73.         mov ecx,esi
  74.         mov edi,esi
  75.         dec edi
  76. for_in: cmp edx,[eax][edi*4]
  77.         jnl end_in
  78.         mov ebx,[eax][edi*4]
  79.         mov [eax][edi*4+4],ebx
  80.         dec edi
  81.         loop for_in
  82. end_in: mov [eax][edi*4+4],edx
  83.         inc esi
  84.         pop ecx
  85.         loop fr_out
  86.     }
  87. }
  88. int binsearch(int a[], int dim, int key)
  89. {
  90.     int index;
  91.     _asm
  92.     {
  93.         mov eax,key
  94.         mov ebx, a
  95.         mov esi,dim
  96.         xor edi,edi
  97.        
  98. beg_c:  cmp edi,esi
  99.         jg end_f
  100.         mov edx,esi
  101.         add edx,edi
  102.         shr edx,1
  103.         cmp eax,[ebx][edx*4]
  104.         je end_tr
  105.         jl less
  106.         mov edi,edx
  107.         inc edi
  108.         jmp beg_c
  109. less:   mov esi,edx
  110.         dec esi
  111.         jmp beg_c
  112. end_f:  mov index,-1
  113.         jmp end
  114. end_tr: mov index,eax
  115. end:    nop
  116.     }
  117.     return index;
  118. }
  119.  
  120.  
  121. void makearr(int el, int b[], int *n)  // число засылаем по цифрам в массив запоминаем количество цифер
  122. {                                    //для выебона на ассемблере
  123.     _asm
  124.     {
  125.         xor esi,esi
  126.         mov eax,el
  127.         cdq
  128.         mov edi,b
  129. l_beg: 
  130.         mov ebx,10
  131.         div ebx
  132.         mov [edi][esi*4],edx
  133.         test eax,eax
  134.         je end_l
  135.         inc esi
  136.         cdq
  137.         jmp l_beg
  138. end_l:  inc esi
  139.         mov edi,n
  140.         mov [edi],esi
  141.         mov ecx,esi
  142.         dec ecx
  143. loop1:  push ecx
  144.         mov esi,b
  145. loop2:  mov eax,[esi]
  146.         cmp eax,[esi+4]
  147.         jge then
  148.         xchg eax,[esi+4]
  149.         mov [esi],eax
  150. then:   add esi,4
  151.         loop  loop2
  152.         pop  ecx
  153.         loop loop1    
  154.     }
  155.  
  156. }
  157. void movmin(int *el, int b[], int n)   //делаем из числа минимум, засылаем в нужный новый массив
  158. {
  159.     int a;
  160.     a=b[n-1]*(int)pow(10.0,n-1);
  161.     (*el)+=a;
  162.     if(n==1)
  163.         return;
  164.     movmin(el,b,n-1);
  165. }
  166. void makemin(int *src, int *dest, int n)    //две пред. функции в одну, для экономии места
  167. {
  168.     int b[9],m;
  169.     for (int i=0; i<n; i++)
  170.     {
  171.         makearr(src[i],b, &m);
  172.         dest[i]=0;
  173.         movmin(&dest[i],b,m);
  174.     }
  175. }
  176.  
  177. void minmax(int *a, int n, int *min, int *max)
  178. {
  179.     _asm
  180.     {
  181.         mov eax,a
  182.         mov ebx,[eax] //min
  183.         mov edx,[eax] //max
  184.         mov esi,1
  185.         mov ecx,n
  186.         dec ecx
  187. for_1:  jcxz e
  188.         cmp edx,[eax][esi*4]
  189.         jge for_in
  190.         mov edx,[eax][esi*4]
  191. for_in: cmp ebx,[eax][esi*4]
  192.         jle end_1
  193.         mov ebx,[eax][esi*4]
  194. end_1:  inc esi
  195.         loop for_1
  196. e:      mov eax,min
  197.         mov [eax],ebx
  198.         mov eax,max
  199.         mov [eax],edx
  200.     }
  201. }
  202. int sum(int a)
  203. {
  204.     int sum;
  205.     _asm
  206.     {
  207.         xor esi,esi
  208.         mov eax,a
  209.         cdq
  210. l_beg: 
  211.         mov ebx,10
  212.         div ebx
  213.         add esi,edx
  214.         test eax,eax
  215.         je end_1
  216.         cdq
  217.         jmp l_beg
  218. end_1:  mov sum,esi
  219.     }
  220.     return sum;
  221. }
  222. int sumstr(int **a, int i, int n)
  223. {
  224.     int sum;
  225.     _asm
  226.     {
  227.         mov eax,a
  228.         mov esi,i
  229.         shl esi,2
  230.         add eax,esi
  231.         mov ebx,[eax]
  232.         mov ecx,n
  233.         xor esi,esi
  234.         xor edi,edi
  235. for_1: 
  236.         mov eax,[ebx][edi*4]
  237.         cdq
  238.         push ecx
  239. l_beg: 
  240.         mov ecx,10
  241.         div ecx
  242.         add esi,edx
  243.         test eax,eax
  244.         je end_1
  245.         cdq
  246.         jmp l_beg
  247. end_1:  pop ecx
  248.        
  249.         inc edi
  250.         loop for_1
  251.         mov sum,esi
  252.     }
  253.     return sum;
  254. }
  255.        
  256.  
  257. void main()
  258. {
  259.     const int m=3;
  260.     FILE *in, *out;
  261.     int a[400];
  262.     int *d, *c, **mat;
  263.     char str[1000];
  264.     int n=0,i,j, min, max,i_min, i_max;
  265.     gets(str);
  266.     breakup(str,a,&n);
  267.     for (i=0; i<n; i++)
  268.         printf("%d ", a[i]);
  269.     d=(int*)malloc(n*sizeof(int));
  270.     c=(int*)malloc(n*sizeof(int));
  271.     for (i=0; i<n; i++)
  272.         d[i]=a[i];
  273.     makemin(d,c,n);
  274.     printf("\n");
  275.     for (i=0; i<n; i++)
  276.         printf("%d ", c[i]);
  277.     minmax(c,n,&min, &max);
  278.     j=0;
  279.     printf("\n\n");
  280.     for (i=0; i<n; i++)
  281.     {
  282.         if (a[i]>min && a[i]<max)
  283.             j++;
  284.     }
  285.     mat=(int**)malloc(j*sizeof(int*));
  286.     for (i=0; i<j; i++)
  287.         *(mat+i)=(int*)malloc(m*sizeof(int));
  288.     int t=0;
  289.     for (i=0; i<j; i++)
  290.     {
  291.  
  292.         for (int k=t; k<n; k++)
  293.         {
  294.             if (a[k]>min && a[k]<max)
  295.             {
  296.                 mat[i][0]=a[k];
  297.                 mat[i][1]=k+1;
  298.                 mat[i][2]=sum(a[k]);
  299.                 t=k+1;
  300.                 break;
  301.             }
  302.             //t++;
  303.  
  304.         }
  305.     }
  306.     for (i=0; i<j; i++)
  307.     {
  308.         for (int k=0; k<m; k++)
  309.             printf("%d ", mat[i][k]);
  310.         printf("\n");
  311.     }
  312.  
  313.     int stroka;
  314.     scanf("%d", &stroka);
  315.     int z;
  316.     --stroka;
  317.     z=sumstr(mat,stroka,m);
  318.     printf("%d\n", z);
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement