Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12
1

Передача массива строк в функцию

30.04.2019, 20:08. Показов 7585. Ответов 5

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Знаю, что обнаглел, но может найдутся доброжелательные люди, которые помогут.. Также есть что критиковать
Необходимо решить задачу:
Написать прогу, которая принимает от пользователя набор строк и выводит на экран символы,
которые чаще всего встречаются в каждой из строк этого набора.

В первом варианте функция должна принимать в качестве параметра одну С-строку с передачей через указатель, во втором - одну строку класса string с передачей по ссылке.

Для хранения набора использовать массив С-строк (нужно двумерный). Далее необходимо сделать копию этого набора, для хранения копии использовать массив строк класса string, и потом для каждой строки из обоих наборов применить соответствующий вариант написанной функции. Т.о. в оба варианта функции за один раз должна передаваться только одна строка из набора, в первый вариант функции - строка из первого набора, во второй вариант функции - строка из второго набора.

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
#include <iostream>
#include <string>
using namespace std;
 
char f(char *s);
char f(string &s);
void F();
 
int main()
{
    const int N = 256;
    const int row = 5;
    string sStr;
 
 
    char *cStr = new char[row];
 
    cout << "Please enter " << row << " strings, please: " << endl;
    for (int i = 0; i < row; i++)
    {
        cout << i + 1 << "." << " "; cin.getline(cStr, N);
        sStr = cStr;
        f(cStr);
        char n = f(cStr);
        cout << "Most often symbol in C: " << n << endl;
        f(sStr);
        char x = f(sStr);
        cout << "Most often symbol in S: " << x << endl;
        F();
    }
        
        
    
    system("pause");
    return 0;
}
 
