Programowanie

w języku C

© 2012

Grzegorz Łukawski & Maciej Lasota Politechnika Świętokrzyska w Kielcach Zarządzanie pamięcią, funkcje związane z datą i czasem.

comm

Klasyfikowanie znaków

#include <ctype.h>

Funkcje zwracają wartość niezerową gdy znak 'z' należy do danej kategori : Funkcja

Kategoria znaku

isdigit(z)

Cyfra dziesiętna

isxdigit(z)

Cyfra szesnastkowa

islower(z)

Mała litera (bez polskich znaków) isupper(z)

Wielka litera (j.w.)

isalpha(z)

Mała lub wielka litera (j.w.)

isalnum(z)

Mała lub wielka litera lub cyfra dziesiętna (j.w.)

Zmiana wielkości liter

#include <ctype.h>

Zamiana wielkości znaków (bez polskich znaków): tolower(z)

- na małą literę (jeśli była duża) toupper(z)

- na dużą literę (jeśli była mała)

Konwersja znaków na liczby i odwrotnie

#include <stdlib.h>

Konwersja ciągów znaków na liczby: double atof(char *s)

Ciąg znaków na wartość double

int atoi(char *s)

Ciąg znaków na wartość int

long atol(char *s)

Ciąg znaków na wartość long

char tk[50], int n;

sprintf(tk, ”n=%d”, n);

sscanf(tk, ”%d”, &n);

Wypełnianie/zerowanie pamięci

#include <mem.h>

#include <string.h>

void *memset(void *ptr, int value, size_t num);

● ptr

- wskaźnik na początek bloku pamięci,

● value

- wartość (bajt) którym wypełnić blok,

● num

- wielkość bloku w bajtach.

int tab1[32];

memset(tab1, 0, sizeof(tab1));

// Zerowanie tablicy

Kopiowanie bloków pamięci void *memcpy(void* dest, const void* src, size_t size);

● dest

- wskaźnik na miejsce docelowe w pamięci,

● src

- wskaźnik na miejsce źródłowe w pamięci,

● size

- wielkość bloku w bajtach.

char dane1[20], dane2[20];

//...

memcpy(dane1, dane2, sizeof(dane1)); // dane1 = dane2

Porównywanie bloków pamięci int memcmp(const void *s1, const void *s2, size_t size);

● s1

- wskaźnik na pierwszy blok pamięci,

● s2

- wskaźnik na drugi blok pamięci,

● size

- wielkość bloku(ów) w bajtach.

Funkcja zwraca wyniki analogicznie do funkcji strcmp(), czyli 0 gdy bloki są takie same.

char dane1[20], dane2[20];

//...

if( memcmp(dane1, dane2, sizeof(dane1)) == 0 ) puts(”Dane są identyczne!”);

Dynamiczny przydział pamięci

#include <stdlib.h>

void *malloc( size_t size );

void *calloc( size_t num, size_t size );

● size

- rozmiar bloku danych,

● num

- liczba bloków danych.

Do przechowywania przydzielonych bloków danych należy wykorzystać wskaźniki, zawsze trzeba wykonać rzutowanie na pożądany typ: int *b1, *b2;

b1 = (int*)malloc(sizeof(int) * 50); b2 = (int*)calloc(sizeof(int), 50);

Dynamiczny przydział pamięci W przypadku niepowodzenia (braku pamięci) funkcje zwracają wartość NULL:

int *wsk = (int*)malloc(1024*1024); if(wsk == NULL) {

puts(”Brak pamieci!”);

exit(0);

}

Obszar przydzielony dynamicznie można traktować jak tablicę: wsk[0] = 1;

wsk[1] = 2;

y = wsk[i] + wsk[i+1];

Zmiana rozmiaru bloku pamięci void *realloc( void * ptr, size_t size );

● ptr

- wskaźnik na blok danych którego rozmiar chcemy zmienić,

● size

- nowy rozmiar.

UWAGA

Należy uważać żeby nie „zgubić” wskaźnika na przydzielony obszar, np.

nadpisując go przez kolejne wywołan ie mal oc/cal oc.

Zwalnianie pamięci void free(void *ptr);

● ptr

- wskaźnik na blok danych.

UWAGA

Niedozwolone jest kilkukrotne zwalnianie tego samego obszaru pamięci, ani zwalnianie pamięci nie przydzielo nej przez omówione funkcje.

Dynamiczne struktury danych – listy struct el_li {

char nazwa[32];

float cena;

struct el_li *next;

};

struct el_li *lista = NULL;

Aktualny czas i data

#include <time.h>

Odczytu aktualnego czasu kalendarzowego – liczba sekund która upłynęła od północy (0:00), 1 stycznia 1970 roku: time_t time(time_t *tp);

Przykład (argumentem może być NULL): time_t czas_sek = time(NULL);

Przekształcanie wartości (czas lokalny) na strukturę tm: struct tm *czas = localtime(&czas_sek); int

rok = czas->tm_year + 1900;

Czas i data

struct tm {...}

Najważniejsze pola struktury przechowującej czas i datę (int): Nazwa pola

Opis

Zakres wartości

tm_sec

sekundy po minucie

0..59

tm_min

minuty po godzinie

0..59

tm_hour

godziny po północy

0..23

tm_mday

dzień miesiąca

1..31

tm_mon

miesiąc od stycznia

0..11

tm_year

lata od 1900 roku

-

tm_wday

dni od niedzieli

0..6

tm_yday

dni od 1 stycznia

0..365

Obliczenia czasu Funkcja zwraca różnicę czas2 czas1

‑

wyrażoną w sekundach:

double difftime(czas2, czas1);

int main() {

char str[64];

time_t start, end;

start = time(NULL);

printf("Podaj imie: "); fgets(str, 64-1, stdin);

end = time(NULL);

printf("Zajelo Ci to %.2lf sek.\n", difftime(end, start));

}

Formatowanie czasu i daty Formatuje czas i umieszcza w podanym buforze tekstowym. Przy formatowaniu mogą być wzięte pod uwagę lokalne ustawienia i język w jakim pracuje system operacyjny: char bufor[64+1];

strftime(bufor, 64, "%H:%M", czas_tm); UWAGA

Sekwencje formatujące funkcji strftime() mają inne znaczenie niż takie same sekwencje funkcji z rodziny pri ntf()!

Formatowanie czasu i daty Sekwencja

Opis

Przykład

%a

skrócona i pełna nazwa dnia tygodnia Wed

%A

Wednesday

%b

skrócona i pełna nazwa miesiąca

Apr

%B

April

%d

dzień miesiąca

25

%H

godzina – zegar 24 i 12-godzinny 19

%I

07

%p

miejscowy odpowiednik AM/PM

PM

%j

dzień roku

116

%m

numer miesiąca w roku

5

%M

minuta

34

%S

sekunda

55

%w

numer dnia tygodnia (niedziela = 0) 3

%y

rok bez wieku (00-99) i z wiekiem 12

%Y

(1990-xx)

2012

Document Outline

  • Slajd 1
  • Slajd 2
  • Slajd 3
  • Slajd 4
  • Slajd 5
  • Slajd 6
  • Slajd 7
  • Slajd 8
  • Slajd 9
  • Slajd 10
  • Slajd 11
  • Slajd 12
  • Slajd 13
  • Slajd 14
  • Slajd 15
  • Slajd 16
  • Slajd 17