1 Востаннє редагувалося shonrens (23.10.2015 01:06:03)

Тема: порівняння двох рядків(без використання бібліотечних функцій)

Щось зробив неправильно а от що не знаю, довільно порівню мої рядки за довжиною.

Прихований текст
/* (1) Написати функцію для порівняння двох рядків, не використовуючи бібліотечних функцій. */
#include <iostream>
#include <cstring>

using namespace std;

void comTwoRows(char *mes1, char *mes2);

int main ()
{
        const int size = 50;
        char message_1[size];
        char message_2[size];

        cout << "Enter the first row:\n: ";
        cin.getline(message_1, size);

        cout << "Enter the second row:\n: ";
        cin.getline(message_2, size);

        cout << "first row: " << message_1 << endl;
        cout << "Seconf row: " << message_2 << endl;

        comTwoRows(message_1, message_2);
        cout << endl;
return 0;
}

void comTwoRows(char *mes1, char *mes2)
{
        int len_mes1, len_mes2;
        char text[80];

        while (*mes1){
                len_mes1++;
                *mes1++;
        }
        while (*mes2){
                len_mes2++;
                *mes2++;
        }

        if (len_mes1 > len_mes2)
                strcpy(text, "First number greater than the second");
        else if (len_mes1 < len_mes2)
                strcpy(text, "Second number greater than the first");
        else // (len_mes1 == len_mes2)
                strcpy(text, "Two strings the same");

        cout << text;
}

2

Re: порівняння двох рядків(без використання бібліотечних функцій)

shonrens написав:

Щось зробив неправильно а от що не знаю, довільно порівню мої рядки за довжиною.

Прихований текст
/* (1) Написати функцію для порівняння двох рядків, не використовуючи бібліотечних функцій. */
#include <iostream>
#include <cstring>

using namespace std;

void comTwoRows(char *mes1, char *mes2);

int main ()
{
        const int size = 50;
        char message_1[size];
        char message_2[size];

        cout << "Enter the first row:\n: ";
        cin.getline(message_1, size);

        cout << "Enter the second row:\n: ";
        cin.getline(message_2, size);

        cout << "first row: " << message_1 << endl;
        cout << "Seconf row: " << message_2 << endl;

        comTwoRows(message_1, message_2);
        cout << endl;
return 0;
}

void comTwoRows(char *mes1, char *mes2)
{
        int len_mes1, len_mes2;
        char text[80];

        while (*mes1){
                len_mes1++;
                *mes1++;
        }
        while (*mes2){
                len_mes2++;
                *mes2++;
        }

        if (len_mes1 > len_mes2)
                strcpy(text, "First number greater than the second");
        else if (len_mes1 < len_mes2)
                strcpy(text, "Second number greater than the first");
        else // (len_mes1 == len_mes2)
                strcpy(text, "Two strings the same");

        cout << text;
}

Ну , почнем з того, що ви використовуєте бібліотечні функції :)
На мою думку, Вам потрібно брати Ваші стрічки й просто посимвольно їх порівнювати .
Відповідно , зробіть функцію типу "bool" і повертайте true - коли "рівні" між собою і false - навпаки.
Але зрозумійте, що Вам потрібно порівняти 2 рядки! А не їх довжини.

Подякували: koala, shonrens2

3

Re: порівняння двох рядків(без використання бібліотечних функцій)

#Sparta написав:
shonrens написав:

Щось зробив неправильно а от що не знаю, довільно порівню мої рядки за довжиною.

Прихований текст
/* (1) Написати функцію для порівняння двох рядків, не використовуючи бібліотечних функцій. */
#include <iostream>
#include <cstring>

using namespace std;

void comTwoRows(char *mes1, char *mes2);

int main ()
{
        const int size = 50;
        char message_1[size];
        char message_2[size];

        cout << "Enter the first row:\n: ";
        cin.getline(message_1, size);

        cout << "Enter the second row:\n: ";
        cin.getline(message_2, size);

        cout << "first row: " << message_1 << endl;
        cout << "Seconf row: " << message_2 << endl;

        comTwoRows(message_1, message_2);
        cout << endl;
return 0;
}

void comTwoRows(char *mes1, char *mes2)
{
        int len_mes1, len_mes2;
        char text[80];

        while (*mes1){
                len_mes1++;
                *mes1++;
        }
        while (*mes2){
                len_mes2++;
                *mes2++;
        }

        if (len_mes1 > len_mes2)
                strcpy(text, "First number greater than the second");
        else if (len_mes1 < len_mes2)
                strcpy(text, "Second number greater than the first");
        else // (len_mes1 == len_mes2)
                strcpy(text, "Two strings the same");

        cout << text;
}

Ну , почнем з того, що ви використовуєте бібліотечні функції :)
На мою думку, Вам потрібно брати Ваші стрічки й просто посимвольно їх порівнювати .
Відповідно , зробіть функцію типу "bool" і повертайте true - коли "рівні" між собою і false - навпаки.
Але зрозумійте, що Вам потрібно порівняти 2 рядки! А не їх довжини.

Ось переробив, виводить постійно що вони неоднакові

Прихований текст
/* (1) Написати функцію для порівняння двох рядків, не використовуючи бібліотечних функцій. */
#include <iostream>
#include <cstring>

using namespace std;

bool comTwoRows(char *mes1, char *mes2);

