Advertisement
Val_Kir

2lab1

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