prosty program w C

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
kamil1cos7
Piegowaty Guziec
Piegowaty Guziec
Posty: 23
Rejestracja: 22 lis 2010, 23:01
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

prosty program w C

Post autor: kamil1cos7 »

Cześć, mam kłopot z rozszyfrowanie błędnego działania następującego programu:
fkwadr.c -o fkwadr -lm
Problem polega na tym że, oblicza zawsze w funkcji obl_pier warunek dla Del = 0, a w funkcji wypisz, wypisuje warunek dla Del > 0...

Kod: Zaznacz cały

#include <stdio.h>
#include <math.h>

////////////////////////////////////////////////////////////////////////////////////////////////////

float* podaj_wsp(float *);
float delta(float *, float);
float* obl_pier(float *, float, float *);
void wypisz(float *, float);

////////////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
        float wsp[3], del, mz[2];

        podaj_wsp(wsp);
        delta(wsp, del);
        obl_pier(wsp, del, mz);
        wypisz(mz, del);

        return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////

float* podaj_wsp(float *wspol)
{
        int i;
        printf("Podaj wspolczyniki rownania kwadratowego\npostaci a1*x^2 + a2*x + a3 = 0\n\n");
        for(i=1; i<4; i++)
        {
                printf("a%i = ", i);
                scanf("%f", &wspol[i-1]);
                printf("\n");
        }
        return wspol;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

float delta(float *wspol, float Del)
{
        Del = wspol[1]*wspol[1] - 4*wspol[0]*wspol[2];
        printf("Delta rownania jest rowna: %.2f\n", Del);

        return Del;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

float* obl_pier(float *wspol, float Del, float *pierw)
{
        if(Del > 0)
        {
                pierw[0] = (-wspol[1]-sqrt(Del))/(2*wspol[0]);
                pierw[1] = (-wspol[1]+sqrt(Del))/(2*wspol[0]);
        }
        else if(Del == 0)
        {
                pierw[0] = -wspol[1]/(2*wspol[0]);
        }
        else
        {
                printf("Delta mniejsza od 0\n");
        }
        return pierw;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void wypisz(float *pierw, float Del)
{
        if (Del > 0)
        {
                printf("Rownanie posiada dwa pierwiastki rzeczywiste\nx1 = %.2f\tx2 = %.2f\n",pierw[0],pierw[1]);
        }
        else if (Del == 0)
        {
                printf("Rownanie posiada jeden podwojny pierwiastek rzeczywisty: %f.2\n", pierw[0]);
        }
        else
        {
                printf("Rownanie nie posiada pierwsiatków rzeczywistych\n");
        }
}
Awatar użytkownika
brezniew
Przyjaciel
Przyjaciel
Posty: 2680
Rejestracja: 12 kwie 2011, 16:48
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86_64

Re: prosty program w C

Post autor: brezniew »

Zmień tytuł tematu tak, aby w sposób możliwie precyzyjny przedstawiał sedno sprawy, w której piszesz. Miej na uwadze również zgodność z REGULAMINEM
Tytuł tematu zmienisz edytując pierwszy post
W razie wątpliwości/zastrzeżeń odnośnie powyższej informacji skontaktuj się z moderatorem, który ją wstawił.

Używaj znacznika CODE.
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Re: prosty program w C

Post autor: Struchu »

Jak obliczasz deltę, to jej wartość jest zwracana w funkcji, ale nigdzie jej nie zapisujesz (więc w zmiennej Del w funkcji main masz jakieś śmieci z pamięci). W funkcji main powinno być:

Kod: Zaznacz cały

del = delta(wsp, del)
kamil1cos7
Piegowaty Guziec
Piegowaty Guziec
Posty: 23
Rejestracja: 22 lis 2010, 23:01
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: prosty program w C

Post autor: kamil1cos7 »

Racja... Czyli w sumie powinno to wyglądać tak:

Kod: Zaznacz cały

del = delta(wsp)
Teraz mam nowy problem, bo próbowałem podzielić ten program na pliki z rozszerzeniem .h
Wiec definicje każdej funkcji z osobna umieściłem w plikach z rozszerzeniem .c a ich deklaracje w plikach z rozszerzeniem .h i w pliku z funkcją main umieściłem np:

Kod: Zaznacz cały

#include "wypisz.h"
Tylko przy kompilacji zwracany jest następujący błąd...

Kod: Zaznacz cały

/tmp/ccLnSPFH.o: In function `main':
main.c:(.text+0x11): undefined reference to `podaj_wsp'
main.c:(.text+0x1d): undefined reference to `delta'
main.c:(.text+0x3d): undefined reference to `obl_pier'
main.c:(.text+0x51): undefined reference to `wypisz'
collect2: ld returned 1 exit status
w którym miejscu popełniam błąd??
Razi
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 150
Rejestracja: 20 paź 2007, 16:23
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Kontakt:

Re: prosty program w C

Post autor: Razi »

Musisz skompilować oba pliki .c i je skonsolidować
np. gcc main.c lib.c -o program
ew. chyba zadziała gcc *.c -o program, ale nie jestem pewien.

Albo użyć jakiegoś IDE i stworzyć projekt.
Awatar użytkownika
karmelek
Przyjaciel
Przyjaciel
Posty: 883
Rejestracja: 10 lut 2007, 17:45
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: prosty program w C

Post autor: karmelek »

Ewentualnie makefile mu zrobić i też powinno pójść
Awatar użytkownika
NoName_1990
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 28 lut 2007, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86

Re: prosty program w C

Post autor: NoName_1990 »

Kod: Zaznacz cały

#kompilacja poszczególnych fragmentów programu
gcc -c -o lib.o lib.c
...
gcc -c -o main.o main.c
#łączenie ich w całość
gcc -o program lib.o main.o
Makefile:

Kod: Zaznacz cały

default: all

all: compile link

compile:
	gcc -c -o lib.o lib.c
	gcc -c -o main.o main.c

link:
	gcc -o program lib.o main.o

clean-all: clean

clean: clean-objects clean-output

clean-objects:
	rm -f *.o

clean-output:
	rm -f program
kamil1cos7
Piegowaty Guziec
Piegowaty Guziec
Posty: 23
Rejestracja: 22 lis 2010, 23:01
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: prosty program w C

Post autor: kamil1cos7 »

Kurde nie wiem czemu w funkcji add_stud nie mogę wpisać tego imienia, po pobraniu choice_1 program kończy działanie... a jeśli zakomentuje linijkę gdzie pobieram choice_1 to działa i mogę wpisać imię. Tylko że, potrzebne mi jest pobranie tego choice_1...

Kod: Zaznacz cały

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

typedef struct
{
        char imie[20];
        char nazwisko[20];
        float oceny[10];
} student;

void estud(void);
student add_stud();
int wyb(void);

student *nr;

int main(void)
{
        if(wyb() == 1)
        {
        estud();
        }
        else
        return 0;
}

void estud()
{
        nr = malloc(sizeof(student));
        add_stud();

}

student add_stud()
{
        static int step;

        fputs("Podaj imie: \n", stdout);
        fgets(nr[step].imie, sizeof(nr[step].imie), stdin);
        puts(nr[step].imie);

        return nr[step];
}

int wyb()
{
        int choice_1 = 1;
        printf("1-Dodaj studenta\n2-Usun studenta\n3-Dopisz ocene studentowi\n4-Wyjdz\n");
        scanf("%i", &choice_1);

        return choice_1;
}

-- 02 sie 2011 18:36 --

Kurde nie wiem czemu w funkcji add_stud nie mogę wpisać tego imienia, po pobraniu choice_1 program kończy działanie... a jeśli zakomentuje linijkę gdzie pobieram choice_1 to działa i mogę wpisać imię. Tylko że, potrzebne mi jest pobranie tego choice_1...

Kod: Zaznacz cały

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

typedef struct
{
        char imie[20];
        char nazwisko[20];
        float oceny[10];
} student;

void estud(void);
student add_stud();
int wyb(void);

student *nr;

int main(void)
{
        if(wyb() == 1)
        {
        estud();
        }
        else
        return 0;
}

void estud()
{
        nr = malloc(sizeof(student));
        add_stud();

}

student add_stud()
{
        static int step;

        fputs("Podaj imie: \n", stdout);
        fgets(nr[step].imie, sizeof(nr[step].imie), stdin);
        puts(nr[step].imie);

        return nr[step];
}

int wyb()
{
        int choice_1 = 1;
        printf("1-Dodaj studenta\n2-Usun studenta\n3-Dopisz ocene studentowi\n4-Wyjdz\n");
        scanf("%i", &choice_1);

        return choice_1;
}

Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: prosty program w C

Post autor: beluosus »

Nie miesza się różnych funkcji do pisania, a zwłaszcza do czytania. Trzymaj się jednej konwencji: printf-scanf, fputs-fgets... To zmniejsza ryzyko wystąpienia błędu. Drugą opcją jest użycie fflush(stdin) między scanfem, a fgetsem (najlepiej tuż po jednym, albo tuż przed drugim).

Btw, main() nic nie zwraca w przypadku spełnienia if, po drugie nie zwalniasz pamięci (ale to pewnie przez wczesną fazę programu ;)).
kamil1cos7
Piegowaty Guziec
Piegowaty Guziec
Posty: 23
Rejestracja: 22 lis 2010, 23:01
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: prosty program w C

Post autor: kamil1cos7 »

Tak, to dopiero zalążek :P Dzięki za podpowiedź;)

-- 04 sie 2011 17:09 --

Znowu mam kłopot z tym programem. Jakby się komuś chciało przeglądnąć to było by fajnie.
Generalnie chodzi o to w funkcji wypisz() wypisuje mi tylko dla pierwszego studenta oceny a dla drugiego już nie...
Nie mogę obczaić gdzie jest błąd;/

Kod: Zaznacz cały

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

#include "mygetch.h"

typedef struct
{
        char imie[20];
        char nazwisko[20];
        float oceny[11];
        float srednia;
} student;

void wypisz(student *);
void estud(void);
student add_stud();
int wyb(void);
int menu_1(void);
void dodaj_ocene();
int il_el_tab(float *);

student *nr;
void *tmp;
int step, il_ocen;

int main(void)
{
        if(menu_1() == 1)
        {
        estud();
        }

        else
        return 0;
}

int menu_1(void)
{
        int i;
        printf("\n1- Edycja studentow\n2- Zakoncz program\n");
        i = mygetch();
        return (i-48);
}

void estud(void)
{
        int level = 0;
        nr = malloc(sizeof(student));
        while(level < 4)
        {
                wypisz(nr);
                level = wyb();

                if(level == 1)
 {
                        add_stud();
                }
                else if(level == 2)
                {

                }
                else if(level == 3)
                {

                }
        }
}

student add_stud(void)
{
        if(!step)
        {
                printf("Imie: \t");
                scanf("%s", nr[step].imie);

                printf("Nazwisko: \t");
                scanf("%s", nr[step].nazwisko);

                dodaj_ocene();

        }
        else if(step)
        {
                tmp = realloc(nr, (step+1) * sizeof(student));
                nr = tmp;
                printf("Imie: \t");
                scanf("%s", nr[step].imie);

                printf("Nazwisko: \t");
                scanf("%s", nr[step].nazwisko);

                dodaj_ocene();
        }

        step++;

        return nr[step];
}

int wyb()
{
        int choice_1;
        printf("\n\n1-Dodaj studenta\n2-Usun studenta\n3-Dopisz ocene studentowi\n4-Wyjdz\n\n");
        choice_1 = mygetch();

        return (choice_1 - 48);
}

void wypisz(student *dane)
{
        int x, i;
        if(step)
        {
                printf("\nNR:\tImie:\t\tNazwisko:\tOceny:\n");
                for(x = 0; x < step ; x++)
                {
                //      printf("step = %i", step);
                        printf("\n%d.\t%s\t\t%s\t\t", x+1, nr[x].imie, nr[x].nazwisko);
                        for(i=0; i < il_el_tab(nr[x].oceny); i++)
                        {
                                printf("%.1f  ", nr[x].oceny[i]);
                        }
                }
        }
        else if(!step)
        {
                printf("\nBrak zapisanych studentow!\n");
        }
}

void dodaj_ocene()
{
        int choice_2 = 0;
        static int i;
        printf("\n1.Dodaj ocene\n2.Zakocz\n");

        while(choice_2 < 2)
   {
                choice_2 = (mygetch() - 48);
                switch(choice_2)
                {
                        case 1:
                                printf("Ocena: \t");
                                scanf("%f", &nr[step].oceny[il_ocen]);
                                il_ocen++;
                                break;
                        case 2:
                                break;
                }
        }
}

int il_el_tab(float *tab)
{
        int ilosc = 0;

        while(tab[ilosc] != 0)
        {
                ilosc++;
        }

        return ilosc;
}
-- 08 sie 2011 11:49 --

Cześć, w sumie tamten problem rozwiązałem inaczej a dlaczego ten wcześniejszy kod nie działał to nie wiem...
Teraz mam inne pytanko, chce napisać kod który policzy mi ilość linii w pliku, napisałem taki kod:

Kod: Zaznacz cały

int main(void)
{
        FILE *plik;
        int i = 0, a = 0, il_linii = 0;
        char tab[100], znak_konca;

        plik = fopen("odczyt.txt", "r");

        do
        {
                fscanf(plik, "%c", &znak_konca);
                if(znak_konca == '\n'){il_linii++;}
                a++;
        }while(znak_konca != EOF);

        printf("ilosc linii to : %i\n", il_linii-1);

        fclose(plik);

        return 0;
}
Z tym że, on nie działa, moje pytanie, dlaczego??
Można to zrobić deklarując jakaś dużą tablice i do niej przepisywać każdy znak ale to jest raczej marnotrawienie pamięci... np:

Kod: Zaznacz cały

int main(void)
{
        FILE *plik;
        int i = 0, a = 0, il_linii = 0;
        char tab[100], znak_konca;

        plik = fopen("odczyt.txt", "r");

        do
        {
                fscanf(plik, "%c", &tab[a]);
                if(tab[a] == '\n'){il_linii++;}
                a++;
        }while(tab[a] != EOF);

        printf("ilosc linii to : %i\n", il_linii-1);

        fclose(plik);

        return 0;
}


ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości