argon bulletin board

Факултети => Факултет по математика и информатика => Темата е започната от: Таньо Иванов в 27.04.2010, 14:54:03

Титла: Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 27.04.2010, 14:54:03
Ако имате идея как се решават задачите на кандидатстудентските изпити по информатика, пишете тук. Имам няколко затруднения и много ще се радвам да ми помогнете за тяхното разрешаване.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 27.04.2010, 14:59:55
Ето например една от задачите давани някога на кандидатстудентски изпит през миналите години:

Кандидатстудентски изпит по информатика, 2003 г. – Пловдивски университет

Да се състави компютърна програма за информационно обслужване на училищна библиотека. В библиотеката има до 5000 различни книги и от всяка книга има до 50 екземпляра.

А) Да се въведе и контролира, броят N на всички книги в библиотеката (3<=N<=5000). За всяка книга да се въведе следната информация:
- сигнатурен номер: 1, 2, 3, ..., N;
- заглавие: низ не по дълъг от 100 знака;
- имена на автора: име, презиме и фамилия в един низ, не по-дълъг от 80 знака, в който имената са разделени с точно един интервал;
- единична цена: реално число в интервала [1.00;99.99] ;
- брой закупени екземпляри: цяло число в интервала [1;50].

Б) Да се изведе списък на всички книги в библиотеката, подреден по сигнатурен номер, като за всяка книга се извежда: сигнатурен номер, заглавие, име на автора във вида: фамилия, инициали на името и презимето, единична цена, брой екземпляри, общата сума заплатена за тези екземпляри, разделени с по един интервал. Инициалите са първата буква на съответното име, последвана от точка. Например за книгата със сигнатурен номер 36, заглавие Под игото, автор Иван Минчов Вазов, единична цена 3.52 лв., от която са закупени 30 екземпляра да се изведе:
36 Под игото Вазов И.М. 3.52 30 105.60

В) Да се изведе списък на книгите, подредени в низходящ ред на общата сума заплатена за всички екземпляри от съответната книга. Ако има книги с една и съща обща сума, по-напред в списъка да се постави тази, която е с по-малък сигнатурен номер;

Г) Да се пресметне и изведе средно аритметичната единична цена S на книгите от библиотеката (средно-аритметичното число на единичните цени). Да се изведе и списък на всички автори, които имат поне три книги с единични цени по-големи от S.


Имам само няколко проблема които са:
1.) Да разделям стрингове на токени, знам че чарове се разделят с strtok(), но със стрингове не става. Моля ви помогнете, това е най-сериозния ми проблем.

2.)При Г) условие е да се изведе списук с авторите които имат три книги с срдна цена по-голяма от S. S го намирам и нямам преоблем, но самият списък е трудно да се състави.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 27.04.2010, 15:02:14
Начинът по който винаги съм решавал тези задачи е такъв:

#include <iostream>
#include <string>
using namespace std;

struct biblioteka
{
   int nomer;
   char title[100];
   char avtor[80];
   double cena;
   int broiki;
};

biblioteka kniga[5000];
int n;
int i;
biblioteka swap;

int broi()
{
   cout<<"Broi na knigite: ";cin>>n;
   if(n<2 ||n>5000)
   {
      cout<<"Greshen broi knigi!"<<endl;
      broi();
   }
}

int kn_nomer(int i)
{
   int nomer;
   cout<<"Signaturen nomer: ";cin>>nomer;
   
   if(nomer<1 || nomer>n)
   {
      cout<<"Greshna cifra za signaturen nomer!"<<endl;
      kn_nomer(i);
   }
   
   kniga.nomer=nomer;
}

void kn_title(int i)
{
   char title[100];
   cout<<"Zaglavie na knigata: ";cin.getline(kniga.title, 100);
   strtok(kniga.title, "\n");
}

void kn_avtor(int i)
{
   char avtor[80];
   cout<<"Avtor: ";cin.getline(kniga.avtor, 80);
   strtok(kniga.avtor, "\n");
}

double kn_cena(int i)
{
   double cena;
   cout<<"Cena: ";cin>>cena;
   
   if(cena<1.00 || cena>99.99)
   {
      cout<<"Greshna cena!"<<endl;
      kn_cena(i);
   }
   
   kniga.cena=cena;
}

int kn_broiki(int i)
{
   int broiki;
   cout<<"Broi ekzempliari: ";cin>>broiki;
   
   if(broiki<1 || broiki>50)
   {
      cout<<"Greshen broi ekzempliari!"<<endl;
      kn_broiki(i);
   }
   
   kniga.broiki=broiki;
}

int main()
{
   broi();
   for(int i=0;i<n;i++)
   {
      kn_nomer(i);
      kn_title(i);
      kn_avtor(i);
      kn_cena(i);
      kn_broiki(i);
      cout<<endl;
   }
   
   cout<<"Podrejdane na knigite po signaturen nomer: "<<endl<<endl;
   biblioteka swap;
   
   for(int i=0;i<n;i++)
   {
      for(int k=0;k<n-i-1;k++)
         if(kniga.nomer>kniga[i+1].nomer)
         {
            swap=kniga;
            kniga=kniga[i+1];
            kniga[i+1]=swap;
         }
      cout<<kniga.nomer<<" "<<kniga.avtor<<" "<<kniga.cena<<" "<<kniga.broiki<<" "<<kniga.broiki * kniga.cena<<endl;
   }
   
   cout<<"Podrejdane na knigite po obshta suma zaplatena za tqh: "<<endl<<endl;
   for(int i=0;i<n;i++)
   {
      for(int k=0;k<n-i-1;k++)
      {
         if((kniga.cena*kniga.broiki)<(kniga[i+1].cena*kniga[i+1].broiki))
         {
            swap=kniga;
            kniga=kniga[i+1];
            kniga[i+1]=swap;
         }
         else if((kniga.cena*kniga.broiki)==(kniga[i+1].cena*kniga[i+1].broiki))
         {
            if(kniga.nomer>kniga[i+1].nomer)
            {
               swap=kniga;
               kniga=kniga[i+1];
               kniga[i+1]=swap;
            }
         }
         
      }
      cout<<kniga.nomer<<" "<<kniga.title<<" "<<kniga.avtor<<" "<<kniga.cena<<" "<<kniga.broiki<<" "<<kniga.cena*kniga.broiki<<endl;
   }
   
   cout<<"Izvejdane na srednata stoinost na knigite: "<<endl<<endl;
   
   double s=0;
   for(int i=0;i<n;i++)
   {
      s=(s+kniga.cena)/n;
   }
   
   cout<<"Sredna stoinost na knigite e: "<<s<<"lv. "<<endl;
   for(int i=0;i<n;i++)
   {
      if(kniga.cena<s)
      {
         cout<<kniga.avtor<<" "<<kniga.title<<" "<<kniga.cena<<endl;
      }
   }
   
   system("pause");
   return true;


}
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: pennev в 27.04.2010, 18:30:55
Аз също не знам как ще стане условие Г), но все пак ще постна моето решение без него...

#include <iostream.h>
#include <string.h>
struct book
{
   char zaglavie[101], imeavtor[81];
   int sign, brekz;
   double cena, ocena;
};
typedef book tbook[5000];
void input(book &a)
{

   cout<<"Vavedete sign. N: ";
   cin>>a.sign;
   cin.ignore();
   cout<<"Vavedete zaglavie: ";
   cin.getline(a.zaglavie,101);
   cout<<"Vavedete avtor: ";
   cin.getline(a.imeavtor,81);
   do{
      cout<<"Vavedete cena: ";
      cin>>a.cena;
   } while(a.cena<1.00 || a.cena>99.99);
   do{
      cout<<"Vavedete br. zakupeni ekzemplqri: ";
      cin>>a.brekz;
   } while (a.brekz<1 || a.brekz>50);
   cin.ignore();
   a.ocena=a.brekz*a.cena;
   cout<<"-----------------------------------------------------"<<endl;
}
void inputall(tbook a, int n)
{
   for(int i=0;i<n;i++)
      input(a);
}
void print(book a)
{
   cout<<"-----------------------------------------------------"<<endl;
   cout<<a.sign<<" "<<a.zaglavie<<" ";
   char *p1,*p2,*p3,ime[81];
   strcpy(ime,a.imeavtor);
   p1=strtok(ime," ");
   p2=strtok(NULL," ");
   p3=strtok(NULL," ");
   cout<<p3<<" "<<p1[0]<<"."<<p2[0]<<" "<<a.cena<<" "<<a.brekz<<" "<<a.ocena<<endl;
}
void printall(tbook a, int n)
{
   for(int i=0;i<n;i++)
      print(a);
   
}
void sortsign(tbook a, int n)
{
   for(int i=0;i<n;i++)
      for(int j=n-1;j>i;j--)
         if(a[j].sign<a[j-1].sign)
         {
            book x=a[j];
            a[j]=a[j-1];
            a[j-1]=x;
         }
}
void sortocena(tbook a, int n)
{
   for(int i=0;i<n;i++)
      for(int j=n-1;j>i;j--)
         if(a[j].ocena>a[j-1].ocena)
         {
            book x=a[j];
            a[j]=a[j-1];
            a[j-1]=x;
         }
}
void scena(tbook a, int n)
{
   double var=0,s=0;
   for(int i=0;i<n;i++)
      var=var+a.cena;
   s=var/n;
   cout<<"Sredna cena na knigite: "<<s<<endl;
   cout<<"-----------------------------------------------------"<<endl;
}
int n; tbook a;
void main()
{
   
   //do
   //{
      cout<<"Vavedete br. knigi: "; cin>>n;
      cin.ignore();
   //} while(n<3 || n>5000);
   inputall(a,n);
   sortsign(a,n);
   printall(a,n);
   cout<<"!-----------------------------------------------------!"<<endl;
   sortocena(a,n);
   printall(a,n);
   cout<<"!-----------------------------------------------------!"<<endl;
   scena(a,n);
}

Ти питаше за strtok-a:

void print(book a)
{
   cout<<"-----------------------------------------------------"<<endl;
   cout<<a.sign<<" "<<a.zaglavie<<" ";
   char *p1,*p2,*p3,ime[81];
   strcpy(ime,a.imeavtor);
   p1=strtok(ime," ");
   p2=strtok(NULL," ");
   p3=strtok(NULL," ");
   cout<<p3<<" "<<p1[0]<<"."<<p2[0]<<" "<<a.cena<<" "<<a.brekz<<" "<<a.ocena<<endl;
}


Титла: Re:Кандидатстудентски изпит 2010 по информатик
Публикувано от: Светослав Енков в 27.04.2010, 20:41:34
Условие Г) може да се направи по следният начин, да се сортира първо по автори, после по цена (2 критерия).
Преди това, защото го има в условието, се намира и извежда средната цена на книгите.

След това се върти външен цикъл по всички сортирани по горния начин книги. При намиране на книга с цена >= на средната, се пуска втори цикъл от текущият елемент напред, докато авторът е същият и цената е >= средната и се броят намерените такива. И ако се достигне до бройка 3 книги с такова условие, се извежда този автор. Тънкостта е в условията за изход от тези цикълчета, за да не се излезе от масива.

Разбира се, има и други възможни начини за решаване на условие Г). Например, да се отметнат в отделен масив отделните автори. Да се броят книгите им с >= средната цена. Но това изисква отделен масив.

Или, ако се съобрази, че автор може да има повече от 1 книга, да се заложи изначално отделен масив с авторите, като в масива с книгите се пази номерът на авторът, а при добавяне на нова книга се проверява има ли го този автор, ако не - се добавя, ако да - не се добавя и тн. И в масива с авторите да има и брояч кой автор колко книги има над средното. Варианти много. Т.е. да си симулираме без да имаме база данни индекси и т.н. благинки.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 27.04.2010, 22:56:56
Благодаря ви много.

По принцип решавах задачите от миналите кандидатстудентски изпити всеки път със стрингове, но сега вече ще използвам чаровете за да мога да използвам и някой други функции, като strtok-a примерно. Благодаря  и за идейте за условие Г), които ми дадохте.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 25.07.2010, 20:14:15
Благодаря за помоща ви. Подготвих се добре, явих се на предварителният изпит по информатика и го взех с 6.00. Проблемът ми сега е само да се запиша на 9-ти август  :-)  Ще запиша специалност: Бизнес Информационни Технологий. Въпросът ми е, дали е добра реализацията на завършилите, и какви точно длъжности могат да се заемат? Моля ви помогнете  :wink:
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: antoniy в 26.07.2010, 00:50:59
Как ще се реализираш си зависи от теб.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: radko87 в 26.07.2010, 09:51:09
Аз не бих се записал Бизнес Информационни Технологий, защото е нова специалност и не знам доколко плана е добър. Но това си е мое мнение и не бива да ти влияе, нали казват че съдбата обича смелите.
Иначе  за реализацията ... antony е прав. Само не си мисли, че тази диплома ще ти намери работа.

Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 26.07.2010, 14:24:43
На мен специалността ми се вижда доста привлекателна и интересна, но сте прави за това че не може да се разчита само на това, което се изучава. Трябва да се насоча към определена насока и да вървя на там.

Но главният ми въпрос е точно какви Длъжности могат да се заемат с тези неща който се изучават. Мисля че може да се започне като редовен програмист, Бази данни Админ или секретарка  :-D Но не знам какви други длъжности може да се практикуват. Може ли например да се започне нещо като счетоводител, застраховател или банкер? Или за това се изисква да си учил Финанси.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: pennev в 26.07.2010, 14:46:11
http://forum.uni-plovdiv.bg/index.php?topic=9998.0
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 26.07.2010, 22:54:15
Да, кратък и конкретен отговор  :-D :-D Благодаря.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Peps в 29.07.2010, 12:37:40
   Счетоводител, застраховател или банкер не мисля, че можеш да станеш, защото там се изисква икономическо образование, а това не е такова.
   Аз лично смятам за по-добър избор специалността информатика, а после магистратура икономика примерно.   :-)  Успех каквото и да решиш  :-)
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 29.07.2010, 13:10:36
Благодаря за пожеланието  :wink:  :#1: Иначе след завършване БИТ може ли да се запише такава магистратура? Куде може да се видят ? Благодаря предварително..  :-)
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Светослав Енков в 29.07.2010, 13:35:45
Всичко можеш! Не го мисли сега.

В сайта на Икономическия факултет (ФИСН).

http://fisn.uni-plovdiv.bg/

Само че нещо не са си направили добре сайта и магистратурите нещо не ги намирам и аз учебните планове за магистратурите, само учебното разписание.

А можеш и магистратура в София или в Свищов икономика.
Титла: Re:Кандидатстудентски изпит 2010 по информатика
Публикувано от: Таньо Иванов в 30.07.2010, 12:33:52
Така е, има още много време, ще се види с времето.  :-) Благодаря за помоща,. :-)