Se afișează postările cu eticheta clasa-xi. Afișați toate postările
Se afișează postările cu eticheta clasa-xi. Afișați toate postările

Problemă rezolvată matrice clasa a XI-a mate-info neintensiv

Enunț

Fiind dată o matrice a cu m linii și n coloane cu elemente numere întregi, scrieți un program care:

1. Determină media aritmetică a elementelor matricii;
2. Afișează numărul elementelor pozitive, numărul elementelor negative și numărul elementelor nule din matrice;
3. Tipărește elementele pare aflate pe linii impare și coloane divizibile cu 3.

Rezolvare

#include <fstream>
using namespace std;


const int maxn = 101;
const int maxm = 101;


int main()
{
 int N, M, A[maxm][maxn];
 int nrElPoz = 0, nrElNeg = 0,
  nrElNule = 0, contor = 0,
  ma = 0;


 ifstream in("fisier.in");
 in >> N >> M;
 for (int i = 1; i <= N; ++i)
 {
  for (int j = 1; j <= M; ++j)
  {
   in >> A[i][j];


   // adunarea numerelor pt. calculul
   // mediei aritmetice:
   ma += A[i][j];


   // cele 4 contoare:
   if (A[i][j] == 0)
   {
    ++nrElNule;
   }
   else if (A[i][j] > 0)
   {
    ++nrElPoz;
   }
   else // if (A[i][j] < 0)
   {
    ++nrElNeg;
   }


   if (A[i][j] % 2 == 0 && (i + 1) % 2 != 0 &&
    (j + 1) % 3 == 0)
   {
    ++contor;
   }
  }
 }
 ma /= N * M;
 in.close();


 ofstream out("fisier.out");
 out << "Media aritmetica: " << ma << endl;
 out << "Nr. elemente pozitive: " << nrElPoz << endl;
 out << "Nr. elemente nule: " << nrElNule << endl;
 out << "Nr. elemente negative: " << nrElNeg << endl;
 out << "Nr. elemente pare pe linii impare si coloane div. cu 3: " <<
  contor << endl;


 out.close();

 return 0;
}

Schemă

Notă: în unele locuri s-a referit la A[i][j] prin sintaxa A(i, j).


Explicații

Rezolvarea aceasta citește și scrie în fișier, nu pe ecran. Fișier de intrare: fisier.in, fișier de ieșire: fisier.out.

Cu excepția împărțirii sumei pentru aflarea mediei aritmetice, toate calculele se fac pe măsură ce se citește din fișierul de intrare.

Problemă rezolvată șir de caractere clasa a XI-a mate-info neintensiv #6

Enunț

Se citește de la tastatură un șir de maxim 70 caractere. Să se afișeze, unul sub altul, caracterele distincte din șir împreună cu frecvențele lor de apariție. Pe fiecare rând se va afișa un caracter urmat de frecvența sa în șir (prin frecvența de apariție a unui caracter se înțelege de câte ori apare caracterul respectiv în șir). Exemplu: Dacă se citește șirul "abracadabra", programul a afișa ceea ce apare în figură.

Rezolvare

#include <iostream>
#include <cstring>
using namespace std;


int main()
{
 char s[71];
 int l;


 cout << "Introduceti un sir: ";
 cin >> s;


 l = strlen(s);

 char caractere[30];
 int lCaractere = 0;


 int frecvente[30];

 for (int i = 0; i < l; ++i)
 {
  bool existaDeja = false;
  for (int j = 0; j < lCaractere; ++j)
  {
   if (caractere[j] == s[i])
   {
    existaDeja = true;


    ++frecvente[j];

    break;
   }
  }


  if (!existaDeja)
  {
   ++lCaractere;
   caractere[lCaractere - 1] = s[i];
   frecvente[lCaractere - 1] = 1;
  }
 }


 for (int i = 0; i < lCaractere; ++i)
 {
  cout << caractere[i] << " ->   " << frecvente[i] << endl;
 }


 return 0;
}

Vizual

Explicații

O implementare alternativă ar folosi clasa map din S.T.L.

Problemă rezolvată șir de caractere clasa a XI-a mate-info neintensiv #5

Enunț

Se citește de la tastatură un număr întreg cu maxim 8 cifre. Să se elimine o cifră aleasă astfel încât numărul rămas să aibă cifrele în ordine crescătoare. Dacă sunt mai multe soluții se vor afișa toate, iar dacă problema nu are nici o soluție se va tipări un mesaj.

Exemplu: pentru m=2435, poate fi eliminată cifra 3 rămânând numărul 245, sau cifra 4 rămânând numărul 235.

Rezolvare

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
 char s[9];
 int l;

 cout << "Introduceti un numar: ";
 cin >> s;
 l = strlen(s);

 bool existaSolutie = false;
 for (int i = 0; i < l; ++i)
 {
  char s2[9];
  strcpy_s(s2, s);

  for (int j = i + 1; j < l; ++j)
  {
   s2[j - 1] = s2[j];
  }
  s2[l - 1] = '\0';

  bool sc = true;
  for (int j = 1; j < l - 1; ++j)
  {
   if ((s2[j - 1] - '0') > (s2[j] - '0'))
   {
    sc = false;
    break;
   }
  }

  if (sc)
  {
   cout << s2 << endl;
   existaSolutie = true;
  }
 }

 if (!existaSolutie)
 {
  cout << "Nu exista solutii." << endl;
 }

 return 0;
}

Vizual

Explicații

strcpy_s este varianta sigură a strcpy în Visual C++, folosită fiindcă strcpy dă eroare de compilare.

Exemple de încercat:

  • 123456
  • 5432

Problemă rezolvată șir de caractere clasa a XI-a mate-info neintensiv #4

Enunț

Se citește de la tastatură un șir alcătuit din cel mult 100 litere mici ale alfabetului englez. Acest șir va fi supus unor procese de eliminare a tuturor secvențelor de caractere identice situate pe poziții alăturate, eliminările reluându-se până când șirul nu mai conține succesiuni de caractere alăturate egale. Realizați un program care afișează șirul rezultat după aplicarea algoritmului de mai sus.

Exemplu: pentru șirul "vacaantaaa" vom obține în ordine: "vacntaaa" și "vacnt".

Vizual

Exemple de încercat

  • teesst
  • abbc
  • cool
  • rezolvareaa

Rezolvare

#include <iostream>
#include <cstring>
using namespace std;


int main()
{
 char s[101];
 cout << "Sir: "; cin >> s;


 bool schimbare;
 do
 {
  schimbare = false;
  int inceput = -1;
  int sfarsit = -1;
  bool in = false;


  int l = strlen(s);

  for (int i = 0; i < l - 1; ++i)
  {
   if (s[i] == s[i + 1])
   {
    if (in)
    {
     sfarsit = i + 1;
    }
    else
    {
     in = true;
     inceput = i;
     sfarsit = i + 1;
     schimbare = true;
    }
   }
   else
   {
    if (in)
    {
     in = false;
     break;
    }
   }
  }
  if (schimbare)
  {
   for (int i = sfarsit + 1; i < l; ++i)
   {
    s[i - sfarsit + inceput - 1] = s[i];
   }
   l = l - (sfarsit - inceput + 1);
   s[l] = '\0';


   cout << s << endl;
  }
 } while (schimbare);


 return 0;
}

Problemă rezolvată șir de caractere clasa a XI-a mate-info neintensiv

Enunț

Un cuvânt este palindrom dacă citind literele de la dreapta la stânga obținem același cuvânt (de exemplu, cuvintele "cojoc" și "sas" sunt palindroame). Scrieți un program care verifică dacă un cuvânt citit de la tastatură este palindrom sau nu, afișând un mesaj.

Rezolvare

#include <iostream>
#include <cstring>
using namespace std;


int main()
{
 char s[201];
 int l;


 cout << "Cuvantul: "; cin >> s;

 l = strlen(s);

 bool palindrom = true;

 for (int i = 0; i < l / 2; ++i)
 {
  if (s[i] != s[l - i - 1])
  {
   palindrom = false;
   break;
  }
 }


 cout << (palindrom ? "ESTE PALINDROM." : "NU ESTE PALINDROM.") << endl;

 return 0;
}

Explicații

<iostream> este antetul pentru scrierea pe ecran și citirea de la tastatură.
<cstring> (în trecut <string.h>) este antetul pentru folosirea funcției strlen.

Presupunem că un cuvânt are maxim 200 de caractere . Al 201-lea este caracterul nul (codul ASCII 0 sau caracterul '\0').

Cu palindrom = true presupunem de la început că cuvântul dat este palindrom și apoi încercăm să demonstrăm contrariul.


Trecem prin fiecare caracter al cuvântului de la stânga la dreapta până la jumătatea lui. Dacă al i-lea caracter de la începutul cuvântului este diferit de al i-lea caracter de la sfârșitul cuvântului, presupunerea e falsă și oprim parcurgerea cu o instrucțiune break.

La sfârșit, înainte de a ieși din main cu return 0, folosim operatorul ?: pentru a afișa un șir de caractere literal în funcție de valoarea variabilei palindrom.

Exemple

Palindromul TOT (3 caractere) : i trece de la 0 la 3 / 2 = 1. Se compară T cu T și O cu O.

Palindromul ABCCBA (6 caractere): i trece de la 0 la 6 / 2 = 3.
Se compară caracterele de pe pozițiile 0 cu 5, 1 cu 4, 2 cu 3. Mai departe nu, deoarece condiția for are semnul strict mai mic, nu mai mic sau egal cu.

Problemă rezolvată matrice clasa a XI-a mate-info neintensiv

Enunț

