Pentru fisierele sursa cu rezolvarile, verificati arhiva.
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p02.c.html
/**
* Problema 2
*/
# include <stdio.h>
int main()
{
int v[100], n, i, np, nn, sp, sn;
printf("n = ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("v[%d] = ", i);
scanf("%d", &v[i]);
}
nn = np = 0; // numarul de numere negative / pozitive
sn = sp = 0; // suma numerelor negative / pozitive
for (i = 0; i < n; i++)
if (v[i] < 0) {
nn++;
sn += v[i];
}
else if (v[i] > 0) {
np++;
sp += v[i];
}
if (np == 0)
printf("MP = nu se poate calcula\n");
else
printf("MP = %.2f\n", (float)sp / np);
if (nn == 0)
printf("MN = nu se poate calcula\n");
else
printf("MN = %.2f\n", (float)sn / nn);
//fflush(stdin); getchar();
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p03.c.html
/**
* Problema 3
*/
# include <stdio.h>
# include <limits.h>
int main()
{
int a[100][100], n, m, i, j, max, min;
printf("m = ");
scanf("%d", &m);
printf("n = ");
scanf("%d", &n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
printf("a[%d][%d] = ", i, j);
scanf("%d", &a[i][j]);
}
min = INT_MAX;
for (i = 0; i < m; i++) {
max = a[i][0]; // initializam maximul cu prima valoare de pe linia i
for (j = 1; j < n; j++)
if (a[i][j] > max)
max = a[i][j];
if (min > max)
min = max;
}
printf(/*"Punct in sa = */"%d\n", min);
//fflush(stdin); getchar();
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p04.c.html
/**
* Problema 4
*/
# include <stdio.h>
int main()
{
int n, m, p, q, A[100][100], B[100][100], i, j, k;
int C[100][100] = {0}; // toate valorile initializate la 0
printf("m = ");
scanf("%d", &m);
printf("n = ");
scanf("%d", &n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &A[i][j]);
printf("p = ");
scanf("%d", &p);
printf("q = ");
scanf("%d", &q);
for (i = 0; i < p; i++)
for (j = 0; j < q; j++)
scanf("%d", &B[i][j]);
if (n != p) {
printf("nu se poate efectua A * B"); // afisam mesaj
return 0; // iesim din program
}
for (i = 0; i < m; i++)
for (j = 0; j < q; j++)
for (k = 0; k < n; k++)
C[i][j] += A[i][k] * B[k][j];
printf("%d %d\n", m, q);
for (i = 0; i < m; i++) {
for (j = 0; j < q; j++)
printf("%d ", C[i][j]);
printf("\n");
}
//fflush(stdin); getchar();
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p05.c.html
/**
* Problema 5
*/
# include <stdio.h>
int main()
{
int n, m, i, j, k, A[100], B[100], C[100];
//printf("n = ");
scanf("%d", &n);
//printf("m = ");
scanf("%d", &m);
for (i = 0; i < n; i++) {
//printf("A[%d] = ", i);
scanf("%d", &A[i]);
}
for (i = 0; i < m; i++) {
//printf("B[%d] = ", i);
scanf("%d", &B[i]);
}
k = 0; // incepem sa construim noul vector
i = 0;
j = 0;
while (i < n && j < m)
if (A[i] < B[j]) { // daca elementul curent din A este mai mic
C[k] = A[i];
i++; // avansam in A
k++;
}
else {
C[k] = B[j];
j++; // avansam in B
k++;
}
// la sfarsit adaugam elementele ramase in A sau in B
// tot timpul se va intra in cel mult unul din blocurile while
while (i < n) {
C[k] = A[i];
i++;
k++;
}
while (j < m) {
C[k] = B[j];
j++;
k++;
}
for (i = 0; i < n + m; i++)
printf("%d ", C[i]);
printf("\n");
//fflush(stdin); getchar();
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p06.c.html
/**
* Problema 6
*/
# include <stdio.h>
int main()
{
int n, A[100][100], B[100][100], i, j;
printf("n = ");
scanf("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &A[i][j]);
for (j = 1; j < n; j++){
for (i = n - j; i < n; i++)
printf("%d ", A[i][j]);
//printf("\n");
}
printf("\n");
//fflush(stdin); getchar();
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p07.c.html
/**
* Problema 7
*/
# include <stdio.h>
int main()
{
int V[100], n, i, max, maxstart, start;
printf("n = ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
//printf("V[%d] = ", i);
scanf("%d", &V[i]);
}
max = 0; maxstart = -1;
start = 0; // pozitia de start
for (i = 1; i < n; i++)
if (V[i - 1] > V[i]) { // daca secventa nu mai e crescatoare
if (i - start > max) { // verificam daca avem un nou maxim
max = i - start;
maxstart = start;
}
start = i;
}
for (i = maxstart; i < maxstart + max; i++)
printf("%d ", V[i]);
printf("\n");
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab4/rezolvari4p08.c.html
/**
* Problema 8
*/
#include <stdio.h>
int main(){
// Vom retine in vectorul bestSumEndingHere[] valoarea maxima a unei secvente care se termina
// pe pozitia "i" in vectorul initial (indiferent de cat de departe se extinde spre stanga)
int n, v[100], bestSumEndingHere[100], i, max, pmax, sum;
// Citirea datelor de intrare
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &v[i]);
// Observam ca daca am sti valoarea lui bestSumEndingHere[i-1], atunci am putea profita de acest
// lucru pentru a deduce rapid valoarea maxima a unei subsecvente care se termina pe pozitia "i"
// in vectorul initial. Stim deja ca bestSumEndingHere[i-1] reprezinta suma MAXIMA a unei subsecvente
// care se termina pe pozitia "i-1" in vectorul initial (deci mai bine de atat nu se poate), astfel ca
// practic avem doar doua posibilitati:
//
// 1) Sa "alipim" pe v[i] la acea subsecventa care se termina la "i-1"
//
// 2) Sa "aruncam" secventa care se termina la "i-1" si sa incepem una noua doar cu v[i]
//
// Deoarece ne intereseaza ca suma finala sa fie cat mai mare, vom alege a doua varianta doar daca suma
// maxima a unei subsecvente care se termina la "i-1" este negativa (si deci, mai mult incurca decat sa
// ne ajute).
//
// Pentru afisare, mai retinem si lungimile asociate si pozitiile unei am gasit cea mai buna solutie.
bestSumEndingHere[0] = 0;
int bestEndingOverall = 0;
int associatedLength = 1;
int currentLength = 1;
for(i = 1; i < n; i++){
// Decidem ce e mai bine: sa adaugam la secventa sau sa incepem alta noua
if (bestSumEndingHere[i-1] > 0) {
bestSumEndingHere[i] = bestSumEndingHere[i-1] + v[i];
currentLength++;
} else {
bestSumEndingHere[i] = v[i];
currentLength = 1;
}
// Decidem daca nu cumva am obtinut o solutie mai buna decat tot ce am vazut
// pana acum
if (bestSumEndingHere[i] > bestSumEndingHere[bestEndingOverall]){
bestEndingOverall = i;
associatedLength = currentLength;
}
}
//afisarea solutiei
for(i = bestEndingOverall-associatedLength+1; i <= bestEndingOverall; i++)
printf("%d ", v[i]);
printf("\n");
// P.S. In practica, este foarte incomod sa dati nume asa de lungi la variabile. Aici am scris asa doar
// pentru a incerca o rezolvare cat mai clara ;).
return 0;
}