FCIM
Departamentul de Informatica si Inginerie Software
RAPORT
la lucrarea de laborator nr.7
la Programarea Calculatoarelor
Varianta 66
Chişinău – 2018
Scopul lucrării:
- Dezvoltarea procedeelor de algoritmizare şi progamare prin integrarea modulelor in program pentru
prelucrarea sirurilor de caractere, analizând soluţiile stereotipe şi cele eficiente de introducere,
afişare şi alte operatii.
- Insuşirea principiilor de perfecţionare a tehnicii de programare cu subprograme standarde si definite
pentru prelucrarea datelor şi şirurilor de caractere in TC.
- Insuşirea procedeelor de elaborare si utilizarea efectiva a programelor cu proceduri si funcţii
predefinite pentru prelucrarea şirurilor caracteriale.
- Analiza elementelor specifice ale funcţiilor predefinite prin algoritmizare si programare pentru
prelucrarea fragmentelor de texte prin comparaţia soluţiilor stereotipice cu cele eficiente pentru
diverse moduri de manipulare ale textelor.
Obiectivele temei:
1. Aprofundarea studierei principiilor prelucrării (descrierii, declarării, formării, etc.) şirurilor caracteriale
în C.
2. Studierea metodelor şi tehnicilor de bază de prelucrare a textelor ca şiruri caracteriale, utilizînd
subprograme definite şi predefinite.
3. Analizaţi construcţia prin scenarii programul pentru determinarea rezultatelor şi verificarea
corectitudinei testelor propuse.
4. Elaborarea algoritmului şi programului de soluţionare a variantei.
Deci ca obiective devin urmatoarele: Realizarea algoritmilo modulelor si integrarea in programul care sa
rezolve problema propusa.
Implementarea aplicatiei. Codificarea algoritmilor (programarea) si punerea la punct a aplicatiei.
Obtinerea algoritmilor necesari intocmirii programului care rezolva problema propusa, testarea rezultatelor
obtinute si corectarea eventualelor erori de programare.
Intretinerea aplicatiei: Efectuarea modificarilor necesare in scopul corectarii unor erori
identificate in cursul exploatarii ei sau pentru a o adapta la noile cerinte aparute.
Variant 2
tunt aa laboratorul ee erogramare //ultima litera s-a dus la inceput
Varianta3
sun l laboratoru d programar //s-a omis ultima litera
variant 4
sunt la l b atoru de p og mare //s-a sters literele care s-au repetat in cuvant
variant 5
sunt la labor torul de programare //s-a sters litera din mijlocul cuvantului
Stop.
6.Listing-ul programului:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int delimitare_cuvinte(int p)
{
p = strtok(input, " "); //selectarea cuvintelor din sir
while(p){
printf("%s\n", p);
cuv[i]=p;
i++;
if(p){
p = strtok(NULL, " .");
}
}
deplasare_lit_sfarsit()
{
for(k=0;k<i;k++){
deplasare_lit_inceput()
{
for(k=0;k<i;k++){
inlaturare_ult_litera()
{
for(k=0;k<i;k++){
inlaturare_lit_precedente()
{
for(k=0;k<i;k++){ //se parcurge fiecare cuvant din sir
for (q=x;q<pr;q++){ //se compara litera de pe pozitia x cu fiecare litera din cuvant
if(cuv[k][x]==cuv[k][q+1]){ //se verificadaca caracterul de pe pozitia x este urmat de acelasi
element
cuv[k][x]=' '; //daca conditia e valida,caracterul precedent din cuvant se inlocuieste cu
spatiu
}
}
x++;
}
inlaturare_lit_mijloc()
{
for(k=0;k<i;k++){
pr=strlen(cuv[k]); //determinarea lungimii cuvantului
if (pr%2!=0){ //se cerceteaza daca cuvantul este impar
cuv[k][pr-((pr/2)+1)]=' '; } //pentru cuvintele impare se determina mijlocul cuvantului si se
inlocuieste cu spatiu
printf("%s \n",cuv[k]); //se afiseaza cuvintele sirului modificat
}
}
int main()
{
puts("Dati sirul de caractere de la 2 la 20 de cuvinte");gets(&input); //se citeste sirul
strcat(input2,input);
printf("\n Cuvintele sirului sunt:\n");
delimitare_cuvinte(p); //se apeleaza functia de delimitare a cuvintelor din sir
printf("\n");
et: //eticheta
printf(" <<< Variantele de executare >>>\n");
printf(" [1] Deplasarea primei litere a cuvintului la sfirsitul lui\n");
printf(" [2] Deplasarea ultimei litere la inceputul cuvintului\n");
printf(" [3] Inlaturarea ultimei litere a cuvintului\n");
printf(" [4] Inlaturarea literelor precedente ale fiecarei litere care se repeta intr-un cuvint\n");
printf(" [5] Inlaturarea literei din mijloc, daca lungimea cuvintului este un numar impar\n");
printf("\n Care varianta doriti sa se execute?: ");
scanf("%d",&var); //citesc o variabila care sa corespunda cu nr variantei dorite sa se execute
switch(var){
case 1:{
printf("\n Cuvintele sirului modificat sunt:\n");
deplasare_lit_sfarsit();
};break;
case 2:{
printf("\n Cuvintele sirului modificat sunt:\n");
deplasare_lit_inceput();
};break;
case 3:{
printf("\n Cuvintele sirului modificat sunt:\n");
inlaturare_ult_litera();
};break;
case 4:{
printf("\n Cuvintele sirului modificat sunt:\n");
inlaturare_lit_precedente();
};break;
case 5:{
printf("\n Cuvintele sirului modificat sunt:\n");
inlaturare_lit_mijloc();
};break;
default: printf("Nu exista asa varianta");break; //variabila citita anterior nu satisfice nici o
conditie a switch-ului
}
printf("\n\n Doriti sa continuati executarea? (da/nu) : ");scanf("%s",r);
if(!strcmp(r,"da")){ //se verifica daca sirul de character coincide cu variabila citita
system("@cls||clear");
printf(" Sirul de caractere este:\n");
puts(input2);
printf("\n");
goto et; //daca conditia if-ului e adevarata se face salt la eticheta si programul continua
}else{
system("exit"); //daca se raspunde cu nu ,atunci programul sfarseste
}
}
9.Concluzii:
In urma efectuarii acestei lucrari de laborator am acumulat cunostinte si deprinderi de efectuare
a programelor in limbajul C cu structura ciclica,folosind concomitent subprograme.
Pentru efectuarea programului am folosit instructiunea switch ,care este o instructiune de
ramificare.Ea permite executarea programului prin selectarea anumitor parti ale programului cu
ajutorul comenzii case.
Pentru executarea variantelor propuse am folosit anumite functii predefinite a tipului de tade char
precum: strlen(...) pentru determinarea lungimii sirului de caractere; strtok(...) pentru despartirea
sirului in cuvinte; strcmp(...) pentru a compara 2 siruri de caractere,etc.
Programul respectiv l-am executat prin intermediul compilatorului Code::Blocks. Compilatorul
Code::Blocks are butonul “Build & Run” care da in executie programul elaborat. In partea de jos
avem bara care ne arata pe ce linie avem eroare in cod. Eroarea ne este comunicata intre ghilimele.
Dupa lichidarea acesteia este necesar de apasat butonul “Build & Run” pentru executia programului.
Programul se salveaza intr-un fisier cu extensia “.c”.
De asemenea, butonul “projects” ne ofera posibilitatea de a adauga sau cauta proiecte deja
effectuate si care se afla in PC. Ca si in alte compilatoare,in Code::Blocks putem gasi in bara de
meniuri butonul “Help”,unde ne este afisata informatie in functie de problema care ne intereseaza in
legatura cu aplicatia data
Am ales acest compilator deoarece este usor de utilizat si anume usureaza procesul de vizualizare
a rezultatului programului.
10.Bibliografia
Indicatii metodice nr. 1
Indicatii metodice nr. 2
Indicatii metodice nr. 3
Indicatii metodice nr. 4
Indicatii metodice nr. 5
Indicatii metodice nr. 6
Indicatii metodice nr. 7
#define NR 15
char tab_cuv[NR][LUNG];
int nr_cuv=0; /* numarul cuvintelor introduse */
void citire_cuv(void){
printf("*** Se introduc maxim %d cuvinte, terminate cu
CTRL/Z:\n",NR); while(nr_cuv<NR && gets(tab_cuv[nr_cuv]))nr_cuv++;
/* la CTRL/Z gets returneaza NULL (= 0) */
/* citirea se poate face si cu scanf:
while(nr_cuv<NR && scanf("%s",tab_cuv[nr_cuv])!=EOF)nr_cuv++; */
/* daca terminarea se face cu un cuvant vid:
while(nr_cuv<NR && strcmp("",gets(tab_cuv[nr_cuv])))nr_cuv++; */
}
void constr_cuv(void){
char c,cuv[NR+1]; /* lungimea maxima este egala cu numarul maxim de
cuvinte + 1 pentru terminator */
int i,j; /* i parcurge cuvintele din tab_cuv, j pozitiile din cuv */
for(i=j=0;i<nr_cuv;i++)
if(isalpha(c=tolower(tab_cuv[i][strlen(tab_cuv[i])-1])))
cuv[j++]=c;
cuv[j]='\0';
printf("*** Cuvantul construit:|%s|\n",cuv);
}
void cuv_max(void){
int i,lung_crt,lung_max=0;
char * p_max; /* pointerul spre cuvantul maxim */
/* se poate memora indicele cuvantului maxim: int i_max;
sau memora cuvantul maxim intr-un sir: char c_max[LUNG]; */
for(i=0;i<nr_cuv;i++)
if((lung_crt=strlen(tab_cuv[i]))>lung_max){
p_max=tab_cuv[i];
lung_max=lung_crt;
}
printf("*** Cuvantul de lungime maxima %d este:|
%s|\n",lung_max,p_max);
}
void cuv_vocale(void){
int i;
puts("*** Cuvintele ce incep cu vocale:");
for(i=0;i<nr_cuv;i++)
switch(toupper(tab_cuv[i][0])){
case 'A': case'E': case 'I': case 'O': case 'U':puts(tab_cuv[i]);
} /* in loc de switch se putea folosi
char c; if(c=toupper(tab_cuv[i][0]),c=='A' ||
c=='E' || ...)puts(tab_cuv[i]); */
}
void main(void){
citire_cuv();
cuv_max();
constr_cuv();
cuv_vocale();
getch();
}
2. Test: Concatenarea a 2 siruri de caractere.
#include <stdio.h>
#include <string.h>
#define LUNGS 80
void main(void){
char s1[LUNGS],s2[LUNGS],s3[LUNGS],rezultat[LUNGS];
char *s1ptr=s1,*s2pos, *rezptr=rezultat;
while(s2pos=strstr(s1ptr,s2)){
while(s1ptr<s2pos)*rezptr++=*s1ptr++;
strcpy(rezptr,s3);
rezptr+=strlen(s3);
s1ptr+=strlen(s2);
}
strcpy(rezptr,s1ptr);
puts("*** sirul rezultat:"); puts(rezultat);
getch();
}
char s[NMAX],cv[NMAX],cuv[NMAX][25],*p,c;
int ncuv=0,l,i,j;
void generare2(int i)
{
strcpy(cv,cuv[i]);
l=strlen(cv);
if(l%2) { for(j=l/2;j<l-1;j++) cv[j]=cv[j+1]; cv[l-1]='\0';
}
printf("%s ",cv);
if (i<ncuv) { i++; generare2(i);
}
}
void generare1(int i)
{
strcpy(cv,cuv[i]); l=strlen(cv);
if(l>1) { cv[l-2]=cv[l-1]; cv[l-1]='\0'; } printf("%s ",cv);
if (i<ncuv) { i++; generare1(i); }
}
void generare(int i)
{
strcpy(cv,cuv[i]); l=strlen(cv); c=cv[0];
for(j=0;j<l-1;j++) cv[j]=cv[j+1]; cv[l-1]=c; printf("%s ",cv);
if (i<ncuv)
{ i++; generare(i); }
}
void main() {
printf("Introduceti şirul de caractere:\n"); gets(s);
// a)
printf("\n a) Deplasarea primei litere la sfarsitul cuvintelor:\n"); generare(0); printf("\b.\n\n");
// b)
printf("b) Inlaturarea penultimei litere a cuvintelor:\n"); generare1(0); printf("\b.\n\n");
// c)
printf("c) Inlaturarea literei din mijloc a cuvintelor de lungime impara:\n"); generare2(0); printf("\b.\n\n");
getch();
}
while(s[i]!='\0'&&c!='\0')
{ if (t%2==0)
{
while (s[i]!=' '&&s[i]!='\0')
{
s1[k]=s[i];
k++;
i++;
}
k--;
for (h=k;h>=0;h--,q++)
sr[q]=s1[h];
sr[q]=' ';
q++;
k=0;
}
c='1';
while(c!=' '&&c!='\0')
{
c=s[i];
i++;
}
t++;
}
sr[q-1]='\0';
//puts(sr);
printf("\n%d",con+1);
/*i=0;
while (sr[i]!='\0'){printf("%c",sr[i]);i++; } */
getch();
}
5.Test: Este dat un şir de caractere care conţine de la 5 până la 25 cuvinte si cuvintele sunt separate prin
spaţiu; iar dupa ultimul cuvint urmeaza punct.
deplasarea primei litere la sfârşitul cuvintului;
inlaturarea penultimei litere a cuvintului;
verificarea daca lungimea cuvintului este impara şi se înlătură litera din mijlocul lui.
// a)
printf("\n a) Deplasarea primei litere la sfarsitul cuvintelor:\n");
for(i=0;i<ncuv;i++) {
strcpy(cv,cuv[i]);
l=strlen(cv);
c=cv[0];
for(j=0;j<l-1;j++)
cv[j]=cv[j+1];
cv[l-1]=c;
printf("%s ",cv);
}
printf("\b.\n\n");
// b)
printf("b) Inlaturarea penultimei litere a cuvintelor:\n");
for(i=0;i<ncuv;i++) {
strcpy(cv,cuv[i]);
l=strlen(cv);
if(l>1) {
cv[l-2]=cv[l-1];
cv[l-1]='\0';
}
printf("%s ",cv);
}
printf("\b.\n\n");
// c)
printf("c) Inlaturarea literei din mijloc a cuvintelor de lungime impara:\n");
for(i=0;i<ncuv;i++) {
strcpy(cv,cuv[i]);
l=strlen(cv);
if(l%2) {
for(j=l/2;j<l-1;j++) cv[j]=cv[j+1];
cv[l-1]='\0';
}
printf("%s ",cv);
}
printf("\b.\n\n");
getch();
}