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

Програмиране => Общ форум => Темата е започната от: tyuio в Apr 28, 2010, 23:20



Титла: Задача по с++
Публикувано от: tyuio в Apr 28, 2010, 23:20
Така, задачата е следната:
Имам структира от данни в която има разни неща но най вече цени и общ брой наличност. Трябва да се направи след въвеждане на данните следното:
Да се умножи за всяко лекарство броя и цената за да се знае общата стойност, за дадено лекарство.
Сбора на цените на всички лекарства взети заедно за да се знае общата стойност на лекарствата в наличност.
Да се извади ДДС за общия брои като се покаже цената  и колко е сумата на самия данък за всички лекарства.
Същото за данъка за всяко едно лекарство по отделно.
Четири неща се искат още в задачата и аз на това ударих на камък и нищо не ми идва на ум.


Титла: Re: Задача по с++
Публикувано от: astronom в Apr 29, 2010, 00:10
Изтрито, съгласно т. 4 от Правилата на форума
bop_bop_mara


Титла: Re: Задача по с++
Публикувано от: b2l в Apr 29, 2010, 00:11
//offtopic
...

...изтрито...
Мисля че tyuio от давна е излязъл от университета :)

Редактирано, съгласно т. 6 и 4 от Правилата на форума
bop_bop_mara


Титла: Re: Задача по с++
Публикувано от: ntrance в Apr 29, 2010, 01:52
Изтрито, съгласно т. 4 от Правилата на форума
bop_bop_mara


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 02:08
Проблема не е в самото извличане на информацията а в визуализацията му понеже приложениято е конзолно и не мога да се сетя как да го направя удобно за достъп и визуализация.


Титла: Re: Задача по с++
Публикувано от: Punkoff в Apr 29, 2010, 09:25
Пост-ни, ако може, как си конструирал  структората.


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 10:40
Код
GeSHi (C++):
  1. struct aptekaArtikul
  2. {
  3.  
  4.        char imeArtikul[30];
  5.        char imeProizvoditel[30];
  6.  
  7.        int dataProizvodstvo;
  8.        int dataGodnost;
  9.        int broiArtikul;
  10.        int codArtikul;
  11.  
  12.        float cenaArtikul;
  13. };


Титла: Re: Задача по с++
Публикувано от: Acho в Apr 29, 2010, 11:10
Tyuio, не съм програмист, там другите ще кажат. Но понеже попита и за визуализирането, ако може изхода от програмата да е нещо html или подобно, може с текстовите браузери lynx или links да се гледа. Особено с lynx и цветни текстове се вижда много добре. Това ми идва на ума сега.


Титла: Re: Задача по с++
Публикувано от: Punkoff в Apr 29, 2010, 11:11
След малко ще я пробеам
/off-topic
A между другото видях из някоя от ремите,че си писал нещо за ПУ. Там ли учиш -редовно задочно?Курс?


Титла: Re: Задача по с++
Публикувано от: gat3way в Apr 29, 2010, 11:31
И тези структури ги пазиш в масив или имаш някаква динамична структура (свързан списък примерно), където освен next/prev имаш и указател към тази структура?

И в двата случая, обхождането и сметките не са голяма драма. Между другото датата как я въвеждаш, в какъв вид?

С тези int стойности можеш да си вкараш автогол, защото не са unsigned и както вадиш (примерно наличността намалява с няква бройка), в един хубав момент могат да придобият отрицателна стойност ако не внимаваш.

Другото е че името на артикула и производителя са масиви от 30 char стойности. Ако по някаква причина ги overflow-неш става забавно:

- overflow-ваш името на лекарството: мажеш по името на производителя
- overflow-ваш името на производителя: разказваш играта на следващите int стойности (дати на производство и годност, брой артикули и т.н.).

Лошото е че ако не препълниш прекалено много тези низове, програмата няма да крашне, но ще ти помаже данните и ще ядеш много ядове. Затва, по-добре вместо char blabla[30], сложи указател към името (char *blabla) и някъде си заделяй динамично памет за низовете. Така ако препълниш низа, в най-лошият случай ще думнеш някой друг malloc-нат регион от heap-а,  ще помажеш някое име на производител/лекарство (но не и годности и цени) и хубавото е че твърде вероятно при нов malloc() или free(), програмата ще гръмне и ще разбереш че има такъв проблем навреме.

М за жалост и тва не е добро решение и поради тази причина все пак най-добре проверявай колко байта въвеждаш.

А иначе при C++ тия неща май стават по-безопасно, нали имат някакъв string тип и доколкото знам операциите по присвояване при него правят bounds checking сами и спестяват такива драми.


Титла: Re: Задача по с++
Публикувано от: Punkoff в Apr 29, 2010, 11:33
Код
GeSHi (C++):
  1. void zad(aptekaArticul a[],int n)
  2. {
  3. int i;
  4. double sum=0;
  5. for(i=0,i<n.i++)
  6. {
  7. cout<<"Obshtata shtoinost za "<<i<<"-iq artikul e :"
  8.     <<a[i].broiartikul*a[i].cenaartikul
  9.     <<"S DDS :"<<(double)(a[i].cenaartikul-(a[i].cenaartikul/1.2))<<endl;
  10.  sum+=(a[i].broiartikul*a[i].cenaartikul);
  11. }
  12. cout<<"Obshtata stoinost e : <<sum<<" s DDS : <<sum-(sum/1.2)<<endl;
  13. return;
  14. }

Не съм я тествал ама долу-горе така трябва да изглежда ако съм разбрал правилно условието. Най вероятно има маки грешки  ама то компилатора ще ти каже какви.Дано да съм бил от помощ. :)


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 11:35
Еми да, там уча. На стари години реших да го завърша и това :) Първи курс задочно съм информатика. Задачата не е за мен пряко, но се упражнявам и аз просто има за цел да я направя по функционална и да ми е удобна за работа без непременно да има практическа насоченост. Нямам никакво понятие от менюта в конзола как се правят и искам да е нещо удобно като нещата които ползвам под конзола в Линукс.
Задачата не е от български университет и има бая под условия, повечето от които съм ги решил. Ето някой от тях ако ви е любопитно:
Да се покаже за дадено лекарство колко му остава до края на срока за годност.
Да се окаже дали в  момента има лекарства с изтекъл срок.
Да се сортират по производител.
Да се покаже дали има едно лекарство с повече от един производител и да се сравнят цените им.

Има още няколко но са си просто сортиране.


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 11:42
Автогол не автогол условието е изрично да е цяло число от вида по двойки: дата месец година- за 24-05-2009 е 240509.
Няма лекарства произведени преди 2000 година.

Общо взето ме интересува нещо за четене как се правят удобни менюта в конзола.
Аз най често правя do{}while  с букви за избор като да речем (q) е изход


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 11:46
да за имената не е изрично оказано какви да са може и да са указатели прав си.


Титла: Re: Задача по с++
Публикувано от: gat3way в Apr 29, 2010, 11:52
Ми то пак си е цяло число, само дето като е unsigned, не може да става отрицателно. Като плюс получаваш два пъти по-голяма максимална стойност, в случай че случайно решат да пазят в наличност повече от 2 милиарда артикула, ха-ха.

Очевидно не те карат да правиш сметки с датите, та затова те карат да ги пазиш по такъв начин, ама по този начин направо могат да ти видят сметката. Най-простото е да те накарат да сметнеш колко дни е срока на годност: на пръв поглед е лесно, на втори поглед не е въобще проста аритметика и за капак има високосни години и си ****** майката :)

Що се отнася до менюто в конзолата, може да ползваш getchar(). Ако е под линукс е малко кофти, защото терминала има навика да буферира редове и като натиснеш буквата, няма да я приеме преди да натиснеш ENTER. Та там се правят малко магии - сетваш си терминала в raw режим и можеш да четеш с getchar() или ако искаш директно с read() от нулевия FD.


