Advertisement
Val_Kir

lab 1

Jun 20th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4.  
  5. typedef unsigned int word;
  6.  
  7. void outbool(word v, int n) //функция вывода
  8. {
  9.     word mask=1;
  10.     for(int i=0; i<n;++i,mask<<=1)
  11.     {
  12.         if(v&mask) printf("1");
  13.         else printf("0");
  14.     }
  15.     printf("\n");
  16. }
  17.  
  18. word inbool(int n) //функция ввода
  19. {
  20.     word res=0,mask=1;
  21.     char s[33];
  22.     gets(s);
  23.     for(int i=0;i<n;++i,mask<<=1)
  24.     {
  25.         if(s[i]=='1') res|=mask; //если символ равен 1, то дизъюнкция результата и маски
  26.     }
  27.     return res;
  28. }
  29.  
  30. int weight_s(word m[],int n,int i) //функция подсчета веса в столбце. i номер столбца
  31. {
  32.     word mask=1<<i;
  33.     int res=0;
  34.     for(int i=0;i<n;++i)
  35.     {
  36.         if(m[i]&mask)++res;
  37.     }
  38.     return res;
  39. }
  40.  
  41. void all_null(word m[],int n, int i) //функция обнуления
  42. {
  43.     int mask=~(1<<i);
  44. /*инверсия. вместо нуля маска приобретает на нужном месте нуль, а в остальных случаях 1. поэтому столбец обнуляется, не изменяя остальные столбцы */
  45.     for(int i=0;i<n;++i)
  46.         m[i]&=mask;
  47. }
  48.  
  49. void all_one(word m[], int n, int i) //функция заполнения всего единицами
  50. {
  51.     int mask=1<<i;
  52.     for(int i=0;i<n;++i)
  53.         m[i]|=mask;
  54. }
  55.  
  56. void main(void)
  57. {
  58.     const int n = 5;
  59.     word m[n];
  60.     srand(time(0));
  61.    
  62.     for(int i=0;i<n;++i)
  63.     {
  64.         m[i]=rand()%(1<<n);
  65.         outbool(m[i],n);
  66.     }
  67.    
  68.     int i=0,w=0;
  69.     while(i<n)
  70.     {
  71.         w=weight_s(m,n,i);
  72.         printf("%d ",w);
  73.         if(n-w>w) all_null(m,n,i); // если нулей(число строк минус вес) больше единиц(вес), то обнуляем
  74.         else all_one(m,n,i);
  75.         ++i;
  76.     }
  77.     putchar('\n');
  78.    
  79.     for(int i=0;i<n;++i)
  80.         outbool(m[i],n);
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement