c wykład 2, Informatyka


Współpraca z plikami

Dane można również wczytywać z pliku i zapisywać do pliku. Do tego celu służą funkcje fscanf() i fprintf(). Funkcje te mają identyczną budowę jak funkcje scanf() i prinf(), z wyjątkiem dodatkowego, pierwszego parametru. Parametr ten deklarowany jest jako wskaźnik ( o wskaźnikach będzie później...) na zmienną typu FILE (duże litery), jest wykorzystywany do "otwarcia" pliku i ma nazwę identyfikator kanału. Budowa funkcji fopen

ik = fopen(nazwa_pliku,tryb) (ale wcześniej: FILE *ik )

Plik może być otwarty w trzech trybach:

"r" - plik otwierany do czytania

"w" - plik otwierany do zapisu, jednocześnie zostaje usunięty każdy plik o

tej samej nazwie

"a" - dane wyjściowe z programu będą dołączane do istniejącego pliku

Przykład współpracy z plikami.

0x08 graphic
Program otwiera plik wyn.dat (nieistniejący dotychczas na dysku) w trybie "w", zapisuje w nim dwie wartości, następnie zamyka go i otwiera w trybie "r", odczytuje je i drukuje na ekranie.

#include <stdio.h>

#include <stdlib.h>

0x08 graphic
void main(void)

{

FILE *f;

int a,b,c,d;

f=fopen("wyn.dat","w");

0x08 graphic
a=5;

b=7;

fprintf(f,"%d %d",a,b);

0x08 graphic
fclose(f);

f=fopen("wyn.dat","r");

0x08 graphic
fscanf(f,"%d %d",&c,&d);

printf("c=%d\nd=%d\n",c,d);

getchar();

0x08 graphic
}

W pierwszej części programu zmienne nazwano a i b, a w drugiej c i d - nie ma to żadnego znaczenia.

Wyrażenia warunkowe

Najprostszą postacią funkcji warunkowej jest :

1) if (warunek) instrukcja

Instrukcja zostanie wykonana, jeżeli warunek jest spełniony. W ramach warunku mogą wystąpić operatory relacji:

Operatory relacji

== równe != różne od

> większe niż < mniejsze niż

>= większe lub równe <= mniejsze lub równe

0x08 graphic

2)

if(warunek)

{

instrukcja1;

instrukcja2;

……………;

0x08 graphic
}

3)

if(warunek) instrukcja1;

else instrukcja2;

lub

0x08 graphic

if(warunek)

{

instrukcja1;

0x08 graphic
instrukcja2;

……………;

}

else

{

instrukcja1;

instrukcja2;

……………;

}

4)

if(warunek)

{

instrukcja1;

instrukcja2;

……………;

}

else if (warunek)

{

instrukcja1;

instrukcja2;

……………;

}

else if (warunek)

{

instrukcja1;

instrukcja2;

……………;

}

Konstrukcja else if może wystąpić wielokrotnie.

warunek to takie wyrażenie logiczne uogólnione (przy okazji ciekawostka C nie ma typu logicznego) . Wartość 0 zawsze odpowiada fałszowi, a wartość niezerowa to zawsze prawda tak więc if(4<5) ma takie samo znaczenie jak if(2) lub if(124) (bo odpowiadają wartości logicznej prawda), a if(4>5) ma takie samo znaczenie jak if(0) (fałsz).

Rozwiązanie równania kwadratowego - zastosowano jedynie funkcję if 1).

#include <stdio.h>

#include <math.h>

void main(void)

{

double a,b,c,delta;

printf("Podaj wartosci a, b, c");

scanf("%lf%lf%lf ",&a, &b, &c);

delta=sqrt(b*b-4*a*c);

if(delta>0) printf("x1=%lf x2=%lf\n",(-b+sqrt(delta))/2/a, (-b-sqrt(delta))/2/a);

if (delta==0) printf("x1,2=%lf\n",-b/2/a);

if (delta<0) printf("Brak rzeczywistych pierwiastków\n");

}

Rozwiązanie równania kwadratowego - zastosowano funkcję if 4).

0x08 graphic

#include <stdio.h>

#include <math.h>

void main(void)

{

0x08 graphic
double a,b,c,delta;

printf("Podaj wartosci a, b, c");

scanf("%lf %lf %lf",&a, &b, &c);

delta=sqrt(b*b-4*a*c);

if(delta>0)

printf("x1=%lf\t x2=%lf\n",(-b+sqrt(delta))/2/a,(-b-sqrt(delta))/2/a); //(1)

else if(delta<0)

printf("Brak rzeczywistych pierwiastków\n"); //(2)

else

printf("x1,2=%lf\n",-b/2/a); //(3)

}

Jeżeli delta jest większa od 0

wykonaj instrukcję (1)

w przeciwnym wypadku, jeżeli delta jest mniejsza od zera

