Thursday, December 31, 2015

Limbajul C++. Alte probleme cu siruri de caractere

Doua enunturi fara mari dificultati de pe programmr.com, cu mentiunea ca am folosit pentru initializarea sirurilor de caractere, in locul "batranei" functii gets(char *str) din biblioteca C, metoda getline din clasa std::istream

Aceasta incarca in spatiul indirectat de char * str un numar specificat, n, de caractere inclusiv terminatorul de sir. Adica, daca dorim sa impunem citirea a maxim 50 de caractere, linia corespunzatoare va fi:

cin.getline(str, 51);

Primul enunt cere scrierea unui cod care converteste fiecare caracter al unui sir de caractere in echivalent binar, fiind luate in calcul si eventualele spatii si semne de punctuatie.

O functie de conversie realizeaza 8 impartiri la 2 ale codului ASCII corespunzator fiercarui caracter transmis ca parametru, pentru a initializa bitii care codifica respectivul caracter, stiut fiind ca o variabila de tip char ocupa 8 biti in memorie.

Codul si printscreen-ul:


//Given a string of no more than 50 characters (a character array),
//you need to write a function that converts character by character the string
//into its binary equivalent and prints out the bits of each character.

#include <iostream>

using namespace std;

void Char2Bin(char);

int main()
{
    char s[51];
    cout <<"Enter a string of max 50 char and the binary equivalent will be printed.\n";
    
    cin.getline(s, 51); // cele 51 de caractere citite includ terminatorul de sir
    cout <<"\n";
    
    int length = 0;
    
   while(s[length]) length++;
    for(int i = 0; i < length; i++)
    {
       Char2Bin(s[i]);
       cout <<" ";
    }
    return 0;
}

void Char2Bin(char c)
{
     int tab[8], i;
     for(i = 0; i < 8; i++)
     {
      tab[i] = c%2;
      c /= 2;
     }
     i--;
     while(i >= 0)
     {
       cout <<tab[i];
       i--;
     }

}



Al doilea enunt cere ca programul sa transforme eventualele litere aflate pe pozitii de indecsi pari in sir in litere mici daca sunt litere mari. Daca indecsii sunt impari iar pe pozitiile corespunzatoare sunt litere mari, ele vor fi transformate in litere mici.

#include <iostream>

using namespace std;

void CrazyStr(char *);

int main()
{
    char s[500];
    cout <<"\nEnter a string, max 499 characters.\n";
    
    cin.getline(s, 500); // cele 500 de caractere citite includ terminatorul de sir
    //gets(s);
    
    CrazyStr(s);
    cout <<"\n" << s;
    
    return 0;
}

void CrazyStr(char * s)
{
     unsigned length = 0;
     while(s[length]) length++;
     for(int i = 0; i < length; i++)
     {
       if(!(i%2))
       {
           if(s[i] >= 97 && s[i] <= 122) s[i] -= 32;
       }
       else if(s[i] >= 65 && s[i] <= 90) s[i] +=32;
     }
}


No comments:

Post a Comment