Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
6 / 5 / 2
Регистрация: 05.10.2021
Сообщений: 357
1

Почему функция возвращает лишние символы?

06.05.2022, 19:27. Показов 619. Ответов 2

Author24 — интернет-сервис помощи студентам
Задание по теме перегрузка функций. Нужно было перегрузить функцию Sum так, чтобы она возвращала либо сумму элементов двумерного целочисленного массива (mas), либо принимала двумерный массив символов (mas2) и возвращала предложение (строку) символов с дополнением - после каждого символа, на котором заканчивалась строка в двумерном массиве (mas2), в новой строке должен стоять пробел, а в конце точка. В моем коде перегруженная функция char* Sum возвращает строку с 2 лишними символами. Получается: $~?МО їЦe? >+#~ї+ BMЎ??З.ЭЭ
Т.е. "ЭЭ" на конце - лишние, после точки ничего не должно быть. Если задаю размерность динамического массива str [n*m-2], из которого получается нужная строка символов, то возвращается правильное значение. Не понимаю, как это объяснить на защите лабораторной. Получается, что в динамический массив str записывается двумерный массив размерностью n*m + в динамический массив идут три пробела и точка, т.е. всего должно быть n*m+4. При этом размерность динамического массива, в котором больше символов, чем в двумерном [n*m], нужно указать n*m-2 вместо n*m+4, чтобы возвращалось правильное значение из функции. ?...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
using namespace std;
int Sum(int* mas, int n)
{
    if (n < 1) return mas[n];
    else return mas[n] + Sum(mas, n - 1);
}
char* Sum(char* mas, int n, int m)
{
    cout << endl;
    char* str = new char[n*m]; 
    for (int i = 0, k = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++, k++)
        {
            str[k] = mas[k-i];
        }
        if (i < n - 1) { str[k] = 32; k++; }
        else { str[k] = 46; k++; }
    }
    cout << endl;
    return str;
}
void Sort(int* mas, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = n; j > i; j--)
        {
            if (mas[j] < mas[j - 1])
            {
                int tmp = mas[j];
                mas[j] = mas[j - 1];
                mas[j - 1] = tmp;
            }
        }
    }
}
int main()
{
    setlocale(LC_ALL, "rus");
    int const n = 4, m = 6;
    int mas[n][m];
    cout << "Числовой массив: " << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            mas[i][j] = rand() % 10;
            cout << mas[i][j] << " ";
        }
        cout << endl;
    }
    cout << "Сумма элементов числового массива: " << Sum(*mas, n * m - 1) << endl;
    Sort(*mas, n * m - 1);
    cout << "Числовой массив после сортировки: " << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << mas[i][j] << " ";
        }
        cout << endl;
    }
    char mas2[n][m];
    cout << "Массив символов: " << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            mas2[i][j] = rand() % 1000;
            cout << mas2[i][j] << " ";
        }
        cout << endl;
    }
 cout << Sum(*mas2, n, m);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2022, 19:27
Ответы с готовыми решениями:

Почему выводит лишние символы?
char * buildstr(char c, int n); int main() { setlocale(LC_ALL, &quot;russian&quot;); // русифицировать ...

Почему функция не возвращает значение?
По заданию из учебника, нужно написать небольшую поисковую систему, используя все полученные...

Почему функция всегда возвращает 0?
bool trie_tree::consonants_check(char letter) { return tolower(letter) == ('w' || 'r' || 't' ||...

Почему функция возвращает отрицательное число?
Почему функция возвращает отрицательное число? Причём передаю в функцию s&lt;=31, т.е. всё должно...

Почему функция возвращает неправильное значение
Пробовал дебажил функцию и каждый раз проверка проходит условие, хотя оно выполняется... в итоге...

2
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
06.05.2022, 19:47 2
Цитата Сообщение от Unomuno Посмотреть сообщение
В моем коде перегруженная функция char* Sum возвращает строку с 2 лишними символами. Получается: $~?МО їЦe? >+#~ї+ BMЎ??З.ЭЭ
Функция char* Sum у вас возвращает НЕ строку, а указатель на некий массив символов. С-строкой называется последовательность символов, завершающаяся символом '\0'.

Распространенные ошибки

Цитата Сообщение от Unomuno Посмотреть сообщение
Если задаю размерность динамического массива str [n*m-2], из которого получается нужная строка символов, то возвращается правильное значение.
Нет, это ничего не меняет кроме случайных совпадений. Никакого "правильного значения" не возвращается.

Цитата Сообщение от Unomuno Посмотреть сообщение
Sort(*mas, n * m - 1);
Доступ к двумерному массиву как к одномерному - неопределенное поведение.

Цитата Сообщение от Unomuno Посмотреть сообщение
mas2[i][j] = rand() % 1000;
Что это за загадочное назначение значений элементам типа char? Почему % 1000? Что за "символы" при этом должны получиться?
1
6 / 5 / 2
Регистрация: 05.10.2021
Сообщений: 357
06.05.2022, 22:13  [ТС] 3
[QUOTE]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Функция char* Sum у вас возвращает НЕ строку, а указатель на некий массив символов. С-строкой называется последовательность символов, завершающаяся символом '\0'.
А если так сделать? Нужно ли где-то писать delete [] str в связи с тем, что создавался массив в динамической памяти?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char* Sum(char* mas, int n, int m)
{
    cout << endl;
    char* str = new char[n*m+n+1]; 
    for (int i = 0, k = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++, k++)
        {
            str[k] = mas[k-i];
        }
        if (i < n - 1) { str[k] = 32; k++; }
        else 
        { 
            str[k] = 46; 
            k++; 
            str[k] = { '\0' }; 
        }
    }
    cout << endl;
    return str;
}
Спасибо, многое прояснилось. У меня давно проблемы с символьными массивами.

Доступ к двумерному массиву как к одномерному - неопределенное поведение.
Т.е. надежнее задать параметры Sort (*mas, n, m) ?

Что это за загадочное назначение значений элементам типа char? Почему % 1000? Что за "символы" при этом должны получиться?
Это необдуманное решение. Теперь там mas2[i][j] = rand() % 256+33; чтобы были символы из таблицы исключая символ пробела 32 и все до него.
0
06.05.2022, 22:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2022, 22:13
Помогаю со студенческими работами здесь

Почему функция atan возвращает значения фрагментарно
Всем привет, нужно значение угла от мыши (x, y) до координаты (0,0) окна. Пишу следующее: ...

Почему функция atoi возвращает неожиданный результат?
char chislo; int kol_OB; chislo = '2'; chislo = '4'; kol_OB = atoi(chislo); Почему kol_OB =...

Класс Массив: почему функция возвращает адрес элемента, а не его значение?
подскажите, пожалуйста: почему функция возвращает адрес элемента, а не его значение? template...

Функция PlaySound воспроизводит звук и возвращает управление СРАЗУ ЖЕ (но это неправильно), почему?
Друзья! Вот код: #include &lt;windows.h&gt; #include &lt;stdio.h&gt; int main (){ PlaySound...

Функция получения значения хэш-объекта возвращает непонятные символы
Подскажите, пожалуйста, не могу понять почему CryptGetHashParam возвращает в буфер какое то...

Почему в строке появляются лишние символы?
Здравствуйте, пытаюсь написать ОС, но столкнулся с проблемой: Иногда, при нажатии enter возникают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru