Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача двумерного массива функцию с помощью указателей / 13 сообщений из 13, страница 1 из 1
18.03.2018, 18:07
    #39616513
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
Доброго времени суток.
Нужна помощь в решении задачи.

Дан массив строк размером MxN
(Количество строк и слов в строке определяет пользователь, но максимальное количество слов 80 ; строк 5).

Найти строку, в которой содержится самое длинное слово.
Вывести на экран монитора это слово и номер строки.

Я полагаю ошибка кроется в передачи массива в функцию и прохождению по элементам массива.

Использую CodeBlocks с установленным компилятором от Borland C++ (5.5, 5.82)

Код:

Код: sql
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.
 
#include <stdio.h>
#include <string.h>
#define N 5
#define M 80

void String (char *ptr, int *max, int *num_of_string, int n, int m);

int main()
{
	char arr[N][M];
        char *ptr = arr;
	int num_of_string;
	int n, i, m, max = 0;


	printf("\nEnter Count Of Lines: ");
	scanf("\t%d", &n);
	if (n > N)
		n = N;
    printf("\nEnter Count Of Words: ");
	scanf("\t%d", &m);
	if (m > M)
		m = M;
	printf("Enter Strings:\t");

	getchar();

	for (i = 0; i < n; i++)
    gets(ptr);

	String(ptr, &max, &num_of_string, n, m);

	printf("\n String_num: %d, num_of_char =  %d", num_of_string, max);

	return 0;
}

void String (char *ptr, int *max, int *num_of_string, int n, int m)
{
	int lenght=0, num_str=1, i, j;


    for (i=0; i<n; i++)
{
        for (j=0; j<m; j++)
        {
            lenght = (*(*(ptr+i*m)+j));
        }
}
    if (lenght > *max)
        *max=lenght;
        *num_of_string = num_str;

}
...
Рейтинг: 0 / 0
19.03.2018, 09:43
    #39616639
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
SatanRulez,

Код: plaintext
1.
lenght = (*(*(ptr+i*m)+j));



Надо было во внешнем цикле ввести вспомогательную переменную, которая смотрит на начало строки, чтобы не запутаться (и работало бы быстрее).
По сути ты получаешь ЗНАЧЕНИЕ лежащее в нулевом элементе текущей строки и складываешь с индеком, а потом получаешь значение из этого извращенного адреса.

Надо так:
Код: plaintext
1.
lenght = *(ptr+i*m+j);



p.s. Если не собираешься менять адрес указателя, то лучше использовать ссылки. Если не собираешься менять значение формальных переменных в функции, то лучше указывать спецификатор const.
...
Рейтинг: 0 / 0
19.03.2018, 19:08
    #39617029
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
AlekseySQL,

Переработал код так, как Вы сказали, в результате прога выдавала значение длины по всему массиву.

Решил по аналогии сделать проход по строкам, вот что вышло:

Код: sql
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.
#include <stdio.h>
#include <string.h>
#define N 5
#define M 80

void String (char *ptr, int *max, int *num_of_string, int m);

int main()
{
	char arr[N][M];
    char *ptr = &arr[0][0];
	int num_of_string;
	int n, m, max = 0;


	printf("\nEnter Count Of Lines: ");
	scanf("\t%d", &n);
	if (n > N)
		n = N;
	printf("Enter Strings:\t");

	getchar();

	while (n>0)
    {
        gets(ptr);
        m = strlen(ptr);
        String(ptr, &max, &num_of_string, m);
        n--;
    }

	printf("\n String_num: %d, num_of_char =  %d", num_of_string, max);

	return 0;
}

void String (char *ptr, int *max, int *num_of_string, int m)
{
	int lenght=0, num_str=1;

    while (m>0)
    {
        if((*ptr) != ' ')
        lenght++;
        (*ptr)++;
        m--;
    }

     if (lenght > *max)
        *max=lenght;
         num_str++;
        *num_of_string = num_str;
}
...
Рейтинг: 0 / 0
19.03.2018, 20:19
    #39617059
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
SatanRulez Найти строку, в которой содержится самое длинное слово. Вывести на экран монитора сумму и номер строки.


