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

Массив указателей на строки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.63
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
04.04.2011, 00:21     Массив указателей на строки #1
Помогите .
вот само задание 1. Рассортировать слова русского текста по возрастанию отношения количества гласных букв к общему количеству букв в слове. Сначала думал что здесь не сложно но всё что у меня получилось вот:
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
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>
#include <string.h>
int main()  {     int k=0,kpred=0;   char *q;  q=new char[40];
int n;
   char C,*p, t[40];
 
char **S;
printf("vvedite col-vo strok");
 scanf("%d",&n);
 clrscr();
 S=new char*[n+1];
for(int i=0;i<n;i++)
{ gets(t);
 
 S[i]=new char [strlen(t)];
  strcpy( S[i],t);
  }
 
for(int m=0;m<n;m++){
 for(int i=0;i<n;i++)
 {
 for(int j=0;  S[i][j]; j++)
                 if (strchr("АаЕеИиОоУуЮюЯя" , S[i][j]))k++;else{}
                 if(k<kpred)
                 {
                 strcpy(q,S[i-1]);
              strcpy(S[i-1],S[i]);
               strcpy(S[i],q);kpred=k;k=0;
 
               }
     else{kpred=k;k=0;}
 }
 kpred=0;
 }
 
   for(int i=n-1;i>=0;i--)        puts (S[i]);
 
  getch();                       return 0;    }
помогите плз написать данную программу или подскажите как это сделать

 Комментарий модератора 
Используйте теги форматирования кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2011, 00:21     Массив указателей на строки
Посмотрите здесь:

Упорядочить одномерный массив указателей на строки C++
C++ осуществить вывод строк из файла используя массив указателей на эти строки.
C++ Массив указателей на строки
C++ Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
C++ создать статический массив строк как статический массив указателей на строки, задание ниже -->
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
05.04.2011, 01:38  [ТС]     Массив указателей на строки #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
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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
 
const n=5;
class Lab4Stat
{  // Статический массив строк
   char *s[n],
    // вспомогательная динамическая строка
   *t ;
   //  max количество символов в строках:
    int mmax,
   //1-мерный массив количества гласных букв...
    GL[n]  ;
   //============================  Конструктор  ======================
    public:
    Lab4Stat ( int kmax=20)
    { mmax=kmax;
      // Вспомогательныая строка
       t=new char[mmax];
    fflush(stdin);
    for(int i=0; i<n; i++)
    {   gets(t);
        s[i]=new char[strlen(t)];
        strcpy(s[i], t);
    }
   }
   //======================= Вывод массива строк =======================
   void OutStr()
   {   // Вывод массива строк
      cout<<endl;
      for(int i=0;i<n;i++)
         printf("\n%5d  %s", GL[i],s[i]);
   }
   // ------------------ Построение массива гласных букв ---------------
   void FunGL()
   { int kGL;
    for(int i=0; i<n; i++)
    {  kGL=0;
       for (int j=0; j<strlen (s[i]); j++)
         if (strchr("АаЕеУуОоЯяИиЮю", s[i][j]) )
            kGL++;
       GL[i]=kGL;
    }
   }
  void SortStr ()
  { int r, flag=1, k=n;
    while(flag)
    {  k--; flag=0;
      for(int i=0;  i<k;  i++)
      if (
           GL[i]>GL[i+1]
          || (GL[i]==GL[i+1] &&
              strcmp(s[i],s[i+1])>0)
         )
    //-  сравнение двух строк.
        {  flag=1;
          // Перестановка адресов двух строк.
              t= s[i];
              s[i]= s[i+1];
              s[i+1]= t;
           // Переставляем размерности этих строк
              r=GL[i];
              GL[i]=GL[i+1];
              GL[i+1]=r;
        }
      }
    }
 } ;
int main()
{
   int  NMAX;
   // вводим max количество символов в строках:
   cout<<"\nmax length of string= ";
   scanf("%d",&NMAX);
   Lab4Stat OStr(NMAX);
   OStr.FunGL();
   cout<<"\n Array o string\n";
   OStr.OutStr();
   OStr.SortStr();
   cout<<"\n Result of sorting\n";
   OStr.OutStr();
 getch();
 return 0;
 }
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
05.04.2011, 11:12     Массив указателей на строки #3
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
#include<windows.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
 