int main ()
{
        const int size = 50;
        char message_1[size];
        char message_2[size];

        cout << "Enter the first row:\n: ";
        cin.getline(message_1, size);

        cout << "Enter the second row:\n: ";
        cin.getline(message_2, size);

        cout << "first row: " << message_1 << endl;
        cout << "Seconf row: " << message_2 << endl;

        bool temp = comTwoRows(message_1, message_2);

        if (!temp)
                cout <<  "Two strins the not same";
        else
                cout << "Two strings the same";
        cout << endl;
return 0;
}

bool comTwoRows(char *mes1, char *mes2)
{
        while (mes1 || mes2){
                if (*mes1 == *mes2){
                mes2++;
                mes1++;
                }
                else
                return false;
        }
        return true;
}

4

Re: порівняння двох рядків(без використання бібліотечних функцій)

Думайте коли закінчувати порівняння

Подякували: shonrens1

5 Востаннє редагувалося shonrens (23.10.2015 13:11:40)

Re: порівняння двох рядків(без використання бібліотечних функцій)

0xDADA11C7 написав:

Думайте коли закінчувати порівняння

        while (mes1 || mes2){
                if (*mes1 == *mes2){
                mes2++;
                mes1++;
                }
                else
                return false;
        }
        return true;
а хіба воно не повино дійти до завершення, і якщо не потрапляє в else вивести мені тру?

6

Re: порівняння двох рядків(без використання бібліотечних функцій)

саме так, воно не повинно дійти до завершення всієї ділянки пам'яті, бо тоді програма вивалиться з помилкою, десь потрібно зупинитися в порівнянні стрічок

Подякували: shonrens1

7

Re: порівняння двох рядків(без використання бібліотечних функцій)

0xDADA11C7 написав:

саме так, воно не повинно дійти до завершення всієї ділянки пам'яті, бо тоді програма вивалиться з помилкою, десь потрібно зупинитися в порівнянні стрічок

А як можна дізнатись що масив дійшов кінцю?
mes1 == '\0' && mes2 == '\0';
return true;
Можливо ось так якось?
Я просто не дуже розумію цю нову тему з типом char, якось важко мені його реалізувати .

8

Re: порівняння двох рядків(без використання бібліотечних функцій)

так, правильно, ви ж порівнюєте стрічки з кінцевим нулем, тому так

Подякували: shonrens1

9 Востаннє редагувалося shonrens (23.10.2015 14:59:02)

Re: порівняння двох рядків(без використання бібліотечних функцій)

0xDADA11C7 написав:

так, правильно, ви ж порівнюєте стрічки з кінцевим нулем, тому так

Всерівно щось не виходить :(

        while (mes1 && mes2){
        if (mes1 == '\0' && mes2 == '\0' && mes1 == mes2)
                return true;
        if (mes1 == mes2){
        mes1++;
        mes2++;
        }
        else
                return false;
        }

все розібрався дякую.
Можливо кому цікаво треба було через * в if зробити

bool comTwoRows(char *mes1, char *mes2)
{

        while (mes1 && mes2){
        if (*mes1 == '\0' && *mes2 == '\0' && *mes1 == *mes2)
                return true;
        if (*mes1 == *mes2){
        mes1++;
        mes2++;
        }
        else
                return false;
        }
}

10

Re: порівняння двох рядків(без використання бібліотечних функцій)

А у while ви свідомо перевіряєте вказівники на нуль? Воно-то може й має сенс, але у вигляді однієї перевірки на початку функції, а не на кожній ітерації циклу.

11 Востаннє редагувалося shonrens (23.10.2015 20:56:34)

Re: порівняння двох рядків(без використання бібліотечних функцій)

quez написав:

А у while ви свідомо перевіряєте вказівники на нуль? Воно-то може й має сенс, але у вигляді однієї перевірки на початку функції, а не на кожній ітерації циклу.

а як правильно? Якщо можна покажіть код а то я так не дуже розумію як правильніше.

12

Re: порівняння двох рядків(без використання бібліотечних функцій)

bool comTwoRows(char *mes1, char *mes2)
{
  if( mes1 == mes2 ) { //якщо вказують на один рядок
    return true;
  }
  if( !mes1 || !mes2 ) { //якщо хтось з них NULL, але не обидва
    return false;
  }
  while ( *mes1 == *mes2 ){//порівнюємо, доки рівні
    if( *mes1 == '\0' ) {//якщо рівні і дійшли до кінця - значить, дійсно рівні
      return true;
    }
    ++mes1;
    ++mes2;
  }
  return false;//якщо вийшли з циклу - значить, не рівні
}
Подякували: shonrens1

13

Re: порівняння двох рядків(без використання бібліотечних функцій)

koala написав:
bool comTwoRows(char *mes1, char *mes2)
{
  if( mes1 == mes2 ) { //якщо вказують на один рядок
    return true;
  }
  if( !mes1 || !mes2 ) { //якщо хтось з них NULL, але не обидва
    return false;
  }
  while ( *mes1 == *mes2 ){//порівнюємо, доки рівні
    if( *mes1 == '\0' ) {//якщо рівні і дійшли до кінця - значить, дійсно рівні
      return true;
    }
    ++mes1;
    ++mes2;
  }
  return false;//якщо вийшли з циклу - значить, не рівні
}

Дуже дякую що так розписали тепер все зрозуміло.

14

Re: порівняння двох рядків(без використання бібліотечних функцій)

Вибачте,

bool comTwoRows(const char *mes1, const char *mes2)

- так коректніше.

Подякували: #Sparta1