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.
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>
void main(void)
{
FILE *f;
int a,b,c,d;
f=fopen("wyn.dat","w");
a=5;
b=7;
fprintf(f,"%d %d",a,b);
fclose(f);
f=fopen("wyn.dat","r");
fscanf(f,"%d %d",&c,&d);
printf("c=%d\nd=%d\n",c,d);
getchar();
}
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
2)
if(warunek)
{
instrukcja1;
instrukcja2;
……………;
}
3)
if(warunek) instrukcja1;
else instrukcja2;
lub
if(warunek)
{
instrukcja1;
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).
#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\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");
}
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");
}
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
Plik jest zamykany
i ponownie otwierany w trybie "r" (odczyt)
odczytywana jest zawartość pliku
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ż)