char vow[]="АаЕеЁёИиЙйОоУуЫыЭэЮюЯя";
 
int CompChars(const void* a, const void* b){
    return *(char*)a-*(char*)b;
}
 
double Ratio(const char* word){
    double couVow=0, cou=strlen(word);
    for(; *word; ++word){
        if(bsearch(word, vow, strlen(vow), sizeof(*vow), CompChars)){
            ++couVow;
        }
    }
    return couVow/cou;
}
 
int CompRatios(const void* a, const void* b){
    double res=Ratio(*(char**)a)-Ratio(*(char**)b);
    return res<0?-1:res>0?1:0;
}
 
int main(){
    SetConsoleOutputCP(1251);
    qsort(vow, strlen(vow), sizeof(*vow), CompChars);
    char* words[]={"возрастанию", "Отношения", "количества", "гласных", "букв"};
    qsort(words, sizeof(words)/sizeof(*words), sizeof(*words), CompRatios);
    int i;
    for(i=0; i<sizeof(words)/sizeof(*words); ++i){
        printf("%s - %f\n", words[i], Ratio(words[i]));
    }
}
grrrrr
 Аватар для grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
05.04.2011, 11:42     Массив указателей на строки #4
что значит "Рассортировать слова русского текста по возрастанию отношения количества гласных букв к общему количеству букв в слове." , я так понимаю что по количеству гласных в слове по возрастанию?

т.е. - Вася, Мария, параплан..и т.д. так?
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
05.04.2011, 22:55  [ТС]     Массив указателей на строки #5
grrrrr да именно так и нужно сортировать .
igorrr37 можно и так тут не принципиально как делать соотношение в процентах или по количеству букв как писал grrrrr но код что вы написали сортирует лишь 1 строку а мне необходимо что бы мы сами вводили 5 строк пусть n=5 const количество строк а программа завершалась выведеным текстом отсортированным
У меня появилась идея я напишу. вечером закину надеюсь получиться

Добавлено через 1 час 31 минуту
У меня есть идея как это сделать но я не знаю как.(
после ввода 5 строк все слова закинуть в новый массив и уже там работать с ним присвоив каждому слову каоличество гласных использую другой массив чисел где и будет хранить их число

Добавлено через 2 часа 44 минуты
Люди я захимичил программу голова не варит не могу понять как сделать сортировку 1 строки .
все строки я скинул в 1 массив каждое слово через 1 пробел помогите отсортировать 1 строку.
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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define DELIM " ,.:;!?  "
const n=5;
class Lab4Stat
{  // Статический массив строк
   char *s[n],slov[600],
    // вспомогательная динамическая строка
   *t ;
   //  max количество символов в строках:
    int mmax,
   //1-мерный массив количества гласных букв...
    GL[n]  ;
   //============================  Конструктор  ======================
    public:
    Lab4Stat ( int kmax=20)
    { mmax=kmax;
      // Вспомогательныая строка
       t=new char[mmax];
    fflush(stdin);
    for(int i=0; i<n; i++)
    {   gets(t);
        s[i]=new char[strlen(t)];
        strcpy(s[i], t);
    }
   char *t_;
   char *pin;
       for(int i=0;i<n;i++)
       {
       pin=s[i];
        for(t_ = strtok(pin, DELIM); t_; t_ = strtok(NULL, DELIM))
         {
        strcat(slov,t_);
        strcat(slov," ");
       }  }
      printf("%s",slov);
   }
 
 } ;
int main()
{
   int  NMAX;
   // вводим max количество символов в строках:
   cout<<"\nmax length of string= ";
   scanf("%d",&NMAX);
   Lab4Stat OStr(NMAX);
 getch();
 return 0;
 }
Добавлено через 1 минуту
здесь нужно отсортировать строку slov

Добавлено через 1 час 14 минут
Люди мне это напоминает блог)
я продолжил писать ту прогу но блин мозга у меня не хватает как сделать сортировку я написал для нахождения слова с самым большим количеством гласных использовала часть программы уже написанной на этой проекте
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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define GLAS_LETT "АаЕеЁёИиЙйОоУуЫыЭэЮюЯя"
const n=5;
class Lab4Stat
{  // Статический массив строк
   char *s[n],slov[410],*q,
    // вспомогательная динамическая строка
   *t ;
 
