Operacje na tablicach dynamicznych

0

Witam wszytskich serdecznie, mam mały problem z napisaniem programu. Treść zadania:
Zdefiniować klasę wektorów zawierającą następujące dane:
class Vec{
char Naz[4];
int n;
double *A;
static int p;
. . .
gdzie:
Naz jest maksymalnie 3 znakową nazwą wektora,
n jest rozmiarem wektora (liczbą elementów tablicy wskazywanej przez A,
A wskazuje na początkowy element n elementowej tablicy skojarzonej z obiektem,
p jest precyzją wydruku wartości elementów tablicy A,
Oprogramować tę klasę. Przyjąć zasadę, że jeśli operatory wymagają zgodności rozmiarów swoich argumentów (wektorów),
brakujące elementy wektora o mniejszym rozmiarze są zerowe. Między innymi zdefiniować operatory dodawania, odejmowania
i mnożenia wektorów, operator indeksacji. Zdefiniować odpowiedni zestaw konstruktorów, destruktor i operator przypisania.
Niech w celach testowych konstruktory i destruktor informują o swoim działaniu

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

using namespace std;
class Vec {
public:
   char Naz[4];
   int tablica[10];
   double *Vec_dl;
   int dlugosc_wektora;
   int wczytaj();
   void dodaj();
};

void menu(){
   cout << "1. Wyswietl aktualny stan" << endl;
   cout << "2. Skasuj tablice "<< endl;
   cout << "3. Koniec "<< endl;
}

int Vec:: wczytaj(){
   cout << "Podaje nazwe wektora:";
   cin >> Naz;
   cout << "Podaj dlugosc wektora: ";
   cin >> dlugosc_wektora;
   //wspolrzedne wektora
   Vec_dl=new double[dlugosc_wektora];
   cout << "Podaj wspolrzedne:" << endl;
   for (int i=0; i<dlugosc_wektora; i++){
      cout<< i+1<<" wspolrzedna: ";
      cin>> Vec_dl[i];
   }
   return dlugosc_wektora;
}

void dodaj(){
	/*for ( int i = 0; i<10; ++i ) 
	{
tablica[i] = Vec_dl[i].Vec + Vec_dl[i].Vec;
cout<<setw(3)<<tablica[i];
}*/
}

int main()
{
   int K,wybor;
   cout<<"Podaj liczbe wektorow: ";
   cin >> K;
   Vec *tab;
   tab = new Vec[K];

   for (int i=0; i<K; i++){
      system("cls");
      cout << "Wprowadz dane wektora nr : " << i+1 << endl;
      tab[i].wczytaj();
   }
      
   do{
      system("cls");
      menu();
      cin >> wybor;

         switch(wybor){  
			case 1:
               system("cls");
			   for (int i=0; i<K; i++){
			   cout<<"Dane wektora " << i+1 << endl;
			   cout<<"Nazwa: "<< tab[i].Naz<<endl;
			   cout<<"Wspolrzedne: "<<endl;
			   for (int j=0; j<tab[i].dlugosc_wektora; j++){
			   cout<<tab[i].Vec_dl[j]<<", ";
				}
			   cout<<endl;
			   }
               system("pause");
               break;
            
			case 2:
               delete []tab;
               break;
            
			default:
               cout << "nie ma takiej opcji";
               break;
         }

   }while (wybor!=3);
   return 0;
}

No i w sumie to tyle, jest to mój pierwszy program obiektowy i za Chiny nie mogę się połapać. Przewertowałem masę artykułów, ale najwidoczniej nie jest to moja mocna strona (programowanie). Proszę o pomoc. Klasa inaczej zadeklarowana niż w treści zadania, ale to nie ma znaczenia. Po prostu bardziej pasują mi pewne nazwy (bardziej intuicyjne). Prosiłbym też o w miarę najprostsze rozwiązanie mojego problemu.

1
class Vec {
private:
  char name[4];
  double *values;
  int size;

public:
  Vec(int size);
  Vec(int size, double values[]);
  Vec(const Vec &v); //konstruktor kopiujący
  ~Vec();//destruktor

  Vec operator+(Vec &v);
  Vec operator-(Vec &v);
  Vec operator*(double d);
  double operator[](int index);

  friend ostream & operator<< (ostream &out, const Vec &v); // do wypisywania lub jakaś funkcja, która zwróci ci char*, ale to c++, więc rozwiązanie ze strumieniem jest bardziej pożądane, poprawne
};

To jest minimum do zaimplementowania dla ciebie.

0

Kurcze nie czaję tego:/ Można to jakoś prościej napisać?

0

Zgodnie z treścią to jest najprościej jak można.
Prościej to będzie przeczytać książkę o programowaniu w C++, pewnie już 3 pierwsze rozdziały wystarczą, niż rwać sobie włosy z głowy.

0

Podejrzewam, że masz rację:P No to nic, trzeba się zabrać za robotę:) Dzięki, tematu jeszcze nie zamykać xD A tak btw, dałoby radę napisać kompletny program a nie tylko to co wynika z treści zadania? :) I jeszcze jedno małe pytanie. Czy dałoby się przerobić taki program, żeby spełniał wymagania podane w treści zadania?

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

