Clasa a V-a lecția 11 - 13 nov 2012

From Algopedia
Jump to navigationJump to search

Tema - verificare

Rezolvări aici [1]

Lecție

Fișiere

În general dorim să păstrăm rezultatele calculate de un program, nu doar să le afișăm pe ecran. De asemenea, atunci cînd testăm programul am vrea să nu trebuiască să tastăm datele de intrare la fiecare execuție, mai ales atunci cînd sînt multe. Fișierele sînt un mod de a stoca datele pe disc, fie în vederea citirii lor de către un program, fie pentru a păstra rezultatele.

Declararea fișierelor

FILE *fin, *fout; // un fisier de intrare (citire) si unul de iesire (scriere)

Deschiderea și închiderea fișierelor

Pentru a putea citi dintr-un, sau scrie într-un fișier acesta trebuie mai întîi deschis. La final el trebuie închis. Un fișier de intrare (citire) se deschide în modul citire, iar un fișier de ieșire (scriere) se deschide în modul scriere:

 fin = fopen( "date-intrare.in", "r" );
 ... facem citiri din fisier
 fclose( fin );
 fout = fopen( "rezultate.out", "w" );
 ... facem scrieri in fisier
 fclose( fout );

Citirea din și scrierea în fișiere

Instrucțiunea de citire este similara cu scanf. Ea se numește fscanf (scanf din fișier) și are ca prim argument fișierul din care se citește. Exemplu:

 fscanf( fin, "%d", &n );

Instrucțiunea de scriere este similară cu printf. Ea se numește fprintf (printf în fișier) și are ca prim argument fișierul în care se scrie. Exemplu:

 fprintf( fout, "Numărul %d este prim\n", n );

Exemplu de lucru cu fișiere

Se citesc două numere m și n. Să se spună dacă sînt prime între ele (dacă nu au nici un divizor mai mare ca 1). Răspuns: am putea să testăm toți divizorii posibili, între 2 și minimul celor două numere, dar ar fi ineficient. Putem în schimb calcula cel mai mare divizor comun, și dacă el este 1 înseamnă că nu există nici un divizor mai mare ca 1, prin definiție.

 #include <stdio.h>

 int main() {
   FILE *fin, *fout;
   int a, b, r;

   fin = fopen( "prime.in", "r" );
   fscanf( fin, "%d%d", &a, &b );
   fclose( fin );

   while ( b > 0 ) {
     r = a % b;
     a = b;
     b = r;
   }

   fout = fopen( "prime.out", "w" );
   if ( a > 1 )
     fprintf( fout, "Numerele nu sint prime intre ele\n" );
   else
     fprintf( fout, "Numerele sint prime intre ele\n" );
   fclose( fout );
   return 0;
 }

Radical

Definiție: numim radical din n și scriem acel număr a care ridicat la pătrat este n. Cu alte cuvinte dacă a2 = n atunci .

Funcția care calculează radical din n în C se numește sqrt. sqrt(n) calculează radical din n, iar, dacă îl atribuim unei variabile întregi, ea va conține partea întreagă din radical. Cu alte cuvinte variabila va conține cel mai mare întreg a cu proprietatea că a2 ≤ n.

Pentru a putea folosi funcția sqrt va trebui să includem <math.h>.

Exemplu: să se calculeze radical din n și să se afișeze.

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

 int main() {
   FILE *fin, *fout;
   int n, a;

   fin = fopen( "radical.in", "r" );
   fscanf( fin, "%d", &n );
   fclose( fin );
   a = sqrt( n );
   fout = fopen( "radical.out", "w" );
   fprintf( fout, "Parte intreaga din radical din %d este %d\n", n, a );
   fclose( fout );
   return 0;
 }

Exerciții

Scrieți schema logică și programul C pentru următoarele probleme, folosind fișiere pentru citirea și scrierea datelor.

  • Numărul de pătrate perfecte între a și b. Avem mai multe variante. Iată cea mai eficientă variantă.
Numărul de pătrate perfecte între a și b
 #include <stdio.h>
 #include <math.h>

 int main() {
   FILE *fin, *fout;
   int n, m, a, b;

   fin = fopen( "patrate.in", "r" );
   fscanf( fin, "%d%d", &a, &b );
   fclose( fin );
   n = sqrt( b );
   m = sqrt( a - 1 );
   fout = fopen( "patrate.out", "w" );
   fprintf( fout, "%d\n", n - m);
   fclose( fout );
   return 0;
 }

Tema

  • Faceți-vă cont la varena.ro
  • Să se rezolve următoarele probleme (schemă logică + program C în CodeBlocks, trimis la vianuarena):
  • Problemă de logică: te afli pe o platformă la 200m înălțime. Platforma are un inel bine ancorat. Mai jos, la 100m de pămînt se află o platformă identică. Dispui de o frînghie de 150m și o foarfecă. Cum ajungi la pămînt?

Rezolvări aici [2]