wykonaj instrukcję (2)

w przeciwnym wypadku (tzn. ani delta>0 ani delta<0 czyli delta=0)

wykonaj instrukcję (3).

Przy okazji:

// to znak komentarza - obowiązuje do końca wiersza

/*.. ..*/ to też komentarz (między znakami) można nimi objąć wiele linii programu

Wyrażenia warunkowe mogą być rozbudowywane przez zastosowanie spójników logicznych && (i) oraz || (lub)

&& - to znak iloczynu logicznego albo koniunkcji

|| - to znak sumy logicznej albo alternatywy

Iloczyn logiczny jest PRAWDĄ jeżeli wszystkie czynniki są prawdziwe.

Suma logiczna jest PRAWDĄ jeżeli co najmniej jeden składnik jest prawdziwy.

Przykład liczby a, spełniającej następujące warunki :

jest nieparzystą

mniejszą od -10 lub z przedziału (25,40>

(fmod(a,2)!=0) && (a<-10) || ((a>25) && (a<=40))

Program sprawdzający czy wczytywana liczba jest podzielna przez 5 lub przez 7

oraz przez 11. (tzn. liczba podzielna przez 11 oraz dodatkowo przez 5 lub 7)

#include <stdio.h>

#include <math.h>

void main(void)

{

double a;

printf("Podaj wartosc a");

scanf("%lf",&a);

if(((fmod(a,5)==0)||(fmod(a,7)==0))&&(fmod(a,11)==0)) printf("Podzielna\n");

else

printf("Niepodzielna");

0x08 graphic
}

0x08 graphic

Iloczyn (&&) ma wyższy priorytet niż suma (||).

Program sprawdza, czy 3 wprowadzone wartości mogą stanowić boki trójkąta tj.: a+b>c; b+c>a; a+c>b a następnie wyznacza kąty tego trójkąta.

#include <stdio.h>

#include <math.h>

void main(void)

{

double a,b,c,p,F,ws;

ws=180./3.1416;

printf("Podaj wartosci a, b, c\n");

scanf("%lf%lf%lf",&a,&b,&c);

if((a+b>c)&&(a+c>b)&&(b+c>a))

{

p=(a+b+c)/2;

F=sqrt(p*(p-a)*(p-b)*(p-c));

printf("alfa=%5.2f\tbeta=%5.2f\tgama=%5.2f\n",ws*asin(2*F/b/c),

ws*asin(2*F/a/c),ws*asin(2*F/a/b));

}

else

printf("To nie jest trojkat\n");

}

0x01 graphic

Instrukcja typu warunkowego switch

switch (wyrażenie)

{

case wart1:

instrukcja 1;

break;

case wart2:

instrukcja 2;

break;

case wart3:

instrukcja 3;

break;

default :

instrukcja d;

break;

}

Wykonywana jest ta instrukcja, dla której wart=wyrażenie jeżeli taka sytuacja nie ma miejsca wykonywana jest instrukcja d. Jeżeli nie napisany jest przypadek default kontynuowany jest program za całym blokiem "switch".

To też jest wyrażenie warunkowe:

(i>5)?27:35 jeżeli warunek jest spełniony to to ma wartość 27, a jeżeli nie to 35

Program przykładowy podaje nazwę dnia tygodnia w zależności od wczytanego numeru dnia

#include <stdio.h>

#include <math.h>

void main(void)

{

int nrd;

printf("Podaj numer dnia\n");

scanf("%d",&nrd);

switch(nrd)

{

case 1:

printf("Poniedzialek\n");

break;

case 2:

printf("Wtorek\n");

break;

case 3:

printf("Sroda\n");

break;

case 4:

printf("Czwartek\n");

break;

case 5:

printf("Piatek\n");

break;

case 6:

printf("Sobota\n");

break;

case 7:

printf("Niedziela\n");

break;

}

}

INFORMATYKA WYKŁAD 2 Temat: Język C 6

Wczytane wartości

są drukowane na

ekranie

Zmienne a i b zapisywane są

do pliku wskazywanego przez f

otwieranie pliku "wyn.dat" w trybie do

zapisu. Zmienna f związana jest od tego momentu z tym plikiem

* oznacza,że f jest wskaźnikiem do pliku

W tym miejscu nie stawiamy średnika!!!

Nawiasy obejmują więcej niż jedną prostą instrukcję - jest to tzw. instrukcja złożona

else - w przeciwnym wypadku

przy wczytywaniu danych z pliku

o nazwie "dane.dat" należy napisać:

FILE *ws;

ws=fopen("dane.dat","r");

fscanf(ws,"%lf %lf %lf",&a, &b, &c);

brak tego nawiasu dawałby liczby podzielne jednocześnie przez 11 i 7 lub liczby podzielne przez 5

W tym miejscu nie stawiamy średnika!!! (też)



Wyszukiwarka