C/Przykłady z komentarzem: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
m Wycofano edycje użytkownika 88.199.15.129 (dyskusja). Autor przywróconej wersji to Kj.
poprawki
Linia 1:
=== Liczby losowe ===
Poniższy program generuje wiersz po wierszu macierz o określonych przez użytkownika wymiarach, zawierającą losowo wybrane liczby. Każdy wygenerowany wiersz macierzy zapisywany jest w pliku tekstowym o wprowadzonej przez użytkownika nazwie. W pierwszym wierszu pliku wynikowego zapisano wymiary utworzonej macierzy.
<source lang="c">
Program napisany i skompilowany został w środowisku GNU/Linux.
 
#include <[[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#stdio.h|stdio.h]]>
#include <[[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#stdlib.h|stdlib.h]]> /* dla funkcji [[C/rand|rand()]] oraz [[C/srand|srand()]] */
#include <[[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#time.h|time.h]]> /* dla funkcji [[C/time|time()]] */
int main()
{
int i, j, n, m;
Linia 14:
char fileName[128];
[[C/printf|printf]]puts("Wprowadz nazwe pliku wynikowego..\n");
[[C/scanf|scanf]]("%s127s",&fileName);
printfputs("Wprowadz po sobie liczbe wierszy i kolumn macierzy oddzielone spacją..\n");
scanf("%d %d", &n, &m);
Linia 25:
warunek, który w kontrolowany sposób zatrzyma program (funkcja exit;)
*/
if ( (fp = [[C/fopen|fopen]](fileName, "w")) == NULL )
{
[[C/puts|puts]]("Otwarcie pliku nie jest mozliwe!");
exit(0); /* jeśli w procedurze glownej
to piszemy bez nawiasow */
}
else { puts("Plik otwarty prawidłowo.."); }
[[C/fprintf|fprintf]](fp, "%d %d\n", n, m);
/* w pierwszym wierszu umieszczono wymiary macierzy */
[[C/srand|srand]]( (unsigned int) [[C/time|time]](0) );
for (i=1; i<=n; ++i)
{
Linia 46 ⟶ 45:
if (j!=m) fprintf(fp," ");
}
fprintffputc(fp,"'\n"');
}
[[C/fclose|fclose]](fp);
return 0;
}
</source>
 
=== Zamiana liczb dziesiętnych na liczby w systemie dwójkowym ===
Zajmijmy się teraz innym zagadnieniem. Wiemy, że komputer zapisuje wszystkie liczby w postaci binarnej (czyli za pomocą jedynek i zer). Spróbujmy zatem zamienić liczbę, zapisaną w "naszym" dziesiątkowym systemie na zapis binarny. '''Uwaga:''' Program działa jedynie dla liczb od 0 do maksymalnej wartości którą może przyjąć typ <code>unsigned short int</code> w twoim kompilatorze.
<source lang="c">
 
#include <[[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#stdio.h|stdio.h]]>
#include <[[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#limits.h|limits.h]]>
void dectobin (unsigned short a)
Linia 69:
}
int main (void)
{
unsigned short a;
Linia 81:
return 0;
}
</source>
 
=== Zalążek przeglądarki ===
Zajmiemy się tym razem inną kwestią, a mianowicie programowaniem sieci. Jest to zagadnienie bardzo ostatnio popularne. Nasz program będzie miał za zadanie połączyć się z serwerem, którego adres użytkownik będzie podawał jako pierwszy parametr programu, wysłać zapytanie HTTP i odebrać treść, którą wyśle do nas serwer. Zacznijmy może od tego, że obsługa sieci jest niemal identyczna w różnych systemach operacyjnych. Na przykład między systemami z rodziny Unix oraz Windowsem różnica polega tylko na dołączeniu innych plików nagłówkowych (dla Windowsa - winsock2.h). Przeanalizujmy zatem poniższy kod:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXRCVLEN 512
#define PORTNUM 80
char *query = "GET / HTTP1.1\n\n";
int main(int argc, char *argv[])
{
char buffer[MAXRCVLEN+1];
int len, mysocket;
struct sockaddr_in dest;
char *host_ip = NULL;
if (argc != 2) {
printf ("Podaj adres serwera!\n");
exit (1);
}
host_ip = argv[1];
mysocket = socket(AF_INET, SOCK_STREAM, 0);
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(host_ip); /* ustawiamy adres hosta */
dest.sin_port = htons (PORTNUM); /* numer portu przechowuje dwubajtowa zmienna - musimy ustalić porządek sieciowy - Big Endian */
memset(&(dest.sin_zero), '\0', 8); /* zerowanie reszty struktury */
connect(mysocket, (struct sockaddr *)&dest,sizeof(struct sockaddr)); /* łączymy się z hostem */
write (mysocket, query, strlen(query)); /* wysyłamy zapytanie */
len=read(mysocket, buffer, MAXRCVLEN); /* i pobieramy odpowiedź */
buffer[len]='\0';
printf("Rcvd: %s",buffer);
close(mysocket); /* zamykamy gniazdo */
return EXIT_SUCCESS;
}
 
Powyższy przykład może być odrobinę niezrozumiały, dlatego przyda się kilka słów wyjaśnienia. Pliki nagłówkowe, które dołączamy zawierają deklarację nowych dla Ciebie funkcji - socket(), connect(), write() oraz read(). Oprócz tego spotkałeś się z nową strukturą - sockaddr_in. Wszystkie te obiekty są niezbędne do stworzenia połączenia. Aby dowiedzieć się więcej nt. wszystkich użytych tu funkcji i struktur musisz odwiedzić podręcznik o [[Programowanie w systemie UNIX|programowaniu]] w systemie UNIX.