Титла: Re: Задача по с++
Публикувано от: Punkoff в Apr 29, 2010, 11:56
http://www.kaldata.com/forums/index.php?showtopic=5612
Незнам дали мога да пост-вам линкове към други форуми ама гуугле така показа.
Втория пост има линк за учебници там някъде почети ако имаш време.
/off-topic
Колега на ООП на 08 ще ходиш ли?


Титла: Re: Задача по с++
Публикувано от: Punkoff в Apr 29, 2010, 12:06

А ако си като мен и не си много наясно с тези работи можеш да си чистиш буфера така

char p[100];

и след всяко cin>> което ползваш може да пишеш

cin.getline(p,100);

По-ламерски е ама върши работа :>
 


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 12:15
//офф
ами май на осми няма да мога, че нито съм подготвен, нито знам на какво е изпита а и на всичко отгоре съм зает. Имаш лично съобщение.


Титла: Re: Задача по с++
Публикувано от: b2l в Apr 29, 2010, 13:41
switch and case няма ли да ти свършат работа за менютата?


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 14:18
За някой неща става, обаче така правя възможност да направиш няколко неща преди да излезеш и цикъла се завърта до момента в който не решиш че ти стига :)


Титла: Re: Задача по с++
Публикувано от: gat3way в Apr 29, 2010, 14:36
Ми то това какво те бърка - винаги можеш да си декларираш някакви променливи - флагове там според които да можеш или да не можеш да правиш разни неща.

Що се отнася до четенето на клавиш и да изглежда като хората в линукс:

Код
GeSHi (C):
  1. #include <termios.h>
  2. #include <unistd.h>
  3.  
  4. #define EXIT_OPT 'q' // kato natisnesh 'q' izlizash primerno
  5. ....
  6.  
  7. void main_loop(void)
  8. {
  9.   struct termios terminal;
  10.   unsigned char readKey=0;
  11.   ssize_t readbyte=1;
  12. ...
  13.  
  14.   while ((readbyte>0) && (readKey!=EXIT_OPT))
  15.   {
  16.      tcgetattr(0,&terminal);
  17.      terminal.c_lflag &= ~( ECHO|ICANON|ECHOE|ECHOK|ECHONL );
  18.      tcsetattr(0,TCSANOW,&terminal);
  19.      readbyte=read(0,&readKey,1);
  20.      terminal.c_lflag |= ( ECHO|ICANON|ECHOE|ECHOK|ECHONL );
  21.      tcsetattr(0,TCSANOW,&terminal);
  22.      if (readbyte >0)
  23.      {
  24.            switch (readKey) {
  25.               case '....
  26. ....
  27.  
  28.            }
  29.      }
  30. }
  31.  
  32.  


Нещо такова


Титла: Re: Задача по с++
Публикувано от: schemer в Apr 29, 2010, 14:52
Предложение:

Цитат
"=========== PRODUCT #%d ===========\n"
"Article: %s\n"
"Manufacturer: %s\n"
"Production date: %s\n"
"Expiration date: %s\n"
"Quantity: %d\n"
"Code Number: %d\n"
"Price: %.2f\n\n"


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 29, 2010, 15:02
Предложение:

Цитат
"=========== PRODUCT #%d ===========\n"
"Article: %s\n"
"Manufacturer: %s\n"
"Production date: %s\n"
"Expiration date: %s\n"
"Quantity: %d\n"
"Code Number: %d\n"
"Price: %.2f\n\n"

това що ми мяза на чисто С?

Благодаря гет3 ще го разгледам сега.


Титла: Re: Задача по с++
Публикувано от: schemer в Apr 29, 2010, 15:40
това що ми мяза на чисто С?

Благодаря гет3 ще го разгледам сега.

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

Иначе е чисто С, колкото и твоята структура :)


Титла: Re: Задача по с++
Публикувано от: gat3way в Apr 29, 2010, 15:42
c++ е за лигльовци :)