разбить строку на слова

Сумма чего ?
...
Рейтинг: 0 / 0
19.03.2018, 21:06
    #39617073
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
д0kХ, Да, я писал выше, что немного опечатался, нужно вывести на экран Слово , не сумму . Немного уставший просто был и не увидел что не то написал . Сильно в институте загоняли.
...
Рейтинг: 0 / 0
19.03.2018, 21:13
    #39617076
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
SatanRulezд0kХ, Да, я писал выше, что немного опечатался, нужно вывести на экран Слово , не сумму . Немного уставший просто был и не увидел что не то написал . Сильно в институте загоняли.

Значит я вам 100% помог

Алгоритм расчета длины слова зависит от испольуемой вами кодировки.
...
Рейтинг: 0 / 0
19.03.2018, 21:18
    #39617077
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
д0kХ,

Спасибо за статью, прочитал. Очень хорошую идею подкинули. Буду пробовать, но результатом поделюсь скорее всего завтра. Еще осталось много нерешенных дел. Благодарю за помощь .
...
Рейтинг: 0 / 0
20.03.2018, 13:11
    #39617472
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
SatanRulezЯ полагаю ошибка кроется в передачи массива в функцию и прохождению по элементам массива.


Не используй вообще многомерные массивы.
Используй

std::vector< std::string >
...
Рейтинг: 0 / 0
20.03.2018, 13:13
    #39617474
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
Вместо
gets()

std::getline()

Вместо String std::string
Вместо Borland C++ (5.5, 5.82) -- нормальный современный компилятор (GCC, CLang, MSVC).
...
Рейтинг: 0 / 0
20.03.2018, 16:31
    #39617679
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
MasterZiv,

Благодарю за совет. Но к сожалению не могу воспользоваться, так как не я решаю каким компилятором пользоваться, а мой препод по программированию . И писать могу только на СИ, без использования элементов СИ++. Я бы и сам рад, но вот такие требования у нас в ВУЗе
...
Рейтинг: 0 / 0
20.03.2018, 18:21
    #39617748
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
SatanRulezMasterZiv,

Благодарю за совет. Но к сожалению не могу воспользоваться, так как не я решаю каким компилятором пользоваться, а мой препод по программированию . И писать могу только на СИ, без использования элементов СИ++. Я бы и сам рад, но вот такие требования у нас в ВУЗе

Ага, а String это что тогда?
...
Рейтинг: 0 / 0
20.03.2018, 19:25
    #39617785
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
В общем допилил прогу . Не знаю насколько хороша она оптимизирована, но считает все правильно .

Код:

Код: plaintext
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.
#include <stdio.h>
#include <string.h>
#define N 5
#define M 80

void String (char *ptr, int *max, int *num_of_string, int i, char *word);

int main()
{
    char word[50];
    char arr[N][M];
    char *ptr = &arr[0][0];
    int num_of_string;
    int n, i, max = 0;


	printf("\nEnter Count Of Lines: ");
	scanf("\t%d", &n);
	if (n > N)
		n = N;
	printf("Enter Strings:\t");

	 for (i = 0; i < n; i++)
    {
        gets(ptr);
        String(ptr, &max, &num_of_string, i, &word);
        printf("\t\t");
    }

	printf("\n String_num: %d, Count_of_char =  %d, Word - %s", num_of_string + 1, max, word);

	return 0;
}

void String (char *ptr, int *max, int *num_of_string, int i, char *word)
{
    int lenght;
    char *pch;

    pch = strtok (ptr," ,.-");
    while (pch != NULL)
    {
        lenght = strlen(pch);
        if (lenght > *max)
        {
        *max=lenght;
        *num_of_string = i;
        strcpy(word, pch);
        }
        pch = strtok (NULL," ,.-");
    }
}
...
Рейтинг: 0 / 0
20.03.2018, 19:27
    #39617787
SatanRulez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача двумерного массива функцию с помощью указателей
Спасибо всем кто не остался равнодушным и помог :) . Благодаря вам смог защитить лабораторную .
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача двумерного массива функцию с помощью указателей / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]