pamat v C

Programovacie jazyky, rady, poradňa...
Maniac89
Novice
Novice
Príspevky: 9
Registrovaný: 06 jan 2007, 15:44

pamat v C

Príspevok od používateľa Maniac89 »

mam takyto nejaky program(neviem ci je dobry :D).., ktory funguje tak, ze zadam nejake udaje a ich dam potom zobrazit..zobrazi mi ich, ale ak pridam dalsi zaznam tak mi prepise tie predchadzajuce udaje...vlastne chcem aby to fungovalo tak, ze ak zadam dalsi zaznam, aby tam zostal aj ten prvy...viete mi poradit ako to mam urobit? thanx :wink:

Kód: Vybrať všetko

#include <stdio.h>
#include <malloc.h>
#include <conio.h>
 
#define MAX_SIZE_MENO 20
#define MAX_SIZE_PRIEZV 30
#define MAX_SIZE_NAZOV 20
#define MAX_SIZE_VYDAVATELSTVO   20


typedef struct osoba { char *meno;
                       char *priezvisko;
                       char *nazov;
                       char *vydavatelstvo;
                       int rokvyd;
                       int cislo;
                     } PERSON;             
                     
void pridaj(void);
void zobraz(void);

static PERSON *os[10];
int i;

void pridaj(void)
{


   
   os[i] = (PERSON*) malloc(sizeof(PERSON));

   
   os[i]->meno = (char*) malloc(MAX_SIZE_MENO*sizeof(char));
   os[i]->priezvisko = (char*) malloc(MAX_SIZE_PRIEZV*sizeof(char));
   os[i]->nazov = (char*) malloc(MAX_SIZE_NAZOV*sizeof(char));
   os[i]->vydavatelstvo = (char*) malloc(MAX_SIZE_VYDAVATELSTVO*sizeof(char));
   
   printf("Meno autora: ");             
   scanf("%s",os[i]->meno);

   printf("Priezvisko autora: ");        
   scanf("%s",os[i]->priezvisko);

   printf("Nayov knihy: ");       
   scanf("%s",os[i]->nazov);

   printf("Rok vydania: ");     
   scanf("%d",&os[i]->rokvyd);
   
   printf("Vydavatelstvo: ");       
   scanf("%s",os[i]->vydavatelstvo);
   
   printf("Evidencne cislo: ");    
   scanf("%d",&os[i]->cislo);
   
}

void zobraz(void)
{
   
   printf(" Meno a priezvisko: %s %s\n", os[i]->meno, os[i]->priezvisko);
   printf(" Nazov: %s\n", os[i]->nazov);
   printf(" Rok vydania: %d\n", os[i]->rokvyd);
   printf(" Vydavatelstvo: %s\n", os[i]->vydavatelstvo);
   printf(" Evid. Cislo: %d\n", os[i]->cislo);

}

int main()
{
    int a;
    
    printf("1. Pridaj");
    printf("\n2. Ukaz");
    printf("\nZadaj:");
    scanf("%d",&a);
    if(a==1)
    {
            pridaj();
            main();
}
else if(a==2)
{
        zobraz();
        main();
        }
        else
        exit(0);
    
 getch();
}
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Mierne modifikovane. :)

Kód: Vybrať všetko

#include <stdio.h> 
#include <malloc.h> 
#include <conio.h> 
  
#define MAX_SIZE_MENO 20 
#define MAX_SIZE_PRIEZV 30 
#define MAX_SIZE_NAZOV 20 
#define MAX_SIZE_VYDAVATELSTVO   20 
#define MAX_PEOPLE 10

#define CLRSCR system("cls")


typedef struct osoba { char *meno; 
                       char *priezvisko; 
                       char *nazov; 
                       char *vydavatelstvo; 
                       int rokvyd; 
                       int cislo; 
                     } PERSON;              
                      
void pridaj(void); 
void zobraz(void); 

void pridaj(PERSON *os[], int i) 
{ 
   os[i] = (PERSON*) malloc(sizeof(PERSON));     
   os[i]->meno = (char*) malloc(MAX_SIZE_MENO*sizeof(char)); 
   os[i]->priezvisko = (char*) malloc(MAX_SIZE_PRIEZV*sizeof(char)); 
   os[i]->nazov = (char*) malloc(MAX_SIZE_NAZOV*sizeof(char)); 
   os[i]->vydavatelstvo = (char*) malloc(MAX_SIZE_VYDAVATELSTVO*sizeof(char)); 
    
   printf("Meno autora: ");              
   scanf("%s",os[i]->meno); 

   printf("Priezvisko autora: ");        
   scanf("%s",os[i]->priezvisko); 

   printf("Nayov knihy: ");        
   scanf("%s",os[i]->nazov); 

   printf("Rok vydania: ");      
   scanf("%d",&os[i]->rokvyd); 
    
   printf("Vydavatelstvo: ");        
   scanf("%s",os[i]->vydavatelstvo); 
    
   printf("Evidencne cislo: ");    
   scanf("%d",&os[i]->cislo); 
} 

void zobraz(PERSON *os[], int i) 
{ 
     int j;
     
     for (j = 0; j < i; j++) {
        printf("\n Meno a priezvisko: %s %s\n", os[j]->meno, os[j]->priezvisko); 
        printf(" Nazov: %s\n", os[j]->nazov); 
        printf(" Rok vydania: %d\n", os[j]->rokvyd); 
        printf(" Vydavatelstvo: %s\n", os[j]->vydavatelstvo); 
        printf(" Evid. Cislo: %d\n", os[j]->cislo); 
     }
} 

