Sunteți pe pagina 1din 11

Ex1:

Sa se citeasca de la tastatura un sir de caractere alfanumerice, terminat prin ENTER.


Scrie o functie, Invert, al carei parametru este sirul citit. Rolul functiei este sa inverseze sirul citit.
In functia Invert foloseste doar un singur array de caractere.
Programul se termina prin apasarea CTRL-Z.

Ajutor: Pentru citirea caracterelor de la tastatura foloseste functia getchar().

Exemplu 1:
Introdu sirul: “abcd” <ENTER>
Sirul inversat: “dcba”

Exemplu 2:
Introdu sirul: “ab 12 ., cd” <ENTER>
Sirul inversat: “dc21ba”

REZOLVARE:
Ex2:
i) Sa se citeasca de la tastatura un prim sir de caractere alfanumerice, terminat prin ENTER.
ii) Sa se citeasca de la tastatura un al doilea sir de caractere alfanumerice, terminat prin ENTER.
iii) Sa se citeasca de la tastatura un numar zecimal, terminat prin ENTER.

Sa se scrie o functie Insert avind ca parametrii cele doua siruri citite precum si numarul introdus.
Rolul functiei este sa insereze in primul sir citit la pasul i), la indexul dat in pasul iii), al doilea sir de
caratere citit la pasul ii).
In functia Insert foloseste doar doua array-uri de caractere, cite unul pentru fiecare sir citit. Sirul
rezultat prin inserare pune-l in primul array.
Programul se termina prin apasarea CTRL-Z.

Cazuri de luat in calcul: al doilea sir se introduce la:


- inceputul primului sir
- sfirsitul primului sir
- pozitia este negative
- numarul introdus ca pozitie este mai mare decit lungimea primului sir

Exemplu 1:
Introdu primul sir: “abcdef” <ENTER>
Introdu al doilea sir: “123’ <ENTER>
Introdu pozitia: 3 <ENTER>
Sirul rezultat: “ab123cdef”
Ex3:
i) Sa se citeasca de la tastatura un prim sir de caractere alfanumerice, str1, terminat prin ENTER.
ii) Sa se citeasca de la tastatura un al doilea sir de caractere alfanumerice, str2, terminat prin ENTER.

Sa se scrie o functie Delete avind ca parametrii cele doua siruri citite, str1 si str2. Rolul functiei este
sa stearga din str1 toate caracterele introduse in str2.
In functia Delete foloseste doar doua array-uri de caractere, cite unul pentru fiecare sir citit. Sirul
rezultat pune-l in primul array.
Programul se termina prin apasarea CTRL-Z.

Exemplu 1:
input alphanumeric string1: “abcd % abcd” <ENTER>
input alphanumeric string2:  “a^cf” <ENTER>
alphanumeric string1 you entered: “abcd abcd”
alphanumeric string2 you entered: “acf”
resulted string: “bdbd”
Ex4:
Codul sursa:
1. Sa fie lizibil, minimal si documentat.
2. Numele variabilelor si al functiilor sa aiba sens.
3. Sa fie structurat logic dpdv al functionalitatii: functii cu scop logic minimal si clar definit.
4. Sa nu existe warnings/errors de compiler/linker.
5. Sa poata fi usor extins/reutilizat (prin adaugarea de noi exercitii).

Programul:
1. Sa fie usor de folosit si de inteles: ‘user friendly’ si ‘self-explanatory’.
2. Sa aiba o interfata cu utilizatorul din care utilizatorul sa poata naviga cu usurinta in toate
exercitiile implementate.
3. Utilizatorul sa aiba posibilitatea de a iesi din aplicatie in orice moment.

Alte idei de imbunatatire?


Poate scrierea unor teste? …

Ex5:
Scrie o functie pentru un array 2D de dimensiunile 3x3 care sa afiseze matricea.

Ex6:
Scrie o functie care sa adune 2 matrici de dimensiunea NxM si sa afiseze rezultatul.

Ex7: Pointeri
- Studiaza exrcitiile de la
https://www.w3resource.com/c-programming-exercises/pointer/index.php

Ex8:

De citit:
https://www.tutorialspoint.com/cprogramming/c_pointers.htm
https://www.cs.utah.edu/~germain/PPS/Topics/C_Language/c_functions.html

Exercitii:
- Write a C program to swap two numbers using pointers.
- Write a C program to copy one array to another using pointers.
- Write a C program to swap two arrays using pointers.
Ex:
Input
Input first array: 10 20 30 40 50 60 70 80 90 100
Input second array: 0 9 8 7 6 5 4 3 2 1

Output
First array after swapping: 0 9 8 7 6 5 4 3 2 1
Second array after swapping:  10 20 30 40 50 60 70 80 90 100
- Write a C program to reverse an array using pointers.
- Write a C program to search an element in array using pointers.

Ex9:

De refacut:
- copy (cu alocare dinamica)
- swap (pointer arithmetics).
- reverse (un char intermediar nu un array de char)

Rescrie Ex1 si Ex2 folosind alocare dinamica de memorie.

Userul sa introduca la pasul 1 numarul de caractere din sir, apoi sa introduca sirul.

Ex10:

Prefata Ex10:

Whenever a key is depressed the code for that key is placed in the keyboard buffer. When that code
is processed, it is removed from the buffer. So you can think of the keyboard buffer as being a
pipeline full of all of the keystrokes that haven't been taken care of yet.
int kbhit(void);
This function doesn't take any arguments and returns 0 (False) if the the keyboard buffer is empty
and returns something other than zero (True) if the keyboard buffer has anything in it.
Note that this function does not alter the contents of the buffer - it only tests to see if it is empty or
not. 
int getch(void);
This function actually removes a character from the keyboard buffer and returns the ASCII code of
that character.
int putch(int c);
This function prints the character whose ASCII code is c at the present cursor location of the display
device. 
The return value, which is seldom checked or used, is simply the character that was printed if the
operation was successful or EOF (a constant defined in the standard library files) if it was not.
void gotoxy(int col, int row);
This function places the cursor at the row and column that are passed to it. Nothing is actually
printed. The next character that is printed will be printed at that location - unless some other
instruction moves the cursor, of course.
The console display (the screen) is a window that has:
 25 rows starting with row 1 at the top and row 25 at the bottom.
 80 columns starting with column 1 at the left and column 80 at the right.

Functia gotoxy nu este suportata in VisualStudio si va trebui sa folosesti inlocuitorul:


#include <stdio.h>
#include <conio.h>
#include <windows.h>

void gotoxy( int column, int line )


 {
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
 }

CerintaEx10:

La pornirea aplicatiei cursorul va fi afisat pe mijlocul consolei (randul 15, coloana 40)
Programul va monitoriza daca este apasata o tasta de la tastatura si va trebui sa execute o actiune in
functie de tasta apasata astfel:
- S-a apasat tasta „←”(sageata stanga) se va muta cursorul la stanga cu o pozitie si se va afisa
caracterul „*”;
- S-a apasat tasta „↑” (sageata sus) se va muta cursorul in sus cu o pozitie si se va afisa
caracterul „*”;
- S-a apasat tasta „→”(sageata dreapta) se va muta cursorul la dreapta cu o pozitie si se va
afisa caracterul „*”;
- S-a apasat tasta „↓”(sageata jos) se va muta cursorul in jos cu o pozitie si se va afisa
caracterul „*”;
- S-a apasat tasta „Esc” se va sterge ecranul, iar cursorul va reveni pe mijlocul consolei;

Asteptari in urma implementarii Ex1:

Prin rularea programului ma astept sa se poata „desena” in consola prin intermediul tastelor
„←↑→↓”.
Prin intermediul folosirii functiei kbhit(void) se va putea controla starea programului in timpul
executiei.

Ex11:

CerintaEx11:

Folosind cunostintele dobandite la exercitiul anterior programul va trebui sa fie implementat pe baza
unui „state machine” astfel:

„state machine” va fi retinut prin intermediul unei variabile globale de tip int.
Aceasta variabila va trebui sa aiba doar urmatoarele valori si intelesuri:
0 – programul se initializeaza
1 – programul este in asteptare – se asteapta comenzi
11 – executia corespunzatoare pentru tasta „ ←”(sageata stanga)
12 – executia corespunzatoare pentru tasta „ ↑” (sageata sus)
13 – executia corespunzatoare pentru tasta „ →”(sageata dreapta)
14 – executia corespunzatoare pentru tasta „ ↓”(sageata jos)

La pornirea aplicatiei variabile folosita pentru „state machine” va avea valoarea 0.


In funtie de valoarea „state machine” se vor executa urmatoarele:
„state machine” == 0 - se schimba „state machine” la valoarea 1.

„state machine” == 1 - programul este in asteptare de comezi de la tastatura si in functie de


tasta apasata se va schimba „state machine” la valoarea 11, 12, 13 sau 14, se scrie in consola
incepand cu coloana 1 si randul 1, starea anterioara de executie a programului.

„state machine” == 11 - S-a apasat tasta „ ←”(sageata stanga) si se va muta cursorul la


stanga cu o pozitie, unde se va afisa caracterul „*” , se va schimba „state machine” la
valoarea 1;

„state machine” == 12 - S-a apasat tasta „ ↑” (sageata sus) se va muta cursorul in sus cu o
pozitie si se va afisa caracterul „*” , se va schimba „state machine” la valoarea 1;

„state machine” == 13 - S-a apasat tasta „ →”(sageata dreapta) se va muta cursorul la


dreapta cu o pozitie si se va afisa caracterul „*” , se va schimba „state machine” la valoarea
1;

„state machine” == 14 - S-a apasat tasta „ ↓”(sageata jos) se va muta cursorul in jos cu o
pozitie si se va afisa caracterul „*” , se va schimba „state machine” la valoarea 1;

Asteptari in urma implementarii Ex11:

Prin rularea programului ma astept sa se poata „desena” in consola prin intermediul tastelor
„←↑→↓” exact si identic ca la exercitiul anterior, dar suplimentar sa se foloseasca un „state
machine” in implementare si sa fie afisata in consola starea acestui „state machine”

Ex12:

Pornind de la exercitiul2 sa se implementeze urmatoarele functionalitati:


- Se vor afisa doar ultimele 7 „*” pe ecran – astfel ceea ce se „deseneaza” prin intermediul
tastelor directionale va semana cu un  „sarpe/rama” cu lungime fixa, formata din 7 caractere
„*”
Pentru implementarea cerintei de mai sus, ma astept sa existe o noua stare (o noua valoare pentru
„state machine”) prin intermediul careia sa se realizeze „scurtarea” la 7 caractere.

Ex13:

Pornind de la exercitiul 3 se  dorecte sa se implementeze urmatoarele functionalitati:


- Cand „state machine” are valoarea 0 se va afisa in consola un meniu de alegere, pentru
modul de functionare a programului in cazul coliziunii sarpelui cu chenarul consolei:
o Sarpele nu poate inainta la contactul cu chenarul;
 Sarpele cand se loveste frontal de limita ecranului definit nu mai poate
inainta si nu i se reduce lungimea
 Sarpele cand se loveste frontal de limita ecranului poate sa continue
deplasarea doar in celelalte directii care permit inaintarea
 Sarpele poate inainta tangential la limita ecranului
o Sarpele trece de chenar si apare din partea opusa a ecranului;
 Sarpele cand se loveste frontal de limita ecranului va fi „teleportat” segment
cu segment in partea opusa a ecranului definit.

-----------------------------------------------------------------------------------------------------

S-ar putea să vă placă și