Автор Тема: C++ задача - имена и егн  (Прочетена 4805 пъти)

tommy.bg

  • Напреднали
  • *****
  • Публикации: 63
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
C++ задача - имена и егн
« -: Mar 11, 2011, 21:21 »
Здравейте. За домашно ни дадоха една задача. Задачата е следната: Да се въведе име и егн на n брой хора и след това да се изведът по следния начин:

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

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

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: C++ задача - имена и егн
« Отговор #1 -: Mar 11, 2011, 21:55 »
Ами използвай стринг за ЕГН-то или ако държиш да е цифра 64-битов int
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

tommy.bg

  • Напреднали
  • *****
  • Публикации: 63
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
Re: C++ задача - имена и егн
« Отговор #2 -: Mar 11, 2011, 22:44 »
А как ще стане въвеждането на повече от един човек?
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: C++ задача - имена и егн
« Отговор #3 -: Mar 11, 2011, 22:51 »
const int N = 100; // 100 човека

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

Data data[N];
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

tommy.bg

  • Напреднали
  • *****
  • Публикации: 63
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
Re: C++ задача - имена и егн
« Отговор #4 -: Mar 11, 2011, 23:25 »
трябва да е само с материала от увод в програмирането с масиви цикли и т.н
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: C++ задача - имена и егн
« Отговор #5 -: Mar 11, 2011, 23:29 »
Искаш да кажеш че този увод не включва структури или кво?

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

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

tommy.bg

  • Напреднали
  • *****
  • Публикации: 63
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
Re: C++ задача - имена и егн
« Отговор #6 -: Mar 11, 2011, 23:42 »
Не включва. Не искам някой да ми пише задачата искам идея
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: C++ задача - имена и егн
« Отговор #7 -: 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

ПП:Абе не може да не включва структури
« Последна редакция: Mar 12, 2011, 00:09 от clovenhoof »
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

chen_dzen

  • Напреднали
  • *****
  • Публикации: 623
  • Distribution: Debian 6.0 Squeeze
  • Window Manager: GNOME
    • Профил
Re: C++ задача - имена и егн
« Отговор #8 -: Mar 12, 2011, 00:09 »
А как ще стане въвеждането на повече от един човек?
while(условие);
  {
     въвеждане на име;
     въвеждане на ЕГН;
     условие=имаме ли още да въвеждаме ?;
 }

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C++ задача - имена и егн
« Отговор #9 -: Mar 12, 2011, 01:31 »
Подзадача: в колко байта можете да натъпчете едно ЕГН. Очевидно 64 байта са разхищение.

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

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

"Knowledge is power" - France is Bacon

chen_dzen

  • Напреднали
  • *****
  • Публикации: 623
  • Distribution: Debian 6.0 Squeeze
  • Window Manager: GNOME
    • Профил
Re: C++ задача - имена и егн
« Отговор #10 -: Mar 12, 2011, 01:37 »
Интересно, не ства ли така :

9999999999=1001010100000010111110001111111111=34bits

unsigned int EGN:34; ???
« Последна редакция: Mar 12, 2011, 01:56 от chen_dzen »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C++ задача - имена и егн
« Отговор #11 -: 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" вид е за удобство, можем и директно да подходим към проблема :)
« Последна редакция: Mar 12, 2011, 02:11 от gat3way »
Активен

"Knowledge is power" - France is Bacon

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: C++ задача - имена и егн
« Отговор #12 -: Mar 12, 2011, 02:03 »
Последният разряд е контролна сума - би трябвало да можем и без нея (макар че има сгрешени ЕГН-та :( )
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C++ задача - имена и егн
« Отговор #13 -: Mar 12, 2011, 02:33 »
Би било забавно в по-малко или 24 бита, обаче ентропията ми се вижда прекалено висока, за да можем да си позволяваме такива волности. Така като гледам максимум 11 бита могат да се спестят, трябват ни поне 16 :)

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

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

"Knowledge is power" - France is Bacon

mavar

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