Титла: Re: Задача по с++
Публикувано от: remotex в Apr 30, 2010, 09:01
Мисля че в заглавието пише задача на С++... та какви масиви, какви са тези char p[100] пък после std::cin ?!?
Като ще е С++ да е С++
1.  Като ще е С++ ползвай си там от stl  каквото ти душа сака :-) - или смени заглавието на "задача на С". Ето едно предложение на С++:
 По-принцип с/лед getline() няма нужда от ignore() - но напр. след cin << age; може и да има нужда от едно:
Код:
std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');

Код
GeSHi (C++):
  1.      # include <iostream>
  2.      # include <string>
  3.      using namespace std;
  4.  
  5.      int main(void) {
  6.            string full_name;
  7.            cout<<"Enter your name: ";
  8.            getline(cin,full_name);
  9.            cout<<"Hi !"<<full_name<<endl;
  10.            cin.get();
  11.  
  12.            return 0;
  13.      }
2.  За конзолни менюта може да позлваш ncurses ($2). За уиндоус не се сещам нещо с отворен код ама Гугъл знае предполагам .../интересно не знаех че има порт и за уиндоус ($2)/

П.П. Инак... и на мен ми мяза на чисто С!


Титла: Re: Задача по с++
Публикувано от: tyuio в Apr 30, 2010, 12:43
Ще си почета урочетата които дадохте :D  Тя за дачата за курсовата се оказва като на изпита за влизане, така и не разбрах защо е така !
Обаче аз много съм се занемарил и прости неща не мога да се сетя и си намирам задачки  дето да си решавам, че да вляза малко, от малко в час.
Благодаря ви на всички!


Титла: Re: Задача по с++
Публикувано от: remotex в May 03, 2010, 08:30
Ако това ти е "задачата за курсовата" защо ли не ме учудва че е същата "като на изпита за влизане" и защо там пише С++ а не С - тука така - обик. се преподават неща които не се разбират (от преподавателите - иначе съм срещал доста хора които разбират, но не преподават за съжаление) затова... ако искаш да научиш нещо.. С++.. Вземи попрочети нещо различно от това дето ви преподават -  то по принцип С е 26 оператора (аз като почвах да го уча вече бяха 27) сега са малко повече, С++ е с още няколко отгоре (но са едноцифрено число), но като ги научиш наизуст - това не значи че вече знаеш езика - тогава са наред библиотеките glibc за С, stl, boost, etc. за С++
Всъщност когато те питат знаеш ли един език имат предвид какво можеш даправиш с него а това опира най-вече до какви библиотеки можеш да позлваш от него (а не за ония 26-30 оператора дето са научават наизуст за 1 ден)

Сега по темата: още не мога да разбера задачата ти чисто С ли е или С++. Не виждам да се бориш с класове (но може би тях ги знаеш).
Всъщност С++ най-общо казано е С  с класове, без класовете си е за С задачката. то е като Object Pascal ама без обекти - ми чист Паскал си е ;-) а разликата е съществена.
Според мен започни с една книжка по С без да задълбаваш и за обща култура ако щеш я прочети като вестник. После прочети нещо за С++: класове, наследяване, полиморфизъм, шаблони и едва тогава (вече ще ти е станало ясно предполагам) ще решиш накъде да се насочиш т.е. кои стандартни библиотеки ще ти вършат работа  тях да почнеш да разучаваш: boost или stl или други...


Титла: Re: Задача по с++
Публикувано от: gat3way в May 03, 2010, 10:02
Абе вие C++ програмистите сте малко странни животни - какво значи това "мяза ми на чисто C"? Щом се компилира и работи, не виждам никакъв проблем. Най-лошото е че хората дето учат C++ в университета, им набиват в главата, че трябва да правят всякакви глупости само и само това да угодят на преподавателя, който е решил че това е висше благо и 200-редова програма трябва задължително да илюстрира класове, частни и публични членове, наследяване, собствени конструктори и деструктори, предефинирани оператори за присвояване и тем подобни работи.

