C/C++

  • Креатор на темата Креатор на темата Драган
  • Време на започнување Време на започнување
@Jokk
Koga ke gi predajs promenlivite, togas ti direktno pristavuvas do nivnite vrednosti i mozis da gi izmenuvas. Ti ovde koga ja povika Izmeni(c,b) gi izmeni samo vrednostite na c i b ,a 'a' (kako promenliva) si ostana isto, 2.
Znaci vo ovoj slucaj Izmeni( &a=c i &b=b ).
 
Треба да направам транслатор.Во хаш мапа со отворени кофички се внесува збор македонски па англиски.После тоа се внесува само англискиот збор и ако постои во хаш табелата го принтам а ако не принтам Hm
е сеа јас заглавив....
ако има некој што може да ми помогне би му бил многу благодарен
Код:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
#define    MEMCHECK(x) if(x==NULL) { printf("Nema memorija!\n"); exit(-1); }
 
typedef char * key_struct;
typedef char * value_struct;
 
typedef struct hashmap_element
{
    key_struct key;                      // kluc
    value_struct value;                  // vrednost
} hashmap_node;                // Definiranje element vo hash mapa
 
typedef struct element
{
    hashmap_node info;
    struct element *link;
} h_node;                        // Definiranje na element vo linearna lista (koficka) vo hash mapa
 
typedef h_node * h_nodep;
 
typedef struct obht
{
    int size;
    h_node ** buckets;          // niza od koficki
    int occupancy;                // broj na zafateni ili poranesno zafateni koficki
    hashmap_node *former;        // marker za jazel koj e izbrisan, no nema nov na negovo mesto
} hashmap;                    // Definiranje na hash mapa
 
void make_hash_map(hashmap *tptr, int n)  // inicijalizacija na hash mapa
{
    int i;
    tptr->buckets=(h_node **) calloc(n, sizeof(h_node *));
    // alokacija na memorija za nizata od koficki
    tptr->size=n;
    tptr->occupancy=0;
    tptr->former=(hashmap_node *) malloc(sizeof(hashmap_node));
    tptr->former->key=NULL;
    tptr->former->value=0;
    for(i=0;i<tptr->size;i++)
    tptr->buckets[i]=NULL;
}
 
int hashCode(key_struct key)
{
    return key[0]-'A';
}
 
int hash(key_struct key, hashmap *tptr)
{
    // funkcija koja presmetuva hash
    return hashCode(key)%(tptr->size);
}
 
int search(key_struct targetKey, hashmap *tptr)
// funkcija za prebaruvanje vo hash, go vraka indeksot na kofickata vo koj se naoga baraniot kluc
{
    int h;
    int n_search=0;
    h_node *p;
    h=hash(targetKey, tptr);
 
    for(;;)
    {
        p=tptr->buckets[h];
        if(p==NULL) return -1;
        else if((((p->info).key)!=tptr->former->key)&&(!strcmp((p->info).key, targetKey)))
            return h;
        else
        {
            h=(h+1)%(tptr->size);
            n_search++;
            if(n_search==tptr->size)
                return -1;
        }
    }
}
 
void insert(key_struct key, value_struct val, hashmap *tptr)
// funkcija za vnesuvanje vo hash
{
    h_node *old;
    int n_search=0;
    h_node *p;
    int h;
 
    h=hash(key, tptr);
    p=(h_node *) malloc(sizeof(h_node));  // alokacija za noviot jazel
    (p->info).value=val;
    (p->info).key=key;
 
    for(;;)
    {
        old=tptr->buckets[h];
        if(old==NULL)
        {
            if(++tptr->occupancy == tptr->size)
            {
                printf("Hash tabelata e polna!!!\n");
            }
            // se vnesuva noviot jazel vo kofickata h
            p->link=NULL;
            tptr->buckets[h]=p;
            return;
        }
        else if((((old->info).key)==tptr->former->key)||(!strcmp(key,(old->info).key)))
        {
            p->link=NULL;
            tptr->buckets[h]=p;
            return;
        }
        else
        {
            h=(h+1)%(tptr->size);
            n_search++;
            if(n_search==tptr->size)
                return;
        }
    }
}
 
void delete(key_struct key, hashmap *tptr)
// funkcija za brisenje na onie jazli so ist kluc kako dadeniot
{
    h_node *old, *last;
    int n_search=0;
    int h;
 
    h=hash(key,tptr);
 
    for (;;)
    {
        old=tptr->buckets[h];
        if(old==NULL)
            return;    // ako nema takvi jazli za brisenje
        else if(((old->info).key!=tptr->former->key)&&(!strcmp((old->info).key, key)))
        {
            (tptr->buckets[h]->info).key=tptr->former->key;
            (tptr->buckets[h]->info).value=tptr->former->value;
            //tptr->buckets[h]=NULL;
            //free(old);            // brisenje na jazel
            return;
        }
        else
        {
            h=(h+1)%(tptr->size);
            n_search++;
            if(n_search==tptr->size)
                return;
        }
    }
}
 
void print_h_node(h_node *p)
{
    printf("(%s,%s)",(p->info).key,(p->info).value);
}
 
void print_hashmap(hashmap *tptr)
{
    int i;
    h_node *p;
    for(i=0; i<tptr->size; i++)
    {
        printf("%d:",i);
        for(p=tptr->buckets[i]; p!=NULL; p=p->link)
            print_h_node(p);
        printf("\n");
    }
}
 
int main()
{
    hashmap *hashTabela=(hashmap *)malloc(sizeof(hashmap));
    int N,i;
    scanf("%d",&N);
    //--Sami ja postavuvate goleminata na hesh tabelata
    make_hash_map(hashTabela,N);
 
    char mkd[1000][100];
    char ang[1000][100];
    for(i=0; i<N; i++)
    {
        scanf("%s",mkd[i]);
        scanf("%s",ang[i]);
        insert(ang[i],mkd[i],hashTabela);
    }
    char chang[1000][100];
    i=0;
    while(scanf("%s", chang[i])){
        if(!strcmp("KRAJ",chang[i]))
            break;
        i++;
    }
    for(i=0;i<N;i++)
    {
        int tmp;
        tmp=search(chang[i],hashTabela);
        if(tmp==-1)
        {
            printf("Hm");
        }
        else
        {
            printf("%s",chang[i]);//ako e vaka gi printa istite zborovi kako da go najdam makedonskiot ?
        }
    }
    return 0;
}
 
Може е level n00b прашањево, али ајде :)


Зошто кога декларирам и иницијализирам низа од знаци (пошто нели C нема податочен тип string), и да нема доволно место за \0 терминаторот, пример:

Код:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char s1[3] = "foo";
    printf("%s\n", s1);
    system("PAUSE");
    return 0;
}

Должината на низата е 3, а нели на нејзе и фали уште едно место за \0 терминаторот. Како е можно ова да помине у компајлер и да не јави никаква грешка? Благодарам однапред :)
 
Ace-Snake
Епа таа функција search враќа број од 0 до N ако тој збор постои во табелата, а тој број значи во која кофичка е и затоа можеш вака :
Код:
printf("%s\n",hashTabela->buckets[i]->info.value)
--- надополнето: 17 декември 2012 во 20:01 ---
Boomerang

Реално да, треба да прави проблем но во овој случај и многу вакви слични прости пгограми не прави , не знам дали е до самото IDE или оперативниот систем вредноста после тоа е \0. А не јавува грешка бидејќи е C/C++ и се предпоставува дека знаеш што правиш, имаш слобода буквално како сакаш да играш со меморијата на компјутерот..
 
Може е level n00b прашањево, али ајде :)


Зошто кога декларирам и иницијализирам низа од знаци (пошто нели C нема податочен тип string), и да нема доволно место за \0 терминаторот, пример:

Код:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char s1[3] = "foo";
    printf("%s\n", s1);
    system("PAUSE");
    return 0;
}

