Anonymní profil Antonín Smékal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Antonín Smékal – Programujte.comAnonymní profil Antonín Smékal – Programujte.com

 

Příspěvky odeslané z IP adresy 185.199.85.–

Antonín Smékal
C / C++ › Hashovací tabulka se separát…
3. 5. 2018   #220650

#2 gna
Děkuji za odpověď, nešlo by to ale udělat bez použití vektorů. Vektory jsme ještě neměli nevím jestli by mi to uznali tu úlohu.

Antonín Smékal
C / C++ › Hashovací tabulka se separát…
3. 5. 2018   #220645

Dobrý den, máme za úkol navrhnout hashovací tabulku kde se kolize řeší zřetězením. Hashovací tabulku se mi povedlo funkčně sestavit, ale k tomu máme ještě udělat průměr a maximum uložených seznamů. Chtěl bych se Vás tedy zeptat zda byste mi neporadili jak na to. Předem děkuji za Váš čas. 

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

#define min 5
#define max 20
#define M 10007
#define M2 10000

void InsertHash(char* str,unsigned int length,unsigned int i);
bool SearchHash(char* str,unsigned int length,unsigned int i);

struct ListItems
		{
			char* data;
			ListItems* next;
			ListItems* prev;
		};

struct List
{

		ListItems* head;

        List()
        {
            head = NULL;
        }


		bool Search(char* x)
		{
            ListItems* p;
            for (p = head; p != NULL; p = p->next)
                if (p->data == x)
                    return true;

            return false;
        }

		unsigned int  Insert(char *x)
            {

                    ListItems* p;
                    p = new ListItems;
                    p->data = x;
                    p->next = head;
                    if (head != NULL)
                        head->prev = p;
                    head = p;
                    p->prev = NULL;

            }

};

List HashTable[M];
List HashTable2[M2];

unsigned int DJBHash(const char* str,unsigned int length)
{
   unsigned int hash = 5381;
   unsigned int i    = 0;

   for (i = 0; i < length; ++str, ++i)
   {
      hash = ((hash << 5) + hash) + (*str);
   }

   return hash%M;

}

void InsertHash(char* str,unsigned int length ,unsigned int i )
{
	unsigned int hashKey = DJBHash(str,length);
	if(i==1)
        HashTable[hashKey].Insert(str);
    else if(i==2)
        HashTable2[hashKey].Insert(str);
}
bool SearchHash(char* str,unsigned int length,unsigned int i)
{
	unsigned int hashKey = DJBHash(str,length);
	if(i==1)
        return HashTable[hashKey].Search(str);
    if(i==2)
        return HashTable2[hashKey].Search(str);
}


char *stri(unsigned int length)
{
    static const char letters[] = "abcdefghijklmnopqrstuvwxyz";
	char *s = (char*)malloc((length + 1) * sizeof(char));
	for (unsigned int i = 0; i < length; ++i)
	{
		s[i] = letters[rand() % (sizeof(letters) - 1)];

	}

	s[length] = '\0';
	return s;


}

int tab1(void)
{
    unsigned int length,i,j,c;
    char *str;


	for (i = 0; i < 5004; i++)
	{
		length = min + rand() % (max + 1 - min);
        str = stri(length);

		if(SearchHash(str,strlen(str),1)==false)
        {
            InsertHash(str,strlen(str),1);

        }


	}

   for (i = 0; i < 2501; i++)
    {
        length = min + rand() % (max + 1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),1)==false)
        {

            InsertHash(str,strlen(str),1);
        }



    }

     for (i = 0; i <2502 ; i++)
    {
        length = min + rand() % (max + 1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),1)==false)
        {
            InsertHash(str,strlen(str),1);
        }



    }

    for (i = 0; i <2502 ; i++)
    {
        length = min + rand() % (max + 1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),1)==false)
        {
            InsertHash(str,strlen(str),1);
        }



    }
    return 1;
}
int tab2(void)
{
    unsigned int length,i,j,c;
    char *str;

	for (i = 0; i < 5000; i++)
	{
		length = min + rand() % (max + 1 - min);
        str = stri(length);
		if(SearchHash(str,strlen(str),2)==false)
        {
            InsertHash(str,strlen(str),2);
        }

	}

   for (i = 0; i < 2500; i++)
    {
        length = min + rand() % (max+1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),2)==false)
        {
            InsertHash(str,strlen(str),2);
        }



    }

     for (i = 0; i <2500 ; i++)
    {
        length = min + rand() % (max + 1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),2)==false)
        {
            InsertHash(str,strlen(str),2);
        }



    }

    for (i = 0; i <2500 ; i++)
    {
        length = min + rand() % (max + 1 - min);
        str = stri(length);
        if(SearchHash(str,strlen(str),2)==false)
        {
            InsertHash(str,strlen(str),2);
        }



    }
    return 1;
}

int main()
{
    srand(time(0));
    tab1();
    tab2();

	return 0;
}
Antonín Smékal
C / C++ › Třídění zlomků
4. 3. 2018   #219874

#4 KIIV
Z je v tom souboru include "Uloha3", je to strukturovaný datový typ pro uložení
zlomku - struct Zlomek Z[]={15,11 ...}. P.S. za ty velké proměnné nemůžu já(radši používám přesné názvy, protože pokud použiji obecné proměnné pak se v tom nemůžu vyznat), ale učitel jazyka C, ten to tak chtěl. Jinak děkuji za rady. 

Antonín Smékal
C / C++ › Třídění zlomků
4. 3. 2018   #219870

Dobrý den, mám za úkol naprogramovat funkci, která setřídí zlomky, v té funkci void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek)), je ukazatel na funkci S, která bere dva parametry Struct Zlomek a struct Zlomek. Akorát když ji potom během třídění zavolám S(D[i].citatel,D[j].jmenovatel) tak mi to vyhodí chybu, že argument typu unsigned int je nekompatibilní s typem struct Zlomek. Mohli byste mě takříkajíc trošku "postričit" vpřed abych věděl co mám špatně a jak to opravit předem děkuji.

#include <stdio.h>
#include "Uloha3"
#include<conio.h>
#include<stdlib.h>


void Vypsat(struct Zlomek Z[], int n);
void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek));
char Vetsi(struct Zlomek z1, struct Zlomek z2);
char Mensi(struct Zlomek z1, struct Zlomek z2);

void main(void)
{
	Vypsat(Z, Pocet);
	printf("\n");
	Tridit(Z, Pocet, Vetsi);
	Vypsat(Z, Pocet);
	//Tridit(Z, Pocet, Mensi);
	//Vypsat(Z, Pocet);
	getchar();
	getchar(); 
}


void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek))
{
	
	
	
		for (int i = 0; i < n - 1; i++)
		{
			for (int j = 0; j < n - i - 1; j++)
			{
				if (S(D[i].citatel,D[j].jmenovatel)==1) 
				{
					struct Zlomek t = D[j + 1];
					D[j + 1] = D[j];
					D[j] = t;
				}
			}
		}

	



}

char Vetsi(struct Zlomek z1, struct Zlomek z2)
{
	if (z1.citatel*z2.jmenovatel > z2.citatel*z1.jmenovatel)
		return 1;
	else
		return 0;
}

char Mensi(struct Zlomek x1, struct Zlomek x2)
{
	if (x1.citatel*x2.jmenovatel < x2.citatel*x1.jmenovatel)
		return 1;
	else
		return 0;
}

void Vypsat(struct Zlomek Z[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%d/%d ", Z[i]);
	}
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý