CATEGORII DOCUMENTE |
Gradinita |
Plan de Lectie
Data:
Clasa: a-X-a
Lectia: Argumente in linia de comanda.
Pointeri la functii.
Materiale Didactice: Dorian Stoilescu - Manual de C/C++ (pentru licee)
Obiectivul Fundamental: Acumularea de noi cunostinte si fixarea acestora.
Obiective Operationale: Elevii vor fi atenti la predarea lectiei, dupa care
trebuie sa fie capabili sa raspunda la intrebarile
profesorului legate de:
Preluarea argumentelor din linia de comanda
Pointeri la functii
1. Preluarea argumentelor din linia de comanda
Lansarea in lucru a unui program sub sistemul de operare MS-DOS permite introducerea optionala a unor argumente in linia de comanda in forma:
>nume program param1 param2 <CR>
Aceste argumente pot fi preluate in cazul unui program scris in C cu ajutorul unor parametri formali folositi in main( ) numiti traditional argc si argv. Primul este un intreg si reprezinta numarul de argumente din linia de comanda, inclusiv numele programului lansat in lucru (valoarea minima a lui argc este 1). Cel de-al doilea este de tip tablou de pointeri la caracter; argv[0] pointeaza la sirul de caractere reprezentind numele de apel al programului (inclusiv calea), arg[1] la primul parametru (param 1) etc. Urmatoarele 2 exemple prezinta 2 moduri diferite de utilizare ale parametrilor argc si argv pentru un program care preia si afiseaza argumentele din linia de comanda:
Ex.1
/* afisarea argumentelor din linia de comanda - 1 */
#include <stdio.h>
main(int argc,char *argv[])
Ex.2
/* afisarea argumentelor din linia de comanda - 2 */
#include <stdio.h>
main(int argc,char *argv[])
T1. Introduceti una din cele 2 versiuni si verificati modul de functionare folosind pentru introducerea parametrilor (param 1 param n) optiunea OptionsArguments din mediul integrat. Verificati functionarea sub prompter DOS.
In variantele 2 si 3 ale exemplelor anterioare *++argv este o constructie valida intrucit argv este numele unui tablou ce apare ca parametru formal intr-o functie. *++argv extrage valoarea lui argv[1]. De ce?
Ce reprezinta si cine este elementul reperat de constructiile:
(*++argv)[0] respectiv *++(argv[0]), **++argv ?
Urmatorul exemplu utilizeaza argumentele din linia de comanda pentru a inlocui toate aparitiile unui sir de caractere cu un alt sir de caractere pe liniile citite de la intrare. Cele doua siruri sint parametri in linia de camanda.
Ex.3
/* tratarea argumentelor din linia de comanda */
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <stdlib.h>
#define MAXLEN 256
int change(char *,const char *,const char *);
main(int argc,char *argv[])
/* schimba toate aparitiile unui subsir de caractere in liniile citite */
/* de la intrare cu un alt subsir. */
/* argv[1] pointeaza spre primul subsir,argv[2] indica al doilea sir */
while(gets(s) != NULL)
int change(char *s,const char *t1,const char *t2)
/* schimba toate aparitiile lui t1 cu t2 in s,intoarce nr. da aparitii */
/* while */
while((*ptemp++=*ps++) != NULL) /* copie restul sirului */
;
strcpy(s,temp); /* rescrie s */
return i;
T2. Modificati exemplul dat in asa fel incit daca exista un al treilea parametru in linia de comanda (obligatoriu un sir de caractere reprezentind un numar intreg n) sa se modifice doar cea de-a n-a aparitie a sirului 1. Pentru conversia sir de caractere
-> intreg utilizati functia atoi( ). Rulati programul astfel pus la punct folosind mecanismele de redirectare ale intrarii/iesire standard sub DOS.
Nota Sistemul de operare DOS permite redirectarea dispozitivelor standard de I/E prin inlocuirea lor cu fisiere. Lansarea in lucru a programului prog cu linia de comanda de mai jos va provoca citirea datelor de intrare din fisierul in.dat respectiv scrierea datelor de iesire in fisierul out.dat:
>prog <in.dat >out.dat
Daca in loc de > se foloseste >> datele de iesire se vor concatena la fisierul out.dat.
Iesirea unui program poate fi indirecta catre intrarea unui alt program printr-un mecanism de tip 'pipe' ('conducta') cu ajutorul unei comenzi de tipul:
>prog1 | prog2
prog2 se va lansa simultan cu prog1 si toate operatiile de intrare pentru prog2 vor extrage date din iesirea lui prog1.
T3. Scrieti un program care sa citeasca liniile de la intrare si sa le afiseze in grupuri de cite 22 (paginat), asteptind pentru trecerea la o noua pagina un caracter.
Testati programul folosind o comanda de tipul:
>TYPE nume.ext | prog
2.Pointeri la functii
Prin definitie numele unei functii (fara paranteze ()) reprezinta un pointer la functie. Operatiile care se pot face prin intermediul pointerilor la functie sint:
- lansarea in lucru a functiei respective
- transmiterea lor ca parametri efectivi pentru o alta functie.
Exemplul de mai jos apeleaza functia intg() ce calculeaza valoarea aproximativa a unei integrale definite pe intervalul a,b folosind formula trapezelor.
Ex.4
/* pointeri la functii */
#include <stdio.h>
#include <math.h>
double my_func1(double); /* functii utilizator */
double my_func2(double);
double intg(double (*)(),double,double,int); /* aprox. integralei */
main()
/* calculul aproximativ al unei integrale definite */
double intg(double (*pf)(double),double a,double b,int n)
/* calculul integralei prin metoda trapezelor */
/* pf este pointerul la functia de integrat */
return s*h;
double my_func1(double x)
/* functia utilizator 1 */
double my_func2(double x)
/* functia utilizator 2 */
Declaratia double (* pf) ( ) se interpreteaza tinind cont de prioritatea parantezelor. pf este un pointer - (*pf) - la o functie - ( ) - de tip double.
Analog trebuie interpretate expresiile continind paranteze ( ) si [ ] respectiv *.
Ex.
int * x[3] -- tablou de 3 pointeri la intregi
int (*x)[3] -- pointer la un tablou de 3 intregi
int *f( ) -- functie intorcind un pointer la intreg
int (*f) (double) -- pointer la o functie de tip int ce primeste un argument de tip double
int *(* x[ ])( ) -- tablou de pointeri la functii returnind pointeri la intreg.
Probleme propuse
1. Scrieti un program care sa citeasca liniile de la intrare pina la sfirsit de fisier (EOF - <Ctrl/z>) si sa le afiseze apoi ordonate. Utilizati pentru numararea liniilor un tablou de pointeri si alocarea dinamica de memorie. Asigurati posibilitatea tratarii a 2 argumente in linia de comanda n1, n2 care sa indice pozitia si lungimea unui cimp dupa care sa se faca ordonarea (in caz de absenta de la prima pozitie si toata lungimea liniei).
2*.Modificati programul de inlocuire a unui sir cu un alt sir din exemplul dat facindu-l sa trateze situatii date prin urmatoarele specificatii in linia de comanda:
>change /sir1/sir2 unde daca:
sir1 = vid -- sir2 se insereaza la inceput
sir2 = vid -- sir1 este sters
Atit sir1 cit si sir2 pot fi formate cu ajutorul caracterelor cu semnificatia de orice sir.
Exemplu
ab -- orice sir care incepe cu subsirul ab.
ab -- orice sir care se termina cu subsirul ab.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2207
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved