Sei sulla pagina 1di 16

Gavrila Cristina Gabriela

Informatica Aplicata – 10LF392

TEMA - ALGORITMICĂ LABORATOR 3 (MATRICE)

1. Cerință: Se citește o matrice M[n,n] dintr-un fișier. Să se afiseze indicii acelor linii situate sub diagonala secundara care au toate valorile cu numar par de cifre.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

int getDigitsnumber(int number)


{
int digitsnumber = 0;
do
{
digitsnumber++;
number /= 10;
} while (number);
return digitsnumber;
}

bool underSecondDiagonal(int matrice[][10], int lineNumber, int columnNumber, int currentLine)


{
bool allHaveEvenDigitsNumber = true;
for (int currentColumn = lineNumber - currentLine; currentColumn < lineNumber; currentColumn++)
if (getDigitsnumber(matrice[currentLine][currentColumn]) % 2 != 0)
{
allHaveEvenDigitsNumber = false;
break;
}
if (allHaveEvenDigitsNumber)

1
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

return true;
return false;
}

int main()
{
int matrice[10][10], lineNumber, columnNumber, currentLine;
string filePathRead = "fileIn.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
for (currentLine = 1; currentLine < lineNumber; currentLine++)
if (underSecondDiagonal(matrice, lineNumber, columnNumber, currentLine))
cout << "Linia " << currentLine + 1 << " are toate elementele de sub diagonala secundara cu numar par de cifre."<<'\n';
}

2
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

2. Cerință: Se dă o matrice cu m linii şi n coloane având ca elemente valori de 0 şi 1 citită dintr-un fișier. Fiecare linie reprezintă câte un număr în baza 2. Să se afişeze aceste numere.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

int powerOfBase(int index)


{
int powerOfBase = 1;
for (int i = 1; i < index; i++)
powerOfBase *= 2;
return powerOfBase;
}

int transformNumberInBase10(int matrice[][10], int columnNumber, int currentLine)


{
int numberinBase10 = 0;
for (int currentColumn = columnNumber - 1; currentColumn >= 0; currentColumn--)
numberinBase10 += matrice[currentLine][currentColumn] * powerOfBase(currentColumn);
return numberinBase10;
}

int main()
{
int matrice[10][10], lineNumber, columnNumber, currentLine;
string filePathRead = "fileIn.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
for (currentLine = 0; currentLine < lineNumber; currentLine++)
cout << transformNumberInBase10(matrice, columnNumber,currentLine)<<'\n';
}

3
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

3. Cerință: Să se completeze elementele unei matrice de dimensiune n×n în modul următor: pe diagonala principală cu valoarea 1, pe semidiagonalele alăturate diagonalei principale
cu valoarea 2, pe următoarele semidiagonale valoarea 3 etc. Să se scrie această matrice într-un fișier.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void writeMatrixToFile(int matrice[10][10], int lineNumber, int columnNumber, string filePath)


{
ofstream myfile(filePath);
if (myfile.is_open())
{
myfile << lineNumber << ' ' << columnNumber << '\n';
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
{
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile << matrice[currentLine][currentColumn] << ' ';
myfile << '\n';
}
myfile.close();
}
else
cout << "Unable to open file";
}

void generateFirstDiagonal(int matrice[][10], int columnAndLineNumber)


{
int elementValue = 1;
for (int currentLine = 0; currentLine < columnAndLineNumber; currentLine++)
matrice[currentLine][currentLine]= elementValue;
}

void generateAboveFirstDiagonal(int matrice[][10], int columnAndLineNumber)


{
int elementValue = 1;
for (int currentLine = 0; currentLine < columnAndLineNumber; currentLine++)
{
for (int currentColumn = currentLine + 1; currentColumn < columnAndLineNumber; currentColumn++)
{
matrice[currentLine][currentColumn] = elementValue + 1;
elementValue++;
}
elementValue = 1;
}
}

4
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

void generateBelowFirstDiagonal(int matrice[][10], int columnAndLineNumber)


{
int elementValue = 1;
for (int currentLine = 0; currentLine < columnAndLineNumber; currentLine++)
{
for (int currentColumn = currentLine-1; currentColumn >= 0; currentColumn--)
{
matrice[currentLine][currentColumn]= elementValue +1;
elementValue++;
}
elementValue =1;
}
}

int main()
{
int matrice[10][10], columnAndLineNumber;
string filePathWrite = "fileOut.txt";
cout << "Introduceti dimensiunea matricei patratice: ";
cin >> columnAndLineNumber;
generateFirstDiagonal(matrice, columnAndLineNumber);
generateAboveFirstDiagonal(matrice, columnAndLineNumber);
generateBelowFirstDiagonal(matrice, columnAndLineNumber);
writeMatrixToFile(matrice, columnAndLineNumber, columnAndLineNumber, filePathWrite);
}

5
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

4. Cerință: Fiind dată o matrice pătratică (citită din fișier), să se calculeze suma elementelor pentru fiecare dintre cele 4 zone determinate de diagonala principală şi secundară.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[10][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

void getSums(int matrice[10][10], int lineAndColumnNumber, int sums[])


{
for (int currentLine = 0; currentLine < lineAndColumnNumber; currentLine++)
for (int currentColumn = 0; currentColumn < lineAndColumnNumber; currentColumn++)
{
if ((currentLine <= currentColumn) && (currentLine + currentColumn <= lineAndColumnNumber - 1))
sums[0] += matrice[currentLine][currentColumn];
if ((currentLine <= currentColumn) && (currentLine + currentColumn >= lineAndColumnNumber - 1))
sums[1] += matrice[currentLine][currentColumn];
if ((currentLine >= currentColumn) && (currentLine + currentColumn >= lineAndColumnNumber - 1))
sums[2] += matrice[currentLine][currentColumn];
if ((currentLine >= currentColumn) && (currentLine + currentColumn <= lineAndColumnNumber - 1))
sums[3] += matrice[currentLine][currentColumn];
}
}

void writeSums(int sums[])


{
cout << "Suma zonei de sus este: " << sums[0] << endl;
cout << "Suma zonei din dreapta este: " << sums[1] << endl;
cout << "Suma zonei de jos este: " << sums[2] << endl;
cout << "Suma zonei din stanga este: " << sums[3] << endl;
}

6
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

int main()
{
int matrice[10][10], lineAndColumnNumber, sums[] = { 0,0,0,0 };
string filePathRead = "fileIn.txt";
readMatrixFromFile(matrice, lineAndColumnNumber, lineAndColumnNumber, filePathRead);
getSums(matrice, lineAndColumnNumber, sums);
writeSums(sums);
}

7
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

5. Cerință: Se citește o matrice M[m,n] dintr-un fișier. Să se insereze inaintea fiecarei coloane care are primul element palindrom, o noua coloana care sa contina cel mai mare divizor
comun al elementelor coloanei respective. Să se scrie noua matrice într-un fișier.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

int reversedNumber(int number)


{
int inv = 0;
while (number)
{
inv = inv * 10 + number % 10;
number = number / 10;
}
return inv;
}

bool isPalindrom(int number)


{
if (reversedNumber(number) == number)
return true;
return false;
}

8
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

void writeMatrixToFile(int matrice[][10], int lineNumber, int columnNumber, string filePath)


{
ofstream myfile(filePath);
if (myfile.is_open())
{
myfile << lineNumber << ' ' << columnNumber << '\n';
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
{
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile << matrice[currentLine][currentColumn] << ' ';
myfile << '\n';
}
myfile.close();
}
else
cout << "Unable to open file";
}

int greatestCommonFactor(int firstNumber, int secondNumber)


{
int rest;
while (secondNumber > 0)
{
rest = firstNumber % secondNumber;
firstNumber = secondNumber;
secondNumber = rest;
}
return firstNumber;
}

int greatestCommonFactorOfCollumn(int matrice[][10], int lineNumber, int currentColumn)


{
int currentGreatestCommonFactor = matrice[0][currentColumn];
for (int currentLine = 0; currentLine < lineNumber - 1; currentLine++)
currentGreatestCommonFactor = greatestCommonFactor(currentGreatestCommonFactor, matrice[currentLine + 1][currentColumn]);
return currentGreatestCommonFactor;
}

void insertColumn(int matrice[][10], int lineNumber, int& columnNumber, int positionOfInsertedCollumn, int insertedNumber)
{
columnNumber++;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = columnNumber - 1; currentColumn > positionOfInsertedCollumn; currentColumn--)
matrice[currentLine][currentColumn] = matrice[currentLine][currentColumn - 1];
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
matrice[currentLine][positionOfInsertedCollumn] = insertedNumber;
}
9
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

int main()
{
int matrice[10][10], lineNumber, columnNumber;
string filePathRead = "fileIn.txt";
string filePathWrite = "fileOut.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
if (isPalindrom(matrice[0][currentColumn]))
{
insertColumn(matrice, lineNumber, columnNumber, currentColumn, greatestCommonFactorOfCollumn(matrice,lineNumber, currentColumn));
currentColumn++;
}
writeMatrixToFile(matrice, lineNumber, columnNumber, filePathWrite);
}

10
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

6. Cerință: Se citește o matrice M[m,n] dintr-un fișier. Să se șteargă liniile din matrice care au toate elementele numere cu suma cifrelor pară. Să se scrie noua matrice într-un fișier.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

int sumOfDigits(int number)


{
int sum=0;
while (number)
{
sum += number % 10;
number /= 10;
}
return sum;
}

bool allHaveSumOfDigitsEven(int matrice[][10], int columnNumber, int currentLine)


{
bool allHaveSumOfDigitsEven = true;
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
if (sumOfDigits(matrice[currentLine][currentColumn]) % 2 != 0)
{
allHaveSumOfDigitsEven = false;
break;
}
if (allHaveSumOfDigitsEven)
return true;
return false;
}

11
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

void deleteLine(int matrice[][10], int& lineNumber, int columnNumber, int positionOfDeletedLine)


{
for (int currentLine = positionOfDeletedLine; currentLine < lineNumber - 1; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
matrice[currentLine][currentColumn] = matrice[currentLine + 1][currentColumn];
lineNumber--;
}

void writeMatrixToFile(int matrice[][10], int lineNumber, int columnNumber, string filePath)


{
ofstream myfile(filePath);
if (myfile.is_open())
{
myfile << lineNumber << ' ' << columnNumber << '\n';
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
{
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile << matrice[currentLine][currentColumn] << ' ';
myfile << '\n';
}
myfile.close();
}
else
cout << "Unable to open file";
}

int main()
{
int matrice[10][10], lineNumber, columnNumber;
string filePathRead = "fileIn.txt";
string filePathWrite = "fileOut.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
if (allHaveSumOfDigitsEven(matrice, columnNumber, currentLine))
{
deleteLine(matrice, lineNumber, columnNumber, currentLine);
currentLine--;
}
writeMatrixToFile(matrice, lineNumber, columnNumber, filePathWrite);
}

12
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

7. Cerință: Se citește o matrice M[n,n] de la tastatura. Să se roteasca matricea cu 90 de grade, in sens trigonometric. Să se afișeze noua matrice în consolă.

#include <iostream>

void readMatrix(int matrice[10][10], int& lineAndColumnNumber)


{
std::cout << "Introduceti numarul de linii si coloane al matricei: ";
std::cin >> lineAndColumnNumber;
std::cout << "Introduceti elementele matricei: " << '\n';
for (int currentLine = 0; currentLine < lineAndColumnNumber; currentLine++)
for (int currentColumn = 0; currentColumn < lineAndColumnNumber; currentColumn++)
std::cin >> matrice[currentLine][currentColumn];
}

void transposeMatrix(int matrice[10][10], int lineAndColumnNumber)


{
for (int currentLine = 0; currentLine < lineAndColumnNumber; currentLine++)
for (int currentColumn = currentLine; currentColumn < lineAndColumnNumber; currentColumn++)
{
int aux = matrice[currentLine][currentColumn];
matrice[currentLine][currentColumn] = matrice[currentColumn][currentLine];
matrice[currentColumn][currentLine] = aux;
}
}

void switchColumns(int matrice[10][10], int lineAndColumnNumber)


{
int k;
for (int currentLine = 0; currentLine < lineAndColumnNumber; currentLine++)
{
k = lineAndColumnNumber - 1;
for (int currentColumn = 0; currentColumn < k; currentColumn++)
{
int aux = matrice[currentColumn][currentLine];
matrice[currentColumn][currentLine] = matrice[k][currentLine];
matrice[k][currentLine] = aux;
k--;
}
}
}

13
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

void writeMatrix(int matrice[10][10], int lineAndColumnNumber)


{
std::cout << "Matricea rotita cu 90 de grade, in sens trigonometric este: " << '\n';
for (int currentLine = 0; currentLine < lineAndColumnNumber; currentLine++)
{
for (int currentColumn = 0; currentColumn < lineAndColumnNumber; currentColumn++)
std::cout << matrice[currentLine][currentColumn] << ' ';
std::cout << '\n';
}
}

int main()
{
int matrice[10][10], lineAndColumnNumber;
readMatrix(matrice, lineAndColumnNumber);
transposeMatrix(matrice, lineAndColumnNumber);
switchColumns(matrice, lineAndColumnNumber);
writeMatrix(matrice, lineAndColumnNumber);
}

14
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

8. Cerință: Să se sorteze elementele de pe diagonala secundară a unei matrice (citită din fișier) prin interschimbarea liniilor și coloanelor corespunzătoare elementelor. Să se scrie
noua matrice în același fișier.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string filePath)