      char *p_,*p;
   char *pin;
   //  max количество символов в строках:
    int mmax,
   //1-мерный массив количества гласных букв...
    GL[n]  ;
   //============================  Конструктор  ======================
    public:
    Lab4Stat ( int kmax=20)
    { mmax=kmax;
      // Вспомогательныая строка
       t=new char[mmax];
    fflush(stdin);
    for(int i=0; i<n; i++)
    {   gets(t);
        s[i]=new char[strlen(t)];
        strcpy(s[i], t);
    }
 
       for(int i=0;i<n;i++)
       {
       pin=s[i];
        slov[0]='\0';
        for(p_ = strtok(pin, " "); p_; p_ = strtok(NULL, " "))
         {
        strcat(slov,p_);
        strcat(slov," ");
       }  }
      printf("%s",slov);
   }
int glas(const char *wrd){
    int cnt = 0, i, j;
    for(i = 0; i < strlen(wrd); ++i){
        for(j = 0; j < strlen(GLAS_LETT); ++j){
            if(wrd[i] == GLAS_LETT[j])
                ++cnt;
        }
    }
    return cnt;
}
 
   void sort()
   {
        p_  = strtok(slov ," ");
    for(p = strtok(slov, " "); p; p = strtok(NULL, " ")){
        if(glas(p) > glas(p_))
            p_ = p;
    }
    printf("\n\nResult word -> %s", p_);
 
   }
 } ;
int main()
{
   int  NMAX=80;
   // вводим max количество символов в строках:
 
      Lab4Stat OStr(NMAX);
    OStr.sort();
 getch();
 return 0;
 }
wolf.diesel
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
05.04.2011, 23:01     Массив указателей на строки #6
1. Вводим строки.
2. Пока вводим, создаем новую строку, закидываем ввод.
3. Идем указателем по массиву строк. Массив строк объявляется как char**.
4. Считаем буквы в строке, исключая пробелы.
5. Считаем гласные. Запоминаем отношение, в массив, к примеру.
6. Прошлись по массиву, отсортируем массив с отношениями и параллельно отсортируем массив со строками.
7. Профит.

ЛИБО

Введи в класс структуру
C++
1
2
3
4
5
struct something {
 something * backRef;
 char * stringPointer;
 float otnoshenie;
 something * fwdRef;
Теперь, когда ты будешь проходить по массиву строк и считать отношение, ты будешь создавать структуру, в которой сохранишь значения данных.
А дальше - все просто: пузырьком сортируешь свои структуры, в которых уже есть указатель на строку, а строку выводишь не из массива строк, а исходя из последовательности списка структур.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 04:42     Массив указателей на строки
Еще ссылки по теме:

C++ , как создать в файле массив указателей фиксированной размерности на строки текста?
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
Как связать строки и массив указателей на них C++

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

Или воспользуйтесь поиском по форуму:
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
06.04.2011, 04:42  [ТС]     Массив указателей на строки #7
я понимаю что я должен сделать я не понимаю как это реализовать как должен выглядеть код

Добавлено через 53 минуты
простите в последнем варианте ошибка в сортировке вот правильный вариант
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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define GLAS_LETT "eyuoai"
const n=5;
class Lab4Stat
{  // Статический массив строк
   char *s[n],slov[410],*q,
    // вспомогательная динамическая строка
   *t ;
 