Se citește de la tastatură un nr. natural nenul n. Scrieți un program care să genereze n submulțimi disjuncte (fără nici un element comun), având fiecare câte n elemente din mulțimea {1,2,...,n2}, submulțimi pentru care suma elementelor este aceeași.

Exemplu: pentru n=4, pe mulțimea {1,2,...,15,16}, submulțimile cerute sunt: {1,6,11,16}, {4,5,10,15}, {3,8,9,14} și {2,7,12,13}, toate aceste submulțimi având suma elementelor egală cu 34.

Rezolvare

Cod sursă

Cu colorare de sintaxă, aici. Scrie în fișier.

Ieșire pt. n = 4: click aici.

Note

- această rezolvare dă primele rezultate pentru n = 4 după aprox. 2min;
- această rezolvare dă mai multe soluții valide, nu doar prima, folosind metoda backtracking de două ori, dar se poate modifica ușor să afișeze o singură soluție.

Explicație

Funcția back

- este o funcție backtracking;
- generează toate combinările de N luate câte P (se cer submulțimi neordonate disjuncte, în exemplul dat, din mulțimea {1, 2, ..., 15, 16}, submulțimile având 4 elemente fiecare);
- reține combinările în vectorul de vectori (matrice) Sols care este transmis prin referință (folosind operatorul &);
- combinarea curentă (sau stiva din backtracking) este tabloul unidimensional Sol care implicit este transmis ca referință;
- în Sol valorile care contează se rețin de la indicele 1 în sus, dar în Sols se introduc de la indicele 0.

Funcția back2

- este o funcție backtracking;
- generează toate posibilitățile de n (=4) mulțimi de submulțimi de n (=4) elemente disjuncte care au aceeași sumă a elementelor;
- vectorul Sols este primit din funcția main care îl primește de la funcția back explicată mai sus
- vectorul SolFin este stiva din backtracking care conține indici din Sols;
- vectorul Fol este un vector de prezență, fiecărui indice corespunzându-i true sau false, valoare care indică dacă indicele (o valoare de la 1 la 16 în exemplul dat) este prezent în setul curent de submulțimi (din SolFin);
- suma este suma primei submulțimi din SolFin cu care se compară apoi sumele celorlalte submulțimi care se pun pe stivă;
- se folosesc metodele push_back (adaugă la sfâșit) și pop_back (scoate ultima valoare din vector);
- se are grijă ca la punerea unei submulțimi în stiva SolFin să nu existe elemente în ea care deja sunt folosite (dacă există, nu se pune ci se face un salt cu instrucțiunea continue, la fel și când suma locală este diferită de parametrul suma);
- se are grijă ca la ieșirea din recursivitate să se marcheze elementele care înainte erau folosite, ca nefolosite.

Problemă rezolvată matrice clasa a XI-a mate-info neintensiv

Se consideră o matrice a cu n linii * n coloane și un vector v cu n elemente. Precizați care vor fi elementele vectorului b, după execuția secvenței următoare:

int nr, n, i, j, x, b[20];
int a[3][3] = {{7, 1, 7}, {-7, 7, 0}, {2, 4, 11}};
n = 3;
x = 7;
for (i = 0; i < n; i++)
{
 nr = 0;
 for (j = 0; j < n; j++)
  if (a[i][j] == x)
   nr++;
 b[i] = nr;

}

Vizual

Explicație și rezolvare

a:

 7 1  7
-7 7  0
 2 4 11


x = 7
și se execută (pseudocod):

for i de la 0 la 3 - 1 = 2:
 nr = 0
 for j = 0 la 2
  dacă a[i, j] == x, ++nr
 b[i] = nr

Dezvoltarea for-urilor

n = 3
i = 0
 nr = 0
 for j = 0 la 2
  dacă a[0, 0] == x, ++nr | a[0, 0] == 7, 7 == x, ++nr, nr = 1
  dacă a[0, 1] == x, ++nr | a[0, 1] == 1, 1 != x, nr rămâne 1
  dacă a[0, 2] == x, ++nr | a[0, 2] == 7, 7 == x, ++nr, nr = 2
 b[0] = nr (= 2)

i = 1
 nr = 0
 for j = 0 la 2
  dacă a[1, 0] == x, ++nr | a[1, 0] == -7, -7 != x, nr rămâne 0
  dacă a[1, 1] == x, ++nr | a[1, 1] == 7, 7 == x, ++nr, nr = 1
  dacă a[1, 2] == x, ++nr | a[1, 2] == 0, 0 != x, nr rămâne 1
 b[1] = nr (= 1)

i = 2
 nr = 0
 for j = 0 la 2
  dacă a[2, 0] == x, ++nr | a[2, 0] == 2, 2 != x, nr rămâne 0
  dacă a[2, 1] == x, ++nr | a[2, 1] == 4, 4 != x, nr rămâne 0
  dacă a[2, 2] == x, ++nr | a[2, 2] == 11, 11 != x, nr rămâne 0
 b[2] = nr (= 0)

La final b = (2, 1, 0).