может ли кто-нибудь помочь мне понять этот код С ++? - PullRequest
1 голос
/ 09 июля 2020

Я объясняю вам работу этой программы.

шаг 1: введите номер. времени, когда вы хотите запустить l oop.

шаг 2: введите две строки s1 и s2.

output: он даст вам строку s3, которая не содержит никаких символов из строка s2.

проблема: я не могу понять, как работает for l oop, почему значение ha sh равно 257 и как работают циклы.

код приведен ниже.

#include <iostream>
using namespace std;
#include<string.h>
int main()
{
    int t;
    cout<<"enter any no. to run the loop"<<endl;
    cin>>t;
    while(t--)
    {
        string s1,s2,s3;
        int i,j,l1,l2;
    cout<<"enter two strings s1 and s2"<<endl;
        cin>>s1>>s2;
        l1=s1.length( );
         l2=s2.length( );
         int hash[257];
         for(i=0;i<257;i++)
         {
             hash[i]=0;
         }
          for(i=0;i<l2;i++)
         {
             hash[s2[i]]++;
         }
         
          for(i=0;i<l1;i++)
         {
             if(hash[s1[i]]==0)
             s3=s3+s1[i];
         }
         cout<<s3<<endl;
         
    }
    return 0;
}

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Эта программа определяет, какие символы в первой строке не содержатся во второй строке.

Пример ввода для программы:

1
abcdefghijklmnopqrstuvwxyz
helloworld

Пример вывода (спасибо @mch за исправление)

abcfgijkmnpqstuvxyz

Изменить: Обратите внимание, что это, конечно, чувствительно к регистру, поскольку символы a и A производят разные целочисленные значения.

Вот некоторые комментарии к программе:

#include <iostream>
using namespace std;
#include <string.h>
int main() {
    // Do the whole program as many times as the user says
    int t;
    cout << "enter any no. to run the loop" << endl;
    cin >> t;
    while (t--) {
        string s1, s2, s3;
        int i, j, l1, l2;
        // read strings and get their respective lengths
        cout << "enter two strings s1 and s2" << endl;
        cin >> s1 >> s2;
        l1 = s1.length();
        l2 = s2.length();

        // Array with 257 elements
        int hash[257];
        // Initialize all elements of array with 0
        for (i = 0; i < 257; i++) {
            hash[i] = 0;
        }

        // Count occurrences of characters in second string
        // s2[i] is the character at position i in s2
        // Increase the value of hash for this character by 1
        for (i = 0; i < l2; i++) {
            hash[s2[i]]++;
        }

        // Iterate over s1 characters
        // If hash[i] == 0: character i is not contained in s2
        // s3 => string of letters in s1 that are not contained in s2
        for (i = 0; i < l1; i++) {
            if (hash[s1[i]] == 0)
                s3 = s3 + s1[i];
        }

        // output s3
        cout << s3 << endl;
    }
    return 0;
}
0 голосов
/ 09 июля 2020

Выше есть комментарий, объясняющий циклы for.

int hash[257] на самом деле может быть int hash[256]. Существует 256 различных значений, которые могут поместиться в char (8 бит).

0 голосов
/ 09 июля 2020

Код вычисляет гистограмму встречаемости букв в s1 и копирует буквы s2, которые имеют нулевое вхождение.

Он может сканировать sh для любого типа char, не ограниченного в диапазон [0,256] (!)

...