int main(void) 
{ 
    int a, i = 0;
    PERSON *os[MAX_PEOPLE]; 
    
    while (1) {
          printf("Zadaj:\n");
          printf("1. Pridaj\n"); 
          printf("2. Ukaz\n"); 
          printf("3. Koniec\n");
      
          a = getch(); 
          
          switch (a) {
             case '1':
                  if (i <= MAX_PEOPLE) {
                     pridaj(os, i); 
                     i++;
                  } else {
                    printf("Plne pole.\n");
                    getch();
                    return 1;
                  }
                  break;
             case '2':
                  zobraz(os, i); 
                  getch();
                  break; 
             case '3': 
                  return 0;
          }
          
          CLRSCR;
    }
}

Maniac89
Novice
Novice
Príspevky: 9
Registrovaný: 06 jan 2007, 15:44

Príspevok od používateľa Maniac89 »

no takto som si to predstavoval..dakujem ti :) :wink:
neppo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 774
Registrovaný: 09 jún 2005, 15:33

Príspevok od používateľa neppo »

podla mna by sa to jednoduchsie riesilo cez smerniky ako cez staticke pole :)
Maniac89
Novice
Novice
Príspevky: 9
Registrovaný: 06 jan 2007, 15:44

Príspevok od používateľa Maniac89 »

a dalo by sa este urobit tak, ze ak zadam poradove cislo zaznamu, ktory chcem odstranit..a odstrani mi ho ?
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

neppo napísal:podla mna by sa to jednoduchsie riesilo cez smerniky ako cez staticke pole :)
S pointermi by to bolo praveze imho komplikovanejsie, avsak pocet vlozenych prvkov by nebol obmedzeny.
Maniac89 napísal:a dalo by sa este urobit tak, ze ak zadam poradove cislo zaznamu, ktory chcem odstranit..a odstrani mi ho ?
Samozrejme, ze hej, napr. ak chces zmazat treti prvok pola, tak si zoberies posledny a prekopirujes ho do tretieho, pricom zmensis premennu udavajucu aktualny pocet prvkov v poli(nezachova sa ti vsak poradie, v akom boli prvky vkladane).
neppo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 774
Registrovaný: 09 jún 2005, 15:33

Príspevok od používateľa neppo »

ano mas pravdu pointre su komplikovanejsie ale ako si napisal mozes mat neobmedzeny pocet ( teda v zavislosti od pamate ). ale na druhej strane sa niekedy pointery hodia ovela viac do programu
Maniac89
Novice
Novice
Príspevky: 9
Registrovaný: 06 jan 2007, 15:44

Príspevok od používateľa Maniac89 »

neutronmind napísal:Samozrejme, ze hej, napr. ak chces zmazat treti prvok pola, tak si zoberies posledny a prekopirujes ho do tretieho, pricom zmensis premennu udavajucu aktualny pocet prvkov v poli(nezachova sa ti vsak poradie, v akom boli prvky vkladane).
pls, nemohol by si mi napisat ako by sa to dalo urobit?..skusam to, no nejak mi to stale nejde,tak ako ma :?
bbeni
Novice
Novice
Príspevky: 3
Registrovaný: 29 apr 2009, 20:47

Príspevok od používateľa bbeni »

je to staticke pole a dynamická velkost? :(
Miskok
Amateur
Amateur
Príspevky: 28
Registrovaný: 18 mar 2007, 16:50
Bydlisko: BB - KE

Príspevok od používateľa Miskok »

Maniac89 napísal:pls, nemohol by si mi napisat ako by sa to dalo urobit?..skusam to, no nejak mi to stale nejde,tak ako ma :?
bolo by ale dobre aj ukazat co si tam doplnil aby sa dalo povedat preco ti to nejak nejde ako ma ..

>bbeni

ano
Maniac89
Novice
Novice
Príspevky: 9
Registrovaný: 06 jan 2007, 15:44

Príspevok od používateľa Maniac89 »

..uz sa mi podarilo vyriesit to odstranovanie poloziek... :)

potreboval by som pomoct s dalsim kodom..kde mam naprogramovane triedenie zadanych mien podla abecedy..ako by sa to dalo urobit tak, aby mi to zotriedilo podla dlzky retazca, cize mena (vzostupne aj zostupne)? :?

Kód: Vybrať všetko

#include <stdio.h>
#include <string.h>
#include <conio.h> 

void sort(char**, int);    

main()
{
  char ret[50][20], *px[50];
  int n, i;

  printf("Zadaj pocet osob: ");       
  scanf("%d", &n);


  for(i=0; i<n; i++)
   {
      printf("\n %d . meno : ", i + 1);
      scanf("%s", ret[i]);               
      px[i] = ret[i];                   
   }
  sort(px,n);     

  for(i=0; i<n; i++)
      printf("\n %s  %s", ret[i], px[i]);
      getch();
}

void sort(char **px, int n)
{
  int i, j;
  char *pom;      

  for(i=0; i<n-1; i++)
  {
    for(j=i+1; j<n; j++)
    {
      if (strcmp(*(px + j), *(px + i)) < 0)   
       {
         pom = *(px + i);
         *(px + i) = *(px + j);
         *(px + j) = pom;
       }
    }
  }
}
bbeni
Novice
Novice
Príspevky: 3
Registrovaný: 29 apr 2009, 20:47

pomoc

Príspevok od používateľa bbeni »

ako mas spravene vyhladavanie a odstranenie :roll:
Napísať odpoveď