using namespace std;

class Student {
public:
   string imie, nazwisko;
   int nr_albumu;
   float srednia;
   string *przedmioty;
   int ilosc_przedmiotow;
   void wczytaj();
   void usun();
   
};

void menu(){
   cout << "**************************************************" << endl;
   cout << "*                                                *" << endl;
   cout << "*  1 - Dodaj nowego studenta                     *" << endl;
   cout << "*  2 - Wyswietl aktualny stan tablicy            *" << endl;
   cout << "*  3 - Zapisz zawartosc bazy do pliku            *" << endl;
   cout << "*  4 - Skasuj cala zawartosc i zakoncz program   *" << endl;
   cout << "*                                                *" << endl;
   cout << "**************************************************" << endl;
}



void Student:: wczytaj(){
   
   cout << "Imie: ";
   cin >> imie;
   cout << "Nazwisko: ";
   cin >> nazwisko;
   cout << "Nr albumu: ";
   cin >> nr_albumu;
   cout << "Srednia: ";
   cin >> srednia;
   cout << "Ilosc przedmiotow: ";
   cin >> ilosc_przedmiotow;

   przedmioty=new string[ilosc_przedmiotow];

   cout << "Wprowadz nazwy przedmiotow:" << endl;

   for (int i=0; i<ilosc_przedmiotow; i++){
      cout << "  ";
      cin >> przedmioty[i];
   }
}

ostream& operator<<(ostream& ekran, Student& s){
   ekran << "Imie       - " << s.imie << endl;
   ekran << "Nazwisko   - " << s.nazwisko << endl;
   ekran << "Nr albumu  - " << hex << s.nr_albumu << endl;
   ekran << "Srednia    - " << fixed << setprecision(2) << s.srednia << endl;
   ekran << "Przedmioty: " << endl;

   for (int i=0; i<s.ilosc_przedmiotow; i++)
      ekran << "  " << s.przedmioty[i] << endl;
   
   return ekran;
}

int main()
{
   int wybor,K;
   ofstream F("student.txt");

   system("cls");
   cout << "Podaj liczbe studentow : ";
   cin >> K;
   Student *tab;
   tab = new Student[K];

   for (int i=0; i<K; i++){
      system("cls");
      cout << "Wprowadz dane studenta nr : " << i+1 << "."<< endl;
      tab[i].wczytaj();
   }

      
   do{
      system("cls");
      menu();
      cin >> wybor;

         switch(wybor){
            case 1:
               system("cls");
               Student *kopia;
               kopia=new Student[K];

               for (int i=0; i<K; i++)
                  kopia[i]=tab[i];

               delete[] tab;
               tab=new Student[K+1];

               for(int i=0;i<K;i++)
                  tab[i]=kopia[i];

               cout << "Podaj dane studenta nr " << K+1 << "." << endl;
               tab[K].wczytaj();
               K=K+1;
               delete[] kopia;
               break;
            case 2:
               system("cls");
               for (int i=0; i<K; i++){
                  cout << "Dane studenta nr " << i+1 << "." << endl;
                  operator<< (cout, tab[i]);
                  cout << endl;
               }
               cout << endl;
               system("pause");
               break;
            case 3:
               for (int i=0; i<K; i++)
                  F << "Dane studenta nr " << i+1 << "." << endl << tab[i] << endl;
               cout << "\n>> Zapisano baze do pliku 'student.txt' ! <<\n\n";
               system("pause");
               break;
            case 4:
               delete []tab;
               break;
            default:
               cout << "Podales bledny nr!";
               break;
         }

   }while (wybor!=4);
   return 0;
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1