Documente Academic
Documente Profesional
Documente Cultură
Laborator 8
Laborator 8
1. Proiecte cu descompunerea programului calculator (vezi Cursul 6) în mai multe fișiere sursă
Aplicație propusă 1. Scrieți un proiect (vezi Laboratorul 7) care citește un număr pe linie, precedat opțional de
un semn și-l adună la toate numerele anterioare, tipărind suma după fiecare intrare folosind trei fișiere sursă:
getline.c pe baza funcției getline(), main.c pe baza funcției main() şi atof.c pe baza funcției atof(), funcții
definite mai jos:
#include <stdio.h>
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
#include <stdio.h>
#define MAXLINE 100
/* rudimentary calculator */
int main()
{
double sum, atof(char []);
char line[MAXLINE];
int getline(char line[], int max);
sum = 0;
while (getline(line, MAXLINE) > 0)
printf("\t%g\n", sum += atof(line));
return 0;
}
#include <ctype.h>
/* atof: convert string s to double */
double atof(char s[])
{
double val, power;
int i, sign;
în care un număr real virgulă mobilă poate fi urmat de e sau E şi de un exponent cu semn. Apoi scrieţi
programul complet care primind pe intrare un şir de caractere reprezentând un număr real virgulă mobilă fie în
notaţie ştiinţifică, fie cu punct zecimal îl converteşte în număr real în reprezentarea cu parte întreagă, punct
zecimal şi parte fracţionară.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int type;
double op2;
char s[MAXOP];
#include <ctype.h>
int getch(void);
void ungetch(int);
/* getop: preia urmatorul caracter sau un operand numeric */
int getop(char s[])
{
int i, c, c2;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.' && c != '-')
return c; /* nu este numar */
i = 0;
if (c == '-') {
c2 = getch();
if (c2 != EOF)
ungetch(c2);
if (!isdigit(c2) && c2 != '.')
return c;
}
if (isdigit(c) || c == '-') /* colecteaza partea intreaga */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* colecteaza partea fractionara */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
#define BUFSIZE 100
int main(void)
{
printf("pun -3.981 in stiva\n");
push(-3.981);
printf("\n stiva=\n");
printstiva();
printf("\n pun 44.152 in stiva\n");
push(44.152);
printf("\n stiva=\n");
printstiva();
printf("\n interschimb cele 2 elemente din varful stivei\n");
swap();
printf("\n stiva=\n");
printstiva();
printf("\n duplic elementul din varful stivei\n");
duplicate();
printf("\n stiva=\n");
printstiva();
printf("\n elementul din varful stivei=\n" );printtop();
printf("\n golesc stiva\n" );
clear();
printf("\n elementul din varful stivei=\n" );printtop();
printf("\n stiva=\n");
printstiva();
return 0;
}
#define MAXVAL 100 /* adancimea maxima a stivei */
int sp = 0; /* urmatoarea pozitie libera in stiva */
double val[MAXVAL]; /* stiva cu valori */
5
/* push: pune f pe stiva cu valori */
void push(double f)
{
if (sp < MAXVAL)
val[sp++] = f;
else
printf("error: stack full, can't push %g\n", f);
}
Aplicație propusă 2*. Adăugați la programul calculator posibilitatea calculării unor funcții precum sinus,
exponențială şi putere pe baza accesului la funcțiile de bibliotecă sin, exp şi pow (pentru ele utilizați
<math.h>). Descompuneți programul construind un proiect.
Indicații: Singurele funcţii care se modifică sunt main şi getop. În plus, apare o constantă MATHLIB pentru a
semnaliza apariția uneia din funcțiile de bibliotecă sin, exp şi pow.
6
#include <math.h>
#include <string.h>
#define MATHLIB '1' /* semnal ca se apeleaza o functie din biblioteca math.h */
int main(void)
{
int type;
double op2;
char s[MAXOP];
return 0;
}
#include <ctype.h>
int getch(void);
7
void ungetch(int);
i = 0;
if (isalpha(c)) {
while (isalpha(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return MATHLIB;
}
2. Recursivitatea şi preprocesarea
Aplicaţie rezolvată 4. Rulaţi cele două variante de mai jos, ale generării şirului Fibonacci, observând diferenţa
între timpii de execuţie de la cele două variante.
long fibonacci(int);
int main()
{
int n=47, i;
long fibonacci(int n)
8
{
if ( n == 0 )
return 0;
else if ( n == 1 )
return 1;
else
return ( fibonacci(n-1) + fibonacci(n-2) );
}
A doua este varianta iterativă:
#include<stdio.h>
int main()
{
int n=47, i;
long f1 = 0, f2 = 1, f3;
Aplicaţie rezolvată 5. Definiţi un macro swap(t, x, y) care interschimbă două argumente de tipul de dată t.
#include <stdio.h>
int main(void)
{
char cx = 'x', cy = 'R';
printf("inainte de interschimbare: %c, %c\n\n", cx, cy);
swap(char, cx, cy)
printf("dupa interschimbare : %c, %c\n\n\n", cx, cy);
int ix = 7, iy = 12;
printf("inainte de interschimbare: %d, %d\n\n", ix, iy);
swap(int, ix, iy)
printf("dupa interschimbare : %d, %d\n\n\n", ix, iy);
return 0;
}
9
REZOLVĂRI
Aplicație propusă 2*. Adăugați la programul calculator posibilitatea calculării unor funcții precum sinus,
exponențială și putere pe baza accesului la funcțiile de bibliotecă sin, exp şi pow.
#include <stdio.h>
#include <stdlib.h> /* for atof() */
#include <math.h>
#include <string.h>
int main(void)
{
int type;
double op2;
char s[MAXOP];
return 0;
}
#include <ctype.h>
int getch(void);
void ungetch(int);
i = 0;
if (isalpha(c)) {
while (isalpha(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return MATHLIB;
}
if (c == '-') {
c2 = getch();
if (c2 != EOF)
ungetch(c2);
if (!isdigit(c2) && c2 != '.')
return c;
}
11
if (isdigit(c) || c == '-') /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
12