{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

void swap2Lines(int matrice[10][10], int columnNumber, int firstLineToSwap, int secondLineToSwap)


{
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
{
int auxiliar = matrice[firstLineToSwap][currentColumn];
matrice[firstLineToSwap][currentColumn] = matrice[secondLineToSwap][currentColumn];
matrice[secondLineToSwap][currentColumn] = auxiliar;
}
}

void swap2Columns(int matrice[10][10], int lineNumber, int firstColumnToSwap, int secondColumnToSwap)


{
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
{
int auxiliar = matrice[currentLine][firstColumnToSwap];
matrice[currentLine][firstColumnToSwap] = matrice[currentLine][secondColumnToSwap];
matrice[currentLine][secondColumnToSwap] = auxiliar;
}
}

15
Gavrila Cristina Gabriela
Informatica Aplicata – 10LF392

void sortSecondDiagonal(int matrice[][10], int lineNumber, int columnNumber)


{
for (int currentLine = 0; currentLine < lineNumber - 1; currentLine++)
for (int nextLine = currentLine + 1; nextLine < lineNumber; nextLine++)
if (matrice[currentLine][lineNumber - currentLine - 1] > matrice[nextLine][lineNumber - nextLine - 1])
{
swap2Lines(matrice, columnNumber, currentLine, nextLine);
swap2Columns(matrice, lineNumber, lineNumber - currentLine - 1, lineNumber - nextLine - 1);
}
}

void writeMatrixToFile(int matrice[][10], int lineNumber, int columnNumber, string filePath)


{
ofstream myfile(filePath);
if (myfile.is_open())
{
myfile << lineNumber << ' ' << columnNumber << '\n';
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
{
for (int currentColumn = 0; currentColumn < columnNumber; currentColumn++)
myfile << matrice[currentLine][currentColumn] << ' ';
myfile << '\n';
}
myfile.close();
}
else
cout << "Unable to open file";
}
int main()
{
int matrice[10][10], lineNumber, columnNumber;
string filePathRead = "fileIn.txt";
string filePathWrite = "fileIn.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
sortSecondDiagonal(matrice, lineNumber, columnNumber);
writeMatrixToFile(matrice, lineNumber, columnNumber, filePathWrite);
}

16

Potrebbero piacerti anche