[ danijel_m @ 26.09.2006. 19:27 ] @
Lijepi pozdrav,

napravio sam program koji mi nakon što upišem znak koji tražim i riječ koju pretražujem ispiše koliko se taj znak puta pojavljuje...
Zanima me kako napraviti da program

Code:

#include <stdio.h>
#include <string.h>
#define SIZE 10

int count(char a[], char g)
{
    int i, b = 0, c = 1;
    for(i = 0; a[i] != '\0'; i++)
        if(a[i] == g) b += c;
    printf("\n Broj %c - ova = %d\n", g, b);
    return 0;
}

int main(void)
{
    char a[SIZE], g;
    int b;
    printf("\n Upisi slovo: "); g = getchar();
    printf("\n Upisi rijec: "); scanf("%s", a);
    
    count(a,g);
    return 0;
}

više ne radi na ovaj način nego da mi čita iz datoteke i upisuje u drugu datoteku... Nešto sam napravio, no program provrti (mislim ne javlja da ima grešaka u njemu), no ono što prebroji trebao bi upisati u drugu datoteku (naravno toga nema)...

Evo i kod što sam napravio... Sumnjam da mi nešto valja...

Code:

#include <stdio.h>
#define MAX 128
void ucitavanje (FILE *f, char M[MAX])
{
     int i;
     for (i=0; i='\0';i++)
     fscanf(f,"%c",&M[MAX]);
}


int count(char a[MAX], char g)
{
    int i, b = 0, c = 1;
    for(i = 0; a[i] != '\0'; i++)
        if(a[i] == g) b += c;
    printf("\n Broj %c - ova = %d\n", g, b);

}

int main(void)
{
     FILE *f,*h;
    char a[MAX],g;

    f=fopen("ispis.txt","r");
    ucitavanje(f,a);

    printf("Unesite slovo:");g=getchar();
    h=fopen("upis.txt","w");
    fprintf(h,"%d",count(a,g));
    fclose(h);
}



Unaprijed hvala na pomoći
[ Mali Misha @ 27.09.2006. 17:47 ] @
Koliko sam razumeo, treba da u jedan fajl upišeš koliko se puta neki simbol pojavljuje u nekom drugom fajlu. Ovde nije potrebno da ulazni fajl smestiš u memoriju, nego samo da ga pročitaš. Pak, ako vršiš više od jedne analize nad umereno velikim fajlom, učitavanje fajla u memoriju radi analize će poboljšati performanse.

Za sada, baci pogled na sledeću f-ju koja vraća broj pojavljivanja određenog simbola u nekom fajlu.

Code:
//netestirano
int count(const char*filename,char symbol)
{
    FILE *f = fopen(filename,"r");
    int n = 0;
    char c;

    if(f) // za slucaj da fajl nije bio otvoren
    {
        while(1)
        {
            c = fgetc(f);
            if(feof(f)) break;

            if(c == symbol) n++;
        }

        fclose(f);
    }

    return n;
}

Inače while petlja iz primera gore, bez drugog if, je jedan od načina da se pročita fajl od početka do kraja. Drugi malo kompaktniji je
Code:
    while((c = fgetc(f)) != EOF)
    {
        // ...
    }
[ toxi_programer @ 27.09.2006. 19:40 ] @
Code:

#include <stdio.h>
#define MAX 100000

void ucitavanje (FILE *f, char M[MAX])
{
     int i=0;
     while( (M[i++] = fgetc(f)) != EOF );
     fclose(f);
}


int count(char a[MAX], char g)
{
    int i, b = 0;
    for(i = 0; a[i] != '\0'; i++)
        if(a[i] == g) b++;
    printf("\n Broj %c - ova = %d\n", g, b);
    return b;


}

int main(void)
{
    FILE *f,*h;
    char a[MAX],g;

    f=fopen("text.txt","r");
    ucitavanje(f,a);

    printf("Unesite slovo:"); g = getchar(); fflush(stdin);

    h=fopen("upis.txt","w");
    fprintf(h,"%d",count(a,g));
    fclose(h);
}

/* scanf() ti nije radio jer si ga napisao tako da ucitava samo prvi znak iz fajla.*/

[ danijel_m @ 01.10.2006. 00:03 ] @
Hvala na pomoći no uspio sam ga riješiti...

U biti je sve isto...

Code:


#include <stdio.h>
#define MAX 128
int citaj(FILE *a, char g)
{
    int i,b=0;
    char c;
    c=fgetc(a);
    for(i=0; c != EOF; i++)
        {
            if (c==g)
                {
                    b++;
                }
            c=fgetc(a);
        }
    return b;
}
int main(void)
{
    FILE *a, *b;
    char g;
    int c;
    a=fopen("a.txt", "r");
    b=fopen("b.txt", "w");
    printf("daj slovo");
    scanf("%c",&g);
    c=citaj(a,g);
    fprintf(b,"%c %d",g,c);
    fclose(a);
    fclose(b);
}



Ne bih otvarao novi post, no možete li mi reći da li sam dobro napravio zadatak što sam imao na ispitu... Zadatak ide ovako:
Zadana je struktura:

struct vrijeme{
char temperatura;
char tlak;
struct vrijeme *next;
};

Treba napisati funkciju void najvecaTemperatura(vrijeme *a, vrijeme *b, vrijeme *c) koja će uspoređivati prve temperature (odnosi se na a i b) i veću će upisati u c...

Nadam se da nisam nesto preskocio... Čini mi se zadatak prejednostavan, a možda i griješim...

Ovako sam ga riješio:

Code:

void najvecaTemperatura(vrijeme *a, vrijeme *b, vrijeme *c)
{
     if(a->temperatura < b->temperatura)
     {
         c->temperatura = b->temperatura;
     }
     else
     {
         c->temperatura = a->temperatura;
     }
}


Hvala na pomoći