char f(char *s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
char f(string & s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
void F()
{
    for (int i = 0; i < 1; i++)
        cout << "*********************************************************************" << endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2019, 20:08
Ответы с готовыми решениями:

Передача динамического массива строк в функцию
что не так? программа проверяет правильность скобок для каждой строки #define...

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

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

Передача указателя на динамический массив строк в функцию
Доброе утро! Динамически выделяю память под массив строк. char **f = (char**)malloc(LEN *...

5
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
01.05.2019, 03:33 2
Необучаемый,
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
#include <iostream>
#include <string>
#include <algorithm>
 
char foo(const char* str)
{
    int buf[std::numeric_limits<unsigned char>::max() + 1]{};
    while (*str)
        ++buf[static_cast<unsigned char>(*str++)];
    return
        static_cast<char>(std::distance(
            std::begin(buf),
            std::max_element(std::begin(buf), std::end(buf))
        ));
}
 
int main()
{
    int count = 0;
    std::cin >> count >> std::ws;
 
    constexpr int str_size = 80;
    typedef char(c_str)[str_size];
 
    c_str* c_arr = new c_str[count]{};
    std::string* s_arr = new std::string[count];
 
    for (int i = 0; i < count; ++i)
    {
        std::cin.getline(c_arr[i], str_size);
        s_arr[i] = c_arr[i];
    }
 
    for (int i = 0; i < count; ++i)
        std::cout << foo(c_arr[i]) << ' ' << foo(s_arr[i].c_str()) << std::endl;
 
    delete[] c_arr;
    delete[] s_arr;
}
1
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12
02.05.2019, 20:02  [ТС] 3
zayats80888, Пушка. Ничего не понятно, но огромное спасибо
0
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12
04.05.2019, 11:04  [ТС] 4
Может есть у кого идеи как сделать задачу по тому, что я сделал?
А то даже готовая работа выше не помогает мне догнать как сделать ее самостоятельно.
0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,085
Записей в блоге: 3
04.05.2019, 15:36 5
Лучший ответ Сообщение было отмечено Необучаемый как решение

Решение

Цитата Сообщение от Необучаемый Посмотреть сообщение
Может есть у кого идеи как сделать задачу по тому, что я сделал?
Цитата Сообщение от Необучаемый Посмотреть сообщение
Далее необходимо сделать копию этого набора
исправил ваш код, чтобы было хоть из чего делать копию или копии,
а то как бы и не с чего делать.
все строки хранятся в двумерном массиве на который указывает переменная cStr,
имеющая тип char**

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <string>
using namespace std;
 
char f(char *s);
char f(string &s);
void F();
void show_all_cstring(char** _str, int _n);
 
int main()
{
    const int N = 256;
    const int row = 5; 
          // amount_symbol перед выделением можно поменять на другое значение:
          int amount_symbol = 80;
    string sStr;
 
    cout << "Please enter " << row << " strings, please: " << endl;
    
    // Выделяем память под массив строк:
    char** cStr = new char*[row]; // количество строк.(место для хранения указателей на них.)
    for(int i = 0; i < row; ++i)  // количество символов(место для их хранения.)
    {   cStr[i] = new char[amount_symbol];
    }
    
    for (int i = 0; i < row; i++)
    {
        cout << i + 1 << "." << " "; cin.getline(cStr[i], 80);
        sStr = cStr[i];
        f(cStr[i]);
        char n = f(cStr[i]);
        cout << "Most often symbol in C: " << n << endl;
        f(sStr);
        char x = f(sStr);
        cout << "Most often symbol in S: " << x << endl;
        F();
    }
    
    show_all_cstring(cStr, row);
    
    // Высвобождение памяти отводимой под двумерный динамический массив:
    for (int i = 0; i < row; i++)
        delete [] cStr[i];
    delete cStr;
    
    system("pause");
    return 0;
}
 
char f(char *s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
char f(string & s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
void F()
{
    for (int i = 0; i < 1; i++)
        cout << "*********************************************************************" << endl;
}
 
/// По названию этой процедуры все поймут, что она делает?????
/// Если вы тоже поняли, то в будующем ВСЕГДА обзывайте так, чтобы всем было
/// понятно!
void show_all_cstring(char** _str, int _n)
{   std::cout << "\nshow_all_string()--------------------------------------:\n";
    for(int i = 0; i < _n; i++)
    {   std::cout << _str[i] << "\n";
    }
    std::cout << "... end show_all_string()------------------------------.\n\n";
}
Добавлено через 12 минут
Цитата Сообщение от Необучаемый Посмотреть сообщение
Далее необходимо сделать копию этого набора, для хранения копии использовать массив строк класса string
теперь вот можно и скопировать куда-нить, да, хоть в стринг:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <string>
using namespace std;
 
char f(char *s);
char f(string &s);
void F();
void show_all_cstring(char** _str, int _n);
void show_all_cstring(std::string* _str, int _n);
void copy_all_cstring_to_string(std::string* _dest, char** _str, int _n);
 
int main()
{
    const int N = 256;
    const int row = 5; 
          // amount_symbol перед выделением можно поменять на другое значение:
          int amount_symbol = 80;
    string sStr;
 
    cout << "Please enter " << row << " strings, please: " << endl;
    
    // Выделяем память под массив строк:
    char** cStr = new char*[row]; // количество строк.(место для хранения указателей на них.)
    for(int i = 0; i < row; ++i)  // количество символов(место для их хранения.)
    {   cStr[i] = new char[amount_symbol];
    }
    
    for (int i = 0; i < row; i++)
    {
        cout << i + 1 << "." << " "; cin.getline(cStr[i], 80);
        sStr = cStr[i];
        f(cStr[i]);
        char n = f(cStr[i]);
        cout << "Most often symbol in C: " << n << endl;
        f(sStr);
        char x = f(sStr);
        cout << "Most often symbol in S: " << x << endl;
        F();
    }
    
    show_all_cstring(cStr, row);
    
    std::string sStr_copy[5]; // Место для копии.
    copy_all_cstring_to_string(sStr_copy, cStr, row);
    show_all_cstring(sStr_copy, row);
    
    // Высвобождение памяти отводимой под двумерный динамический массив:
    for (int i = 0; i < row; i++)
        delete [] cStr[i];
    delete cStr;
    
    system("pause");
    return 0;
}
 
char f(char *s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
char f(string & s)
{
    int findStr[256] = { 0 };
    for (int i = 0; s[i] != 0; ++i)
        findStr[s[i]]++;
    int max = 0;
    for (int i = 1; i < 256; ++i) {
        if (findStr[i] > findStr[max])
            max = i;
    }
    return max;
}
 
void F()
{
    for (int i = 0; i < 1; i++)
        cout << "*********************************************************************" << endl;
}
 
/// По названию этой процедуры все поймут, что она делает??????????????
/// Если вы тоже поняли, то в будующем ВСЕГДА обзывайте так, чтобы всем было
/// понятно!
void show_all_cstring(char** _str, int _n)
{   std::cout << "\nshow_all_cstring()-------------------------------------:\n";
    for(int i = 0; i < _n; i++)
    {   std::cout << _str[i] << "\n";
    }
    std::cout << "... end show_all_cstring()-----------------------------.\n\n";
}
 
void show_all_cstring(std::string* _str, int _n)
{   std::cout << "\nshow_all_string()--------------------------------------:\n";
    for(int i = 0; i < _n; i++)
    {   std::cout << _str[i] << "\n";
    }
    std::cout << "... end show_all_string()------------------------------.\n\n";
}
 
void copy_all_cstring_to_string(std::string* _dest, char** _str, int _n)
{   std::cout << "\ncopy_all_cstring_to_string()---------------------------:\n";
    for(int i = 0; i < _n; i++)
    {   std::cout << _str[i] << "\n";
        _dest[i] = _str[i];
        std::cout << _dest[i] << "\n";
    }
    std::cout << "... end copy_all_cstring_to_string()-------------------.\n\n";
}
1
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12
04.05.2019, 22:20  [ТС] 6
XLAT, Жесть!!!! Огромное спасибо! Сейчас буду разбираться
0
04.05.2019, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2019, 22:20
Помогаю со студенческими работами здесь

Передача строк в функцию со сменным количеством параметров
Нужно передать строки в функцию f со сменным количеством параметров, передача должна остановиться...

Передача двухмерного массива из функцию в функцию
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его передать в другую...

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

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


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

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