Форум программистов, компьютерный форум CyberForum.ru

Двумерный массив строк - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
17.04.2010, 23:38     Двумерный массив строк #1
Помогите реализовать двумерный массив строк...чтобы с клаиватуры можно было вводить размерность массива и каждую ячейку заполнить словом, вводимым с клавиатуры.

Добавлено через 17 минут
Уже разобрался)

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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main()
{
    int i,j,N,M;
    
    printf("Vvod razmernosti massiva\n");
    scanf("%d%d",&M,&N);
char* arrsym[M][N];
 for( i = 0; i < M; i++)
     for( j = 0; j < N; j++){
     arrsym[i][j] = (char*) malloc(256);
     std::cin >> arrsym[i][j];
     }
   std::cout << std::endl;
   std::cout << std::endl;
 for( i = 0; i < M; i++){
     for( j = 0; j < N; j++)
        std::cout << arrsym[i][j] << "   ";
        std::cout << std::endl;
 }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
18.04.2010, 14:48     Двумерный массив строк #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
40
41
#include <iostream>
#include <vector>
#include <conio.h>
#include <iomanip>
#include <cstring>
 
void strokMas(std::vector< std::vector<std::string> > &mas, const int ROWS, const int COLS);
 
int main()
{
    int ROWS=0;
    int COLS=0;
    std::cin>>ROWS;
    std::cin>>COLS;
 
    std::vector< std::vector<std::string> > mas(ROWS,std::vector<std::string>(COLS));
    strokMas(mas,ROWS,COLS);
    return 0;
}
 
void strokMas(std::vector< std::vector<std::string> > &mas, const int ROWS, const int COLS){
    int i=0;
    std::string word;
    while (i<ROWS){
        int j=0;
        while (j<COLS){
            std::cout<<"Vvedite slovo v yacheiky"<<"["<<i<<"]["<<j<<"]  :";
            std::cin>>word;
            mas[i][j]=word;
            ++j;
        }
        ++i;
    }
 
    for (int i=0; i<ROWS; i++){
        for (int j=0; j<COLS; j++){
            std::cout<<std::setw(9)<<mas[i][j];
        }
        std::cout<<std::endl;
    }
}
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
21.04.2010, 19:17  [ТС]     Двумерный массив строк #3
Подскажите пожалуйста как проверить слово в каждой ячейке на повторяющиеся символы? Если они есть, то заменить слово заглавными буквами...

Тут как бы нужно посимвольно пробегаться по каждой строке. Как это сделать для каждой ячейки?

Добавлено через 18 часов 3 минуты
Сам принцип поиска повторяющихся символов понятен, как это применить к каждой ячейке матрицы?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
21.04.2010, 19:25     Двумерный массив строк #4
Цитата Сообщение от inferno mf Посмотреть сообщение
как это применить к каждой ячейке матрицы?
в цикле
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
21.04.2010, 19:29  [ТС]     Двумерный массив строк #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
в цикле
понятно, что в цикле ...как это правильно сделать? сначала идем по i-тым элементам при j=0, проверям есть ли в строке повторяющиеся символы, потом j++, так правильно?
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
26.04.2010, 02:22  [ТС]     Двумерный массив строк #6
Не получается осуществить поиск ячеек в которых есть слова с неповторяющимеся символами(( помогите кто-нибудь пожалуйста разобраться
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
26.04.2010, 04:54     Двумерный массив строк #7
может есть и поудобней вариант, но я могу предложить такой:
для уточнения, в ячейке массива строк находится слово или строка?
если слово, тогда сверяем в words[i][j]:
C++
1
2
3
4
5
6
7
8
counter = 0;
for(i = 0; i < n; i++)
    for(j = 0; j < strlen(words[i]); j++){
        for(x = 1+j; x < strlen(words[i]); x++)
            if(words[i][j] == words[i][j+x])
                i++;
        counter++;
    }
т.е. сверяем все символы по порядку с данным словом начиная с символа на котором остановились, чтоб не проходить повторно символы стоящие до символа который мы сравниваем(тавтология)
counter выдаст нам число слов с неповторяющимися знаками
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
26.04.2010, 18:40  [ТС]     Двумерный массив строк #8
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
#include <cstdlib>
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    int i,j,N,M;
    
    printf("Vvod razmernosti massiva\n");
    scanf("%d%d",&M,&N);
char* arrsym[M][N];
 for( i = 0; i < M; i++)
     for( j = 0; j < N; j++){
     arrsym[i][j] = (char*) malloc(256);
     std::cin >> arrsym[i][j];
     }
   std::cout << std::endl;
   std::cout << std::endl;
 for( i = 0; i < M; i++){
     for( j = 0; j < N; j++)
        std::cout << arrsym[i][j] << "   ";
        std::cout << std::endl;
 }
  int x;
  int counter = 0;
for(i = 0; i < M; i++)
    for(j = 0; j < strlen(arrsym[i]); j++){
        for(x = 1+j; x < strlen(arrsym[i]); x++)
            if(arrsym[i][j] == arrsym[i][j+x])
                i++;
        counter++;
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вот , что получилось, но не компилится((( Ошибка - cannot convert 'char** ' to const char for argument '1 ' to size_t strlen(const char).

Ну вообще по заданию в ячейке строка, слово это же и есть строка...или есть какое-то отличие?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
26.04.2010, 18:53     Двумерный массив строк #9
Цитата Сообщение от inferno mf Посмотреть сообщение
слово это же и есть строка...или есть какое-то отличие?
есть примитивные строки(char) и string строки
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
26.04.2010, 20:38  [ТС]     Двумерный массив строк #10
в моем случае это повидимому string строки...как с ними здесь осуществить поиск ячеек в которых есть строки с неповторяющимеся символами?

Даже если в ячейках должны быть слова, то почему не работает код?((( что там не так?((
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
26.04.2010, 20:44     Двумерный массив строк #11
Цитата Сообщение от inferno mf Посмотреть сообщение
в моем случае это повидимому string строки...
неа)

Цитата Сообщение от inferno mf Посмотреть сообщение
как с ними здесь осуществить поиск ячеек в которых есть строки с неповторяющимеся символами?
если честно, я плохо понимаю что происходит в том коде
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
29.04.2010, 01:33  [ТС]     Двумерный массив строк #12
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
#include <cstdlib>
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    int i,j,N,M;
    
    printf("Vvod razmernosti massiva\n");
    scanf("%d%d",&M,&N);
char* arrsym[M][N];
 for( i = 0; i < M; i++)
     for( j = 0; j < N; j++){
     arrsym[i][j] = (char*) malloc(256);
     std::cin >> arrsym[i][j];
     }
   std::cout << std::endl;
   std::cout << std::endl;
 for( i = 0; i < M; i++){
     for( j = 0; j < N; j++)
        std::cout << arrsym[i][j] << "   ";
        std::cout << std::endl;
 }
  int x;
  int counter = 0;
for(i = 0; i < M; i++)
    for(j = 0; j < strlen(arrsym[i]); j++){
        for(x = 1+j; x < strlen(arrsym[i]); x++)
            if(arrsym[i][j] == arrsym[i][j+x])
                i++;
        counter++;
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
В чем заключается ошибка cannot convert 'char** ' to const char for argument '1 ' to size_t strlen(const char) ? Как сделать проверку на повторяющиеся символы в ячейках?(((
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
29.04.2010, 01:48     Двумерный массив строк #13
Цитата Сообщение от inferno mf Посмотреть сообщение
В чем заключается ошибка cannot convert 'char** ' to const char for argument '1 ' to size_t strlen(const char) ?
C++
1
2
for(j = 0; j < strlen(*arrsym[i]); j++){
        for(x = 1+j; x < strlen(*arrsym[i]); x++)
Добавлено через 2 минуты
inferno mf, а что вообще пытаешся сделать?
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
29.04.2010, 01:56  [ТС]     Двумерный массив строк #14
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
for(j = 0; j < strlen(*arrsym[i]); j++){
        for(x = 1+j; x < strlen(*arrsym[i]); x++)
Добавлено через 2 минуты
inferno mf, а что вообще пытаешся сделать?
это неверно((( ну вообще хотелось посимвольно пробежаться по всем ячейкам...и потом определить кол-во ячеек с повторяющимеся символами...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
29.04.2010, 02:36     Двумерный массив строк #15
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
#include <iostream>
#include <cstring>
#include <iomanip>
 
int main()
{
    int count_row=0;
    int count_col=0;
 
    std::cout<<"vvedite kol-vo ctrok massiva= ";
    std::cin>>count_row;
    std::cout<<std::endl<<"vvedite kol-vo ctolbcov massiva= ";
    std::cin>>count_col;
    std::cout<<std::endl;
 
 
    /*выделяем память под динамический массив*/
    char** pArray=new char*[count_col];
     for (int i=0; i<count_col; i++)
     pArray[i]=new char[count_row];
 
 
 
     /*заполнение*/
    for (int i=0; i<count_row; i++)
    for (int j=0; j<count_col; j++){
             std::cout<<"vvedite ["<<i<<"]["<<j<<"] element= ";
             std::cin>>pArray[i][j];
    }
 
 
    /*вывод*/
    std::cout<<std::endl<<"Massiv simvolov sfornirovan: "<<std::endl;
    for (int i=0; i<count_row; i++){
        for (int j=0; j<count_col; j++){
            std::cout<<std::setw(3)<<pArray[i][j];
        }
        std::cout<<std::endl;
    }
 
 
    /*поиск ячеек с повторяющимися элементами*/
 
 
    return EXIT_SUCCESS;
}
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
29.04.2010, 02:57     Двумерный массив строк #16
Цитата Сообщение от inferno mf Посмотреть сообщение
ну вообще хотелось посимвольно пробежаться по всем ячейкам...и потом определить кол-во ячеек с повторяющимеся символами...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstring>
 
int main(){ 
    int i, j, m, c = 0;
        const int size = 4;
    char str[size][5] = {{"abba"}, {"aaad"}, {"abcd"}, {"abcd"}};
    for(m = 0; m < size; m++)
        for(i = 0; i < strlen(str[m]); i++)
            for(j = i+1; j < strlen(str[m]); j++)
                if(str[m][i] == str[m][j]){
                    c++;
                    m++;
                    i = 0;
                    j = i+1;
                }
    std::cout << c << std::endl;
 
    system("pause");
    return 0;
}
ответ будет 2, т.к. символы повторяются именно в 2ух ячейках
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
29.04.2010, 16:27  [ТС]     Двумерный массив строк #17
Цитата Сообщение от PointsEqual Посмотреть сообщение
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
#include <iostream>
#include <cstring>
#include <iomanip>
 
int main()
{
    int count_row=0;
    int count_col=0;
 
    std::cout<<"vvedite kol-vo ctrok massiva= ";
    std::cin>>count_row;
    std::cout<<std::endl<<"vvedite kol-vo ctolbcov massiva= ";
    std::cin>>count_col;
    std::cout<<std::endl;
 
 
    /*выделяем память под динамический массив*/
    char** pArray=new char*[count_col];
     for (int i=0; i<count_col; i++)
     pArray[i]=new char[count_row];
 
 
 
     /*заполнение*/
    for (int i=0; i<count_row; i++)
    for (int j=0; j<count_col; j++){
             std::cout<<"vvedite ["<<i<<"]["<<j<<"] element= ";
             std::cin>>pArray[i][j];
    }
 
 
    /*вывод*/
    std::cout<<std::endl<<"Massiv simvolov sfornirovan: "<<std::endl;
    for (int i=0; i<count_row; i++){
        for (int j=0; j<count_col; j++){
            std::cout<<std::setw(3)<<pArray[i][j];
        }
        std::cout<<std::endl;
    }
 
 
    /*поиск ячеек с повторяющимися элементами*/
 
 
    return EXIT_SUCCESS;
}

Сам двумерный массив строк реализован нормально, у меня в том коде проблема была только с поиском ячеек ,в которых есть строки с повторяющимеся символами...с этим и есть проблема(((

Добавлено через 31 минуту
Цитата Сообщение от Vorona Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstring>
 
int main(){ 
    int i, j, m, c = 0;
        const int size = 4;
    char str[size][5] = {{"abba"}, {"aaad"}, {"abcd"}, {"abcd"}};
    for(m = 0; m < size; m++)
        for(i = 0; i < strlen(str[m]); i++)
            for(j = i+1; j < strlen(str[m]); j++)
                if(str[m][i] == str[m][j]){
                    c++;
                    m++;
                    i = 0;
                    j = i+1;
                }
    std::cout << c << std::endl;
 
    system("pause");
    return 0;
}
ответ будет 2, т.к. символы повторяются именно в 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
40
41
42
43
44
45
46
47
#include <cstdlib>
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    int i,j,N,M;
    
    printf("Vvod razmernosti massiva\n");
    scanf("%d%d",&M,&N);
char* arrsym[M][N];
printf("Vvod dannyh po strokam\n");
 for( i = 0; i < M; i++)
     for( j = 0; j < N; j++){
     arrsym[i][j] = (char*) malloc(256);
     std::cin >> arrsym[i][j];
     }
   std::cout << std::endl;
   std::cout << std::endl;
   printf("Ishodnaya matrica\n");
 for( i = 0; i < M; i++){
     for( j = 0; j < N; j++)
        std::cout << arrsym[i][j] << "   ";
        std::cout << std::endl;
 }
 
 /* поиск ячеек с повторяющимеся символами   */
 int m,c=0;
  for(m = 0; m < i; m++)
                for(i = 0; i < strlen(*arrsym[m]); i++)
                        for(j = i+1; j < strlen(*arrsym[m]); j++)
                                if(arrsym[m][i] == arrsym[m][j]){
                                        c++;
                                        m++;
                                        i = 0;
                                        j = i+1;
                                }
        std::cout << c << std::endl;
 
  
  
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
постоянно 0 выдает(((
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
29.04.2010, 20:05     Двумерный массив строк #18
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
#include <iostream>
#include <cstring>
#include <iomanip>
#include <vector>
#include <conio.h>
 
int main()
{
    int rows=0;
    int cols=0;
 
    std::cout<<"kol-vo strok= ";
    std::cin>>rows;
    std::cout<<"kol-vo stolbcov= ";
    std::cin>>cols;
 
    std::vector< std::vector<std::string> > wordmas(rows, std::vector<std::string>(cols));
 
    for (int i=0; i<rows; i++)
    for (int j=0; j<cols; j++){
             std::cout<<"vvedite ["<<i<<"]["<<j<<"] element= ";
             std::cin>>wordmas[i][j];
    }
 
    std::cout<<std::endl<<"Massiv  sfornirovan: "<<std::endl;
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            std::cout<<std::setw(9)<<wordmas[i][j];
        }
        std::cout<<std::endl;
    }
 
    std::vector< std::vector<std::string> >::iterator p1=wordmas.begin();
 
    int cnt=0;
    int i=0;
    while (i<rows){
        int j=0;
        while (j<cols){
            int ii=0;
            while (ii<rows){
                int jj=0;
                while(jj<cols){
                    if (ii>=i && jj>=j){
                        ii=rows;
                        break;
                    } if ( wordmas[ii][jj]==wordmas[i][j] ){
                            ++cnt;
                            std::cout<<wordmas[ii][jj]<<std::endl;
                            ii=rows;
                            break;
                      }
                      ++jj;
                }
                ++ii;
            }
            ++j;
        }
        ++i;
    }
 
    std::cout<<"Count repetition words = "<<cnt;
    getch();
 
    return EXIT_SUCCESS;
}
в строковом массиве
hel hel tor
hel abc sdf
sdf hel lkj

будет 4 повтора, а именно:

здесь 4 hel - 1 оригинал и 3 повторных
2 sdf - 1 оригинал и 1 повторяющихся
Миниатюры
Двумерный массив строк  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2010, 20:07     Двумерный массив строк
Еще ссылки по теме:

Двумерный динамический массив строк C++

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

Или воспользуйтесь поиском по форуму:
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
29.04.2010, 20:07     Двумерный массив строк #19
+ я еще сделал чтобы повторяющиеся слова выводились на экран , для ясности
Yandex
Объявления
29.04.2010, 20:07     Двумерный массив строк
Ответ Создать тему
Опции темы

Текущее время: 23:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru