Wyszukiwarka Struktury

0

Napisać i uruchomić program do wyszukiwania plików dźwiękowych w pewnej bazie danych (znanej a'priori, np. umieszczonej w kodzie źródłowym programu - nie trzeba pisać procedury wprowadzania danych przez użytkownika!). Pojedynczy rekord w bazie odpowiada jednemu plikowi, a plik charakteryzuje się następującymi cechami:

  1. Nazwa oraz katalog na dysku, w którym plik się znajduje (czyli pełna ścieżka dostępu)
  2. Typ pliku (MP3 / WAV / WMA / OPUS itp.)
  3. Czas trwania
  4. Opis
    1. Wykonawca
    2. Tytuł
    3. Gatunek (Disco, Classic, Rock, itp.)

No i tak zaczałem i potem próbowałem recznie pododawać jakieś dane do struktury. I czy da się ją jakoś sprawnie wypełnić? I czy to wyszukiwanie to powinna być pętla idąca po kolei po wszystkich zmiennych sprawdzająca jeden typ ?

#include <stdio.h>
#include <stdlib.h>

enum format{MP3,WAV,WMA,OPUS};
enum gatunek{Disco,Rock,Country,Classic,Pop,Rap,Electronic,Soul,RnB,Jazz};
struct songs{
enum format form;
float dlug;
char wyk[25];
char tyt[30];
enum gatunek gat;
}

Ogólnie jeśli chodzi o struktury to jestem laikiem i z góry dzięki za pomoc !!!

0
  1. Ta baza to ma być sql czy tylko taka lista rekordów wypełnionych w programie? jeśli to drugie to stwórz sobie plik tekstowy i odczytaj z niego dane.
  2. Wyszukiwanie jak to wyszukiwanie, musisz sprawdzać po kolei każdy rekord z listy czy spełnia podany warunek, np czy nazwa wykonawcy się zgadza, jeśli nie następny rekord, jeśli tak to znaleziono szukany rekord, inaczej chyba tego nie da się wymyślić, chociaż można jakoś zoptymalizować.
0

Tylko lista rekordów. Ale nwm jak odczytać dane i dać je do struktury?

0

Bo tak to po prostu tak wypisuje

struct songs s1;
struct songs s2;
struct songs s3;
struct songs s4;

s1.form =0;
s2.form =1;
s3.form =2;
s4.form =3;

s1.dlug =1.20;
s2.dlug =3.20;
s3.dlug =3.22;
s4.dlug =4.20;

s1.wyk ="Toto";
s2.wyk ="Jackson";
s3.wyk ="Travis Scott";
s4.wyk ="Pink Floyd";

^^^^ tu w sumie powinno byc strcpy^^^

0

Tylko czy mogę dać te s1 s2 s3 s4 jako tablice s[1] s[2] ... Jeśli tak to jak to zrobić?

0

Możesz jako tablice to zrobić, ale jest jeden problem jak zrobisz na typie tablicowym a[0] to iterujesz na wielkości tablicy, byś musiał wcześniej zrzutować na typ wskaźnikowy ewentualnie elementowy struktury jakoś (int)element i potem iterować.

0

Dobra ogarnałem tyle jakieś pomysły czemu szukacz nie działa ?

#include <stdio.h>
#include <stdlib.h>
#define MAX_SCIEZKA 256
#define MAX_TXT 128
#define BAB 5
const char* numopis(int i, const char** tab)
{
    return tab[i];
}

enum typp {MP3, WAV, WMA, OPUS};
const char* typOpisy[] = {"MP3", "WAV", "WMA", "OPUS"};

enum Gatunek {DISCO, CLASSIC, ROCK};
const char* gatOpisy[] = {"DISCO", "CLASSIC", "ROCK"};



struct plik{
    char sciezka[MAX_SCIEZKA];
    enum typp typ;
    float dlugosc;
    char wykonawca[MAX_TXT];
    char tytul[MAX_TXT];
    enum Gatunek gatunek;
};
void rekord(const struct plik* p){
printf("Scieżka %s\n",p->sciezka);
printf(" %s %s",p->wykonawca, p->tytul);
printf("Dlugosc %.2f minut",p->dlugosc);
printf("\n gatunek %s",numopis(p->gatunek,gatOpisy));
printf("\n format %s",numopis(p->typ,typOpisy));
}
void szukacz(float t, const struct plik* p){
int a;
for(a=0;a<BAB;a++){
    if(baza[a].dlugosc ==t);
    rekord(&baza[a]);

}
}

int main()
{

    int i;
    float t;

    const struct plik baza[] = {
        { "pulpit/muzyka/totoafrica0.wav",   WAV,  1,  "Toto", "Africa", DISCO   },
        { "pulpit/muzyka/jackson1.wav",   WAV,  2.4,  "Jackson", "Smooth", DISCO   },
        { "pulpit/muzyka/mask2.wav",   WAV,  1.5,  "Future", "Mask off", CLASSIC   },
        { "pulpit/muzyka/pink3.mp3",  MP3, 1.6,   "Pink Floyd", "High Hopes", ROCK   },
        { "pulpit/muzyka/bones4.mp3",   MP3,  1.8,   "Bones", "DIRT", CLASSIC   },
        { "pulpit/muzyka/y5.opus",   OPUS,  2.2,  "Ylivis", "Fox", CLASSIC   }
    };
    printf("Wpisz nr rekordu \n");
    scanf(" %d", &i);

    rekord(&baza[i]);

    printf("Poszukaj utworu po długości, wpisz długsc");
    scanf("%f", &t);






    return 0;
}

Sory za brak komentarzy w kodzie

0
Adam Smoliński napisał(a):
printf("Poszukaj utworu po długości, wpisz długsc");
    scanf("%f", &t);

    return 0;

Chodzi ci o to, że po wprowadzeniu wartości, po której chcesz szukać wychodzisz z maina i nic nie robisz?

0
void szukacz(float t, const struct plik* p){
int a;
for(a=0;a<BAB;a++){
    if(baza[a].dlugosc ==t);
    rekord(&baza[a]);

}
}

const struct plik *p
A baza ?

może p[a].dlugosc?

0

czy tam p[a]->dlugosc bo nie pamiętam kiedy jest -> a kiedy . :(

0

Ewentualnie const struct plik* p zamień na const struct plik* baza

0
void szukacz(float t, const struct plik* p)

na

void szukacz(float t, const struct plik* baza)
0

No i tak zaczałem i potem próbowałem recznie pododawać jakieś dane do struktury.

nie musisz koniecznie ręcznie. Kiedyś zrobiłem program, który wyszukiwał pliki mp3 na dysku i zczytywał z nich dane o wykonawcy/albumie/gatunku z tagów ID3:
https://pl.wikipedia.org/wiki/ID3

0

Ciekawy pomysł z tym wczytywanie danych z tagów ID3, ale nie wiem czy na poziomie "założyciela tematu".

Co do odczytywania z pliku txt to musisz sobie wymyślić jakiś sposób zapisywania danych w pliku i parsowania go w kodzie, np:
plik txt, np: piosnki.txt:

piosenka:
dlugosc: 3.25
nazwa: oda_do_radosci

piosenka:
dlugosc: 3.55
nazwa: oda_do_zlosci

widać "tagi" które opisują że dane dotyczą kolejnej piosenki "piosenka:", dlugosc piosenki "dlugosc:" oraz nazwę "nazwa";
przykładowy parser w c++ (sorry na c się nie znam za dobrze, mogą przerażać te wektory ale inaczej nie potrafię):

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

struct song
{
	float dlugosc;
	string tytul;
};

vector<song> wczytajRekordyzPliku(string nazwa)
{
	vector<song> piosenki;
	song a;
	float dlugoscPiosnki;
	string nazwaPiosnki;
	
	fstream plik;
	plik.open(nazwa.c_str(), ios::in);
	if (!plik.is_open()) cout << "nie udalo sie otworzyc pliku\n";
	
	string linia;
	while (!plik.eof())
	{
		plik >> linia;
		if (linia == "piosenka:")
			piosenki.push_back(a);
		else if (linia == "dlugosc:")
		{
			plik >> dlugoscPiosnki;
			piosenki[piosenki.size() - 1].dlugosc = dlugoscPiosnki;
		}
		else if (linia == "nazwa:")
		{
			plik >> nazwaPiosnki;
			piosenki[piosenki.size() - 1].tytul = nazwaPiosnki;
		}
	}
	
	plik.close();
	return piosenki;
}

int main(int argc, char *argv[])
{
	vector<song> songs = wczytajRekordyzPliku("piosnki.txt");
	
	for (const auto &s: songs)
	{
		cout << s.dlugosc << "\n";
		cout << s.tytul << "\n";
		cout << "\n";
	}
}

nazwy piosenek podaję z użyciem "_" np: oda_do_zlosci ponieważ pisanie ze spacją wymagało by dodatkowo użycia funkcji split i zamiast prostego przeładowanego operatora ">>" użycia funkcji getline.

std::vector<std::string> splitString(const std::string &string, std::string delim)
{
    std::vector<std::string> elems;

    std::string item;
    std::string str = string;
    unsigned int pos = 0;
    unsigned int size = delim.size();

    while(true)
    {
        item = str;
        pos = str.find(delim);
        if (pos > string.size())
        {
            elems.push_back(item);
            break;
        }
        item.erase(pos, str.size() - pos);
        str.erase(0, pos + size);
        elems.push_back(item);
    }

    return elems;
}

Dobra, wiem że to trudne, zawsze możesz wpisać na sztywno w kodzie, utworzyć tablicę takich struktur i na początku programu powypełniać danymi:

song songs[10];
	
songs[0].dlugosc = 3.23;
songs[0].tytul = "oda do radosci";
	
songs[1].dlugosc = 5.54l;
songs[1].tytul = "oda do zlosci";
	
// itd...

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