Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: tommy.bg в Mar 11, 2011, 21:21



Титла: C++ задача - имена и егн
Публикувано от: tommy.bg в Mar 11, 2011, 21:21
Здравейте. За домашно ни дадоха една задача. Задачата е следната: Да се въведе име и егн на n брой хора и след това да се изведът по следния начин:

1. Името | Егн-то
2. Името | Егн-то

Пробвах с двумерен масив обаче за въвеждането на егн не е удобно защото за всяко число от егн-то трябва да натискам ентер. Пробвах с цикъл (for) но така се препокриват.
Надявам се някой да ме насочи към това какво трябва да използвам.
Благодаря предварително на тези дето помогнат.


Титла: Re: C++ задача - имена и егн
Публикувано от: clovenhoof в Mar 11, 2011, 21:55
Ами използвай стринг за ЕГН-то или ако държиш да е цифра 64-битов int


Титла: Re: C++ задача - имена и егн
Публикувано от: tommy.bg в Mar 11, 2011, 22:44
А как ще стане въвеждането на повече от един човек?


Титла: Re: C++ задача - имена и егн
Публикувано от: clovenhoof в Mar 11, 2011, 22:51
const int N = 100; // 100 човека

strcut Data
{
char ime[64];
char egn[64];
};

Data data[N];


Титла: Re: C++ задача - имена и егн
Публикувано от: tommy.bg в Mar 11, 2011, 23:25
трябва да е само с материала от увод в програмирането с масиви цикли и т.н


Титла: Re: C++ задача - имена и егн
Публикувано от: clovenhoof в Mar 11, 2011, 23:29
Искаш да кажеш че този увод не включва структури или кво?

Само не ме карай да ти пиша задачата


Титла: Re: C++ задача - имена и егн
Публикувано от: tommy.bg в Mar 11, 2011, 23:42
Не включва. Не искам някой да ми пише задачата искам идея


Титла: Re: C++ задача - имена и егн
Публикувано от: clovenhoof в Mar 12, 2011, 00:07
Идея:

Код:
char ime[N][64];
char egn[N][64];

scanf("%s", ime[i]);
scanf("%s", egn[i]);

i от 0 до N-1

ПП:Абе не може да не включва структури


Титла: Re: C++ задача - имена и егн
Публикувано от: chen_dzen в Mar 12, 2011, 00:09
А как ще стане въвеждането на повече от един човек?
while(условие);
  {
     въвеждане на име;
     въвеждане на ЕГН;
     условие=имаме ли още да въвеждаме ?;
 }


Титла: Re: C++ задача - имена и егн
Публикувано от: gat3way в Mar 12, 2011, 01:31
Подзадача: в колко байта можете да натъпчете едно ЕГН. Очевидно 64 байта са разхищение.

ЕГН-то е 10 цифри, тогава uint64_t?

Според мен с малко фокуси, ЕГН-то може да се натъпче в 32-битова променлива,  unsigned int :)


Титла: Re: C++ задача - имена и егн
Публикувано от: chen_dzen в Mar 12, 2011, 01:37
Интересно, не ства ли така :

9999999999=1001010100000010111110001111111111=34bits

unsigned int EGN:34; ???


Титла: Re: C++ задача - имена и егн
Публикувано от: gat3way в Mar 12, 2011, 01:56
Код
GeSHi (C):
  1. char EGN[10];
  2. char dec[5];
  3. unsigned int FINAL_EGN;
  4.  
  5. void dec2bin(char *str, char *dec, int len)
  6. {
  7.  int cnt, cnt1;
  8.  unsigned char val=0;
  9.  unsigned char tmp1=0,tmp2=0;
  10.  char *charset="0123456789";
  11.  for (cnt=0;cnt<(len/2);cnt++)
  12.  {
  13.     val = 0;
  14.      for (cnt1=0;cnt1<10;cnt1++) if (charset[cnt1] == dec[cnt*2]) tmp1 = cnt1;
  15.      for (cnt1=0;cnt1<10;cnt1++) if (charset[cnt1] == dec[cnt*2+1]) tmp2 = cnt1;
  16.      val |= (tmp1 << 4);
  17.      val |= tmp2;
  18.      *(str+cnt) = val & 255;
  19.  }
  20. }
  21.  
  22. dec2bin(dec,EGN,10);
  23. FINAL_EGN = ((dec[0]&127)<<25)|((dec[1]&31)<<20)|((dec[2]&31)<<15))|((dec[3]&127)<<8)|((dec[4]&127)<<1))
  24.  

Нещо такова ми се върти из главата...ЕГН-то е реално 5 байта ако го превърнем в "binary вид", първият байт не може да е повече от 127 (година), следователно пестим един бит, вторият байт не може да е повече от 31 (ден), следователно пестим 3 бита, третият също не може да е по-голям от 31(месец), пестим 3 бита, четвъртият не може да е по-голям от 128, пестим един бит, последният не може да е по-голям от 128, пестим 1 бит.

9 бита могат да се спестят, така че можем да се вместим в 32-битова променлива

Всъщност 10 бита могат да се спестят, месеца е по-малък от 16.

П.П превръщането в "binary" вид е за удобство, можем и директно да подходим към проблема :)


Титла: Re: C++ задача - имена и егн
Публикувано от: VladSun в Mar 12, 2011, 02:03
Последният разряд е контролна сума - би трябвало да можем и без нея (макар че има сгрешени ЕГН-та :( )


Титла: Re: C++ задача - имена и егн
Публикувано от: gat3way в Mar 12, 2011, 02:33
Би било забавно в по-малко или 24 бита, обаче ентропията ми се вижда прекалено висока, за да можем да си позволяваме такива волности. Така като гледам максимум 11 бита могат да се спестят, трябват ни поне 16 :)

Оообаче може и да  има разни хитрости, които да го направят възможно, знам ли :)

Което е забавно, в България има 7 милиона души горе-долу, според НСИ. Ако системата с ЕГН-тата беше измислена оптимално (с доста скръндзене), би следвало 24 бита да са предостатъчни, за да адресират всеки индивид там, това са 16 милиона стойности все пак. При сегашната система, с такива безумни дивотии можем да го докараме до 2^29 или около 1 милиард евентуални ЕГН-та :) Разхищения :)


Титла: Re: C++ задача - имена и егн
Публикувано от: mavar в Mar 12, 2011, 09:52
около 1 милиард евентуални ЕГН-та :) Разхищения :)
Може пък да има дългосрочен план за увеличаване на населението. Както се казваше в един виц "и деца ще ви направиме"  ;D


Титла: Re: C++ задача - имена и егн
Публикувано от: tommy.bg в Mar 12, 2011, 16:21
Мисля, че се получи. Благодаря на всички които помогнаха.