Должината на низата е 3, а нели на нејзе и фали уште едно место за \0 терминаторот. Како е можно ова да помине у компајлер и да не јави никаква грешка? Благодарам однапред :)


Тоа обично поминува кај сите компајлери. Јас конкретно го пробав на gcc, на Ubuntu.
Меѓутоа кога ќе го извршиш кодот обично дава неправилни резултати, затоа што програмата не знае до каде е низата, иако ти при декларацијата си навел [3]. Дури и да извршиш strlen не очекувај да ти врати должина 3. Затоа нека биде пракса при користење на стрингови во C дефинирањето да биде на еден од овие начини:
Код:
/* vaka kompajlerot sam ja odrduva dolzinata
na stringot i dodava \0 na kraj. */
char str[] = "foo";
 
/*Ili koristi pointer kon niza od znaci */
char *str = "foo";
 
Тоа обично поминува кај сите компајлери. Јас конкретно го пробав на gcc, на Ubuntu.
Меѓутоа кога ќе го извршиш кодот обично дава неправилни резултати, затоа што програмата не знае до каде е низата, иако ти при декларацијата си навел [3]. Дури и да извршиш strlen не очекувај да ти врати должина 3. Затоа нека биде пракса при користење на стрингови во C дефинирањето да биде на еден од овие начини:
Код:
/* vaka kompajlerot sam ja odrduva dolzinata
na stringot i dodava \0 na kraj. */
char str[] = "foo";
 
/*Ili koristi pointer kon niza od znaci */
char *str = "foo";

Да да, знам, фала, само ме интересираше зошто тој конкретен случај поминува и не јавува никаков error :).
 
Ace-Snake
Епа таа функција search враќа број од 0 до N ако тој збор постои во табелата, а тој број значи во која кофичка е и затоа можеш вака :
Код:
printf("%s\n",hashTabela->buckets[i]->info.value)
--- надополнето: 17 декември 2012 во 20:01 ---
Boomerang

Реално да, треба да прави проблем но во овој случај и многу вакви слични прости пгограми не прави , не знам дали е до самото IDE или оперативниот систем вредноста после тоа е \0. А не јавува грешка бидејќи е C/C++ и се предпоставува дека знаеш што правиш, имаш слобода буквално како сакаш да играш со меморијата на компјутерот..

ја среви фала многу,инаку треба од тоа buckets[tmp],оти ако е од i ги врака како се по ред внесувани ;)
 
Некој да ми препорача некој материјал каде што подетално се разглабаат датотеки? Независно дали е на Англиски или Македонски. Пошто предавањава од факс се премногу сувопарни, и се е некако шаблонски нафрлано, а ништо не е длабоко објаснето.
 
Ако може помош околу оваа задача
1. Од тастатура се внесува квадратна матрица од цели броеви, каде што димензиjaта на матрицата m исто така се внесува од тастатура и не е поголема од 100. Да се трансформира матрицата на следниов начин: ако збирот на елементите над споредната дијагонала е поголем од збирот на елементите под споредната дијагонала, тогаш елементите од матрицата над споредната дијагонала да си ги заменат местата со елементите под споредната дијагонала симетрично во однос на споредната дијагонала. Новодобиената матрица да се испечати на компјутерскиот екран.“

Не мора конкретно за оваа матрица туку ме интересира логиката за испитување на вакви ствари со споредната дијагонала кои се условите. За главната ја знам логиката али ова никако неможам да го сватам :)
 
kiko_juve

Елементите што се на споредна дијагонала се добиваат со условот i+j == n-1
тие што се над споредна дијагонала : i+j < n-1
и за тие под : i+j > n-1
 
И за замена после кога ке правиш
a[j] треба да го смениш со a[n-j-1][n-i-1], тие ти се симетрични по споредна дијагонала.
 
Абе, а постои некој софтвер со којшто можам да видам кои се променливи се наоѓаат моментално во RAM? :P
 

Kajgana Shop

Back
На врв Bottom