Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: problema siruri de caractere  (Citit de 2824 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
raskolnikov.bb
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« : Noiembrie 17, 2013, 11:53:15 »

1.Subprogramul numarare primeste prin parametrul s un sir de maxim 255 de caractere, care pot fi litere mari,mici sau cifre, si returneaza prin parametrul nr1 numarul literelor mari din sir
a)def. completa a subprogramului numarare.
b)Fisierul siruri.txt contine: pe primul rand un numar nat n, apoi pe fiecare din urmatoarele n randuri, cate un sir de maxim 255 de caractere alcatuit din litere mari, mici si cifre.Realizati un program care, folosind apeluri utile ale subprogramului numarare, afiseaza pe ecran, pe un rand, acel sir din fisier care contine cele mai multe majuscule.Daca exista in fisier 2 sau mai multe siruri cu acelasi nr maxim de majuscule, se va afisa ultimul dintre acestea.

Asta este problema, am scris un mic roman la ea dar am rezolvat-o( nu m-am pot folosi decat de strlen deoarece celelalte functii nu le-am invatat la scoala. ). As vrea o varianta mai scurta si mai eficienta.

Asa am rezolvat-o:
Cod:
#include<iostream.h>
FILE *f;
int numarare(char s[], int &nr1)
{
int i;
nr1=0;
for(i=0;i<strlen(s);i++)
if(s[i]>='A' && s[i]<='Z')
nr1++;
}
main()
{
char s[41],max[41];
int n,i,p,m,j,l;
f=fopen("D:\siruri.txt","r");
fscanf(f,"%d\n",&n);
p=0;
for(i=0;i<=n-1;i++)
{
fgets(s,40,f);
fscanf(f,"\n");
numarare(s,m);
if(p<=m)
{
l=strlen(s);
for(j=0;j<l;j++)
max[j]=s[j];
p=m;
}
}
for(j=0;j<l;j++)
cout<<max[j];
}
« Ultima modificare: Noiembrie 17, 2013, 12:50:40 de către Bogdan Boboc » Memorat
harababurel
Client obisnuit
**

Karma: 23
Deconectat Deconectat

Mesaje: 62



Vezi Profilul
« Răspunde #1 : Noiembrie 17, 2013, 16:09:16 »

Cod:
#include <iostream>
#include <fstream>
using namespace std;

int n;
string s, sol = "";

int count(string s) {
int ret = 0;
for(int i=0; i<s.size(); i++) if(s[i]>='A' && s[i]<='Z') ret++;
return ret;
}

int main() {
ifstream f("siruri.txt");

f>>n;
f.get();
for(int i=1; i<=n; i++) {
getline(f, s);
if(count(s) >= count(sol)) sol = s;
}

cout<<sol<<"\n";
return 0;
}

Poti reduce un pic din densitatea codului prin folosirea unei functii care returneaza direct valoarea cautata, fara sa apelezi la variabile auxiliare (acel &nr1), si prin copierea directa a stringurilor-solutie (sol = s, fara parcurgere).

Din punctul de vedere al dimensiunii, ambele surse is relativ scurte. Mi se pare cam greu sa le reduci si mai mult dimensiunea, fara sa pierzi din claritate.

Din punctul de vedere al eficientei, ambii algoritmi ruleaza in O(n * lungime_medie), cu toate ca eu am o constanta ceva mai mare (pentru ca apelez la fiecare pas functia count() de doua ori, pentru sirul curent si pentru solutia curenta).

Cred ca cel mai bine e sa scrii cod curat si lizibil, a.i. sa intelegi exact ce face fiecare bucata din el, decat sa sacrifici asta pentru a reduce dimensiunea.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines