codice:
#include <stdio.h>
const int cd = 0;
const int qt = 1;
int somma(int N[][2], int K, int M[][2], int Y, int S[][2]) {
int k = 0, y = 0, s = 0;
while(k < K || y < Y) {
if(k >= K || y >= Y) { //copia gli elementi rimasti
for( ; k < K; ++k) {
S[s][cd] = N[k][cd];
S[s][qt] = N[k][qt];
++s;
}
for( ; y < Y; ++y) {
S[s][cd] = M[y][cd];
S[s][qt] = M[y][qt];
++s;
}
}
else {
if(N[k][cd] == M[y][cd]) {
S[s][cd] = N[k][cd];
S[s][qt] = N[k][qt] + M[y][qt];
++s; ++k; ++y;
}
else if(N[k][cd] < M[y][cd]) {
S[s][cd] = N[k][cd];
S[s][qt] = N[k][qt];
++s; ++k;
}
else { //if(N[k][cd] > M[y][cd])
S[s][cd] = M[y][cd];
S[s][qt] = M[y][qt];
++s; ++y;
}
}
}
return s;
}
int main(void) {
int K, Y;
printf("Numero di entry in negozio: ");
scanf("%d", &K);
printf("Numero di entry in magazzino: ");
scanf("%d", &Y);
int N[K][2];
int M[Y][2];
puts("Tablet in negozio:");
for(int i = 0; i < K; ++i) {
printf("Codice: ");
scanf("%d", &N[i][cd]);
printf("Quantita': ");
scanf("%d", &N[i][qt]);
}
puts("Tablet in magazzino:");
for(int i = 0; i < Y; ++i) {
printf("Codice: ");
scanf("%d", &M[i][cd]);
printf("Quantita': ");
scanf("%d", &M[i][qt]);
}
int S[K+Y][2];
int H = somma(N, K, M, Y, S);
puts("Quantita' totali:");
for(int i = 0; i < H; ++i) {
printf("%d: %d\n", S[i][cd], S[i][qt]);
}
return 0;
}
Assunzioni input: l'inserimento è ordinato per codice, altrimenti ovviamente la funzione con funziona correttamente.
Come funziona?
Essendo che le entry sono ordinate per codice, scorrendoli in ordine o uno è minore dell'altro, in questo caso non c'è un corrispettivo nell'altra tabella e puoi copiarlo subito, o sono uguali, in questo caso c'è un match.
Assunzioni sui risultati:
cds(M/N) insieme dei codici
Dimensione minima della tabella di somma = min(K, Y) nel caso in cui cds(M) contenuto cds(N) o cds(N) contenuto cds(M)
Dimensione massima della tabella di somma = K+Y nel caso in cui cds(M) e cds(N) siano disgiunti
La tabella di output resta ordinata rispetto al codice
Assunzioni sul codice: standard C99