powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача двумерного массива функцию с помощью указателей
13 сообщений из 13, страница 1 из 1
Передача двумерного массива функцию с помощью указателей
    #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
Передача двумерного массива функцию с помощью указателей
    #39616639
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SatanRulez,

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



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

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



p.s. Если не собираешься менять адрес указателя, то лучше использовать ссылки. Если не собираешься менять значение формальных переменных в функции, то лучше указывать спецификатор const.
...
Рейтинг: 0 / 0
Передача двумерного массива функцию с помощью указателей
    #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
Передача двумерного массива функцию с помощью указателей
    #39617059
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SatanRulez Найти строку, в которой содержится самое длинное слово. Вывести на экран монитора сумму и номер строки.


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

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

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

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

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


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

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

std::getline()

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

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

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

Ага, а String это что тогда?
...
Рейтинг: 0 / 0
Передача двумерного массива функцию с помощью указателей
    #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
Передача двумерного массива функцию с помощью указателей
    #39617787
SatanRulez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто не остался равнодушным и помог :) . Благодаря вам смог защитить лабораторную .
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача двумерного массива функцию с помощью указателей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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