BG Development


  Reply to this topicStart new topicStart Poll

> C++ функция
hollow
Публикувано на: 03-01-2017, 19:42
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 1
Регистриран на: 03.01.17



Имам задача (почти изпълнена) и единственото което не ми се получава е функцията намираща превоза с най-голяма продължителност.Може ли някой да ми разясни как стават нещата?

ето го условието:

QUOTE
Съставете програма с функции за:
а) Въвеждане от клавиатура във файл и в масив(чрез добавяне) данни за корабни превози(до 20) - БМФ Варна: маршрут, кораб-име, начална дата, крайна дата, име на капитана, брой контейнери със съответен товар, обща сума на приходите от транспортирането. Извеждане текущото съдържание на масива(файла) на екран.;
б) Извеждане на екран данните за превозите на кораб по въведено от клавиатурата име на кораб(със запитване за нова справка);
в)Извеждане на екран данните за корабния превоз с най-голяма продължителност.

Главна функция main() - с меню за избор на функции и проверка за състоянието на данните. Използване на глобални променливи е забранено.



а ето го и кода за момента:

CODE
#include <fstream> // za failove
#include <iostream>
#include <cstdlib>
#include <string>


using namespace std;
const int N = 20; // vuvejda broi korabi do 20
const char Name[] = "my.dat"; // ime na faila

struct korab // deklarira struktura korab
{
      char brkonteineri[20]; // broi konteineri
      char korabime[20]; // ime na korab
      char marshrut[20]; // marshrut
      char imenakapitan[15]; // ime na kapitan
      float prihodi; // prihodi
      int  nachalnadata; // nachalna data
      int krainadata; // kraina data
};
fstream fp; // ukazatel za faila
int n; // broi korabi

void create(korab st[]) // funkciq za zapisvane vuv fail
{
      int i;
      do {
            cout << "\n Broi korabi:";
            cin >> n;
      } while (n<1 || n>N); // N - broi korabi
      fp.open(Name, ios::binary | ios::out); // dvoichen fail, otvarqne
      if (!fp) { cout<< endl << "Error"; exit(1); }
      for (i = 0; i<n; i++)
      {
            fflush(stdin);
            cout << "\n Ime na korab:"; cin >> st[i].korabime;
            cout << "\n Ime na kapitan:"; cin >> st[i].imenakapitan;
            cout << "\n Broi konteineri:"; cin >> st[i].brkonteineri;
            cout << "\n Marshrut:"; cin >> st[i].marshrut;
            cout << "\n Data na trugvane:"; cin >> st[i].nachalnadata;
            cout << "\n Data na pristigane:"; cin >> st[i].krainadata;
            cout << "\n Prihodi:"; cin >> st[i].prihodi;
      }
      fp.write((char*)st, n * sizeof(korab)); // zapis na masiva vuv fail
      fp.close(); // krai na funkciqta
}



void output(korab st[]) // funkciq za izvejdane
{
      long int pos, i;
      korab s;
      cout << "\n Izvejdane  na vuvedenite korabi\n";
      fp.open(Name, ios::binary | ios::in);
      if (!fp) { cout << endl << "Error"; exit(1); }
      fp.seekg(0L, ios::end);
      pos = fp.tellg();
      fp.close();
      fp.open(Name, ios::binary | ios::in);
      if (!fp) { cout << endl << "Error"; exit(1); }
      for (i = 0; i < pos / (sizeof(korab)); i++)
      {
            fp.read((char*)&s, sizeof(korab));
            st[i] = s;
            cout << "\n Ime na korab:" << st[i].korabime;
            cout << "\n Ime na kapitan:" << st[i].imenakapitan;
            cout << "\n Broi konteineri:" << st[i].brkonteineri;
            cout << "\n Marshrut:" << st[i].marshrut;
            cout << "\n Data na trugvane:" << st[i].nachalnadata;
            cout << "\n Data na pristigane:" << st[i].krainadata;
            cout << "\n Prihodi:" << st[i].prihodi;

      }
      fp.close();
}

void search(korab st[]) // tursi korab po ime
{
      char korabime[20];
      long int pos, i, k = 0;
      korab s;
      cout << "\n Tursene na korab po ime:";
      cin >> korabime;
      fp.open(Name, ios::binary | ios::in);
      if (!fp) { cout << endl << "Error"; exit(1); }
      fp.seekg(0L, ios::end); //premestva ukazatelq na faila v kraq na poziciqta
      pos = fp.tellg(); // opredelq duljinata na faila v baitove
      fp.close();
      fp.open(Name, ios::binary | ios::in);
      if (!fp) { cout << endl << "Error"; exit(1); }
      for (i = 0; i < pos / (sizeof(korab)); i++)
      {
            fp.read((char*)&s, sizeof(korab)); // chete dannite ot faila
            st[i] = s;
            if (strcmp(st[i].korabime, korabime) == 0)
            {
                  cout << "\n Broi konteineri:" << st[i].brkonteineri;
                  cout << "\n Ime na kapitan:" << st[i].imenakapitan;
                  cout << "\n Marshrut:" << st[i].marshrut;
                  cout << "\n Data na pristigane:" << st[i].nachalnadata;
                  cout << "\n Data na trugvane:" << st[i].krainadata;
                  cout << "\n Prihodi:" << st[i].prihodi;
                  k++;
            }
      }
      if (k == 0) {
            cout << "\n Ne e nameren korab \n"; exit(1);
      }
      fp.close();
}




void main()
{
      struct korab st[N];
      int ch;
      do {
            cout << "\n 1.Suzdavane na file grupa ot korabi";
            cout << "\n 2. Izvejdane na vuvedenite korabi";
            cout << "\n 3. Tursene na korab po ime";
            cout << "\n 4. Exit";
            do {
                  cout << "\n Izberete:"; cin >> ch;
            } while (ch < 1 || ch>4);
            switch (ch)
            {
            case 1: create(st); break;
            case 2: output(st); break;
            case 3: search(st);
            }
      } while (ch != 4);
}
PMEmail Poster
Top
ivanov03
Публикувано на: 05-01-2017, 13:22
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 74
Регистриран на: 14.12.12




Здравей!

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

1. Не се слагат такъв тип коментари като: " int nachalnadata; // nachalna data " !
(каквито са и всички останали коментари в структурата)
Това е все едно да сложиш: "коментар // коментар" или за себе си: "аз //аз".
Тоест - не се прави коментар на нещо ясно и очевидно!
Коментарът трябва да пояснява предназначението на дадена функция или променлива, или нещо друго, което е специфично и не е видно(поне на пръв поглед) от кода!
2. Нямаш никакви проверки за защита и валидация на входните данни.
3. Брой контейнери - би трябвало да бъде число (примерно от тип int).
4. За начална и крайна дата - писал си ги от тип int - не знам как точно си смятал, че трябва да бъдат...
Примерно аз искам да въведа начална дата: 05.02.2016 и крайна дата 07.05.2016
Въвеждам първата и...програмата "крашва", "забива", "зацикля", защото съм въвел точка! Същото ще стане, ако въведа буква вместо някоя цифра. Това става, защото няма защита и валидация на входните данни(т.2).
Впрочем това може и да не ви го изискват(когато бях студент не обръщаха достатъчно внимание на този въпрос), но при изработване на практическо приложение е абсолютно необходимо!

За да решиш подусловие в) трябва да изпълниш следните стъпки:
1. Да създадеш функция за реализация на тази цел и да я включиш в програмата и в менюто
В тази функция трябва да:
1.1. Да намериш корабния превоз с най-голяма продължителност
1.2. Да изведеш данните за него на екрана

С т.1. би трябвало да се справиш без проблем(след като си написал такава голяма задача...)))!
Подточка 1.2. се реализира по сходна логика и по подобен начин както в подусловие б), където извеждаш данните, когато имената на корабите съвпадат.

А за да се справиш с подточка 1.1. трябва да намериш продължителността на всеки от въведените корабни превози, да ги сравниш и да определиш кой е "най-голям" / "най-продължителен"! И след това да преминеш към подточка 1.2.- извеждане на данните за него на екрана!

Нямам много опит в работата с дати в С/С++.(Съветът ми е да прегледаш материалите, които са ви дали и да видиш как са ви показали и обяснили да работите с дати.)

Затова ще ти обясня аз как бих подходил като логика на решение, а ти после ще се трудиш и "бориш" с програмната реализация!
Логически трябва от крайната дата да извадиш началната и така да определиш продължителността на дадения корабен превоз. Но тук има много "подводни камъни"! За да стане това датите трябва да са в еднакъв формат и то подходящ за целта! Трябва началната дата да е "по-малка" от крайната и т.н.т. (Възможно е да се наложи да ползваш функции за преобразуване)

Ти си писал типа на датите "int". Ако продължиш да ползваш този начин - може да укажеш определен формат за въвеждане на датите, който е подходящ за целта примерно: "година, месец, дата" (и да се въвеждат само с цифри и без точки, интервали и др.)
Тоест за тези дати, които написах по-горе ще стане така: началната дата 05.02.2016 трябва да се въведе 20160205
Аналогично и за крайната дата 07.05.2016 трябва да бъде 20160507
Като извадим от крайната дата началната се получава някакво число(в случая 302).
Извършваш това действие за всички въведени корабни превози.
След това ги сравняваш, намираш най-голямото число и извеждаш данните за съответния превоз!


Това е от мен.

Желая ти успех!


Това мнение е било редактирано от ivanov03 на 05-01-2017, 13:42
PM
Top
miron
Публикувано на: 06-01-2017, 16:18
Quote Post



Име: Мирослав Николов
Група: Потребител
Ранг: Редовен член

Мнения: 562
Регистриран на: 26.04.05



QUOTE (ivanov03 @ 05-01-2017, 13:22)
Тоест за тези дати, които написах по-горе ще стане така: началната дата 05.02.2016 трябва да се въведе 20160205
Аналогично и за крайната дата 07.05.2016 трябва да бъде 20160507
Като извадим от крайната дата началната се получава някакво число(в случая 302).

20160401-20160328=73
20160301-20160228=73
Но единия интервал е с 2-3 дена по-голям от другия.
PM
Top
johnfound
Публикувано на: 06-01-2017, 17:24
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 5118
Регистриран на: 27.05.04



Когато се работи с дати, за които трябва да се намират интервали се преминава в UNIX време и всички изчисления се правят с него. В този смисъл, int за времената е подходящо. Но трябва да се конвертират правилно датите.


--------------------
asm32 - Приложно програмиране на асемблер.
Tox: 2B446ADCEC7E180CD4C59391D81D4CAB3E99CA7AE767DB3AB45AF976F8A2050FF071DDB733F1
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0