Докато бях в университета, цял семестър един чичко преповтаряше какво благо били всички тези неща, накрая трябваше да правя курсова задача много подобна на горната - с някаква видеотека, заглавия и цени. Та написах я и отивам да я предавам. Първоначалната му идея беше да ми пише 4 заради това че съм декларирал една структура вместо клас при положение, че членовете и бяха само int и char [] стойности и нямаше ама грам нужда да го оформям като клас и да инстанцирам обекти. Тъй като завързахме един малък спор за смисъла от тези неща, той се убеди че в конкретния случай нямало особен смисъл...и ми писа 5, защото не съм си декларирал собствен оператор за присвояване на един клас. Тоя път опитите да го убедя, че няма нещо, което го налага, защото в случая няма никакви особености и всеки нормален компилатор ще го направи коректно, не помогнаха. Завърши с "това не е каноничния вид на един клас" (wtf) и толкова.

И после как да не мразя тия глупости, това C++ е като някакво състезание как максимално много да се ползват ненужни конструкции.


Титла: Re: Задача по с++
Публикувано от: tyuio в May 03, 2010, 10:27
Ааааа, никакво ООП всичко до структури без ползване даже на файлове (щото не сме ги били взели) на очни не съм ходил та не знам. Обаче да си е процедурен код с нещата на С++ не на С. Последния път ме питаха k'ъв е тоя scatf() тука? Освен това някой неща са си кофти ся трябва да ходя да инсталирам на уиндоус и да компилирам за да стане ехе файл. Квода на правя че всички примерни задачи дето уж даскали са ги писали ми плючт камараа грешки под gcc и аз си играя да видя аджаба къде е грешката, без понятие да си има от библиотеките и какво има в тях (както каза прежде говорящия) Троблемът си е мой разбира се ама да се оплача :)


Титла: Re: Задача по с++
Публикувано от: n00b в May 03, 2010, 12:06
И после как да не мразя тия глупости, това C++ е като някакво състезание как максимално много да се ползват ненужни конструкции.

С++ се превърна в едно състезание по мерене на полови органи и кодовете да станат максимално трудни за четене. Затова отворени кодове на С++ гледам да избягвам много-много тъй като се натоварвам с разчитането им.


Титла: Re: Задача по с++
Публикувано от: remotex в May 04, 2010, 11:49
tyuio - относно Уиндоуса: навремето ползвах mingw (по-преди това cygwin ама забрави за него) - иска си обаче освен изпълнимия файл и поне мин още един mingw*.dll за да тръгне после, който не знам дали ще успееш да го направиш незабележим или ще ти направят забележка за него. Сега аз си ползвам qt-sdk (qt-creator е вграден вътре) и си прави чист изпълним файл за сътветната платформа - само при създаване на нов проект му казваш да е конзолно и да не ползва Core, GUI и нищо от Qt и си става чисто С ..опа С++ .exe  ;D

gat3way: не смесвай понятията т.е. намразвнаето на преподавателя с намразването на предмета ;)


Титла: Re: Задача по с++
Публикувано от: gat3way в Jun 01, 2010, 09:42
Да не кажете, че само аз тролствам по тоя въпрос, току-що попаднах на следното изказване на Линус Торвалдс:

http://article.gmane.org/gmane.comp.version-control.git/57918

Няма да скрия задоволството си :)


Титла: Re: Задача по с++
Публикувано от: muxozavar в Jun 01, 2010, 10:55
// off
https://lwn.net/Articles/390016/ ($2)  :o


Титла: Re: Задача по с++
Публикувано от: go_fire в Jun 01, 2010, 14:40
Четох оригиналната кореспонденция. Само казват, че е възможно да ползваш 98 стандарта (но не и новия 03) за част от разработката, ама само някой неща, за да не е нечетимо на Ц програмисти и нови Ц++. Нещо от сорта, абе може да го ползвате, ама по-добре не, малко и почти никъде.