      char *p_,*p;
   char *pin;
   //  max количество символов в строках:
    int mmax,
   //1-мерный массив количества гласных букв...
    GL[n]  ;
   //============================  Конструктор  ======================
    public:
    Lab4Stat ( int kmax=20)
    { mmax=kmax;
      // Вспомогательныая строка
       t=new char[mmax];
    fflush(stdin);
     slov[0]='\0';
    for(int i=0; i<n; i++)
    {   gets(t);
        s[i]=new char[strlen(t)];
        strcpy(s[i], t);
    }
 
       for(int i=0;i<n;i++)
       {
       pin=s[i];
 
        for(p_ = strtok(pin, " "); p_; p_ = strtok(NULL, " "))
         {
        strcat(slov,p_);
        strcat(slov," ");
       }  }
      printf("%s",slov);
   }
int glas(const char *wrd){
    int cnt = 0, i, j;
    for(i = 0; i < strlen(wrd); i++){
        for(j = 0; j < 6; j++)
        {
            if(wrd[i] == GLAS_LETT[j])
                ++cnt;
        }
    }
    return cnt;
}
 
   void sort()
   {
   char str[410];
   strcpy(str,slov);
        p_  = strtok(str ," ");
    for(p = strtok(slov, " "); p; p = strtok(NULL, " "))
    {
        if(glas(p) > glas(p_))
            p_ = p;
    }
    printf("\n\nResult word -> %s%d", p_,glas(p_));
 
   }
 } ;
int main()
{
   int  NMAX=80;
   // вводим max количество символов в строках:
 
      Lab4Stat OStr(NMAX);
    OStr.sort();
 getch();
 return 0;
 }
Добавлено через 4 часа 36 минут
люди я кажется сделал но нужно по тестировать и отредактировать что красиво было потом выкину оцените

Добавлено через 9 минут
люди если увидите ошибку или придумаете как подправить пишите)
но это работает только с англ текстом с русским не правильно работает хотя может потому что у меня борланд 5 версии не русифицированный .
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.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define GLAS_LETT "qeuoai"
const n=5;
class Lab4Stat
{
   char *s[n],slov[410],xren[20][20], *x,*t ;
      char *p_,*p;
      char *pin;
    int mmax,p1;
    public:
    Lab4Stat ( int kmax=20)
    { mmax=kmax;
       t=new char[mmax];
    fflush(stdin);
     slov[0]='\0';
     p1=0;
    for(int i=0; i<n; i++)
    {   gets(t);
        s[i]=new char[strlen(t)];
        strcpy(s[i], t);
    }
       for(int i=0;i<n;i++)
       {
       pin=s[i];
 
        for(p_ = strtok(pin, " "); p_; p_ = strtok(NULL, " "))
         {p1++;
        strcat(slov,p_);
        strcat(slov," ");
       }  }
   }
int glas(const char *wrd){
    int cnt = 0, i, j;
    for(i = 0; i < strlen(wrd); i++){
        for(j = 0; j < 6; j++)
        {
            if(wrd[i] == GLAS_LETT[j])
                ++cnt;
        }
    }
    return cnt;
}
   void sort()
   {
 
   int i;
   char str[410];
   strcpy(str,slov);
        p_  = strtok(str ," ");
        strcpy(xren[0],p_);
    for(p = strtok(slov, " "),i=0; p,i<p1; p = strtok(NULL, " "),i++)
    {
 
        if(glas(p) > glas(p_))
            p_ = p;
            strcpy(xren[i],p);
            }
            for(int j=1;j<p1;j++)
        {
            for(i=0;i<p1-1;i++)
            {   if(glas(xren[i])<glas(xren[i+1]))
                {
                x=new char[20];
            strcpy(x,xren[i]);
             xren[i][0]='\0';
            strcpy(xren[i],xren[i+1]);
              xren[i+1][0]='\0';
 
            strcpy(xren[i+1],x);
                }
           }
        }
    for(i=0;i<p1;i++)
    printf("%s  ",xren[i]);
   }
 
 };
int main()
{
 
   int  NMAX=80;
      Lab4Stat OStr(NMAX);
    OStr.sort();
 getch();
 return 0;
 }
Yandex
Объявления
06.04.2011, 04:42     Массив указателей на строки
Ответ Создать тему
Опции темы

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