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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.67
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
19.02.2010, 09:31     Динамические строки и массивы строк #1
Всем привет, помогите мне решить вот такие задачи:
1). Вводится массив строк символов. Необходимо найти самую длинную строку и увеличить остальные строки в массиве до длины самой большой строки, используя символ " ! ".

2). Дано 2 строки слов. Необходимо объединить их в одну за принципом:
Дано:
строка1_слово1 строка1_слово2 строка1_слово3
строка2_слово1 строка2_слово2 строка2_слово3
Получить:
строка1_слово1 строка2_слово1 строка1_слово2 строка2_слово2 строка1_слово3 строка2_слово3

3). Вводится строка символов, и начиная со средины строки буквы начинают "падать вниз" - сначала одна, потом 2, и тд. При этом строка, постепенно сжимаясь, в конце вовсе исчезает.

Добавлено через 13 часов 29 минут
Люди, помогите пожалуйста, очень нужно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
20.02.2010, 10:56  [ТС]     Динамические строки и массивы строк #2
Мне до понедельника нужно хотя бы 2 задачи из 3 сделать, помогите пожалуйста!!!
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
20.02.2010, 11:13     Динамические строки и массивы строк #3
Ну так чем помочь-то? Где твой код? Что именно не получается? Выкладывай, поглядим.....
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
20.02.2010, 12:32  [ТС]     Динамические строки и массивы строк #4
Вот я пробовал сделать 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
#include<iostream.h>
#include<string.h>
#include<conio.h>         
#include<process.h>     
void main()
{ 
  char* str_temp=new char[255];   
  char** m_str;
  int i,n;
  cout<<"\n Vvedite kolichestvo stkok, kotorie vvod9tsa ";   cin>>n;
  m_str=new char*[n]; 
  if (!m_str)       
  {
     cerr<<"\n Oshibka pri vidilenii pamiati";  
     exit(1);
  } 
  cin.ignore();     
  for(i=0;i<n;i++)
  { 
     cout<<"\n Vvedite "<<i+1<<"-yu stroku ";
     cin.getline(str_temp,255);
     m_str[i]=new char[strlen(str_temp)+1];     
     if (!m_str[i])     
     {
        cerr<<"\n Oshibka pri vidilenii pamiati";
        exit(1);    
     }
    strcpy(m_str[i],str_temp);
   }
   delete[] str_temp;             
   cout<<"\n Itogovij massiv strok\n";
   for(i=0;i<n;i++)
   { 
      cout<<m_str[i]<<endl; 
      delete[] m_str[i];
   }         
   delete[] m_str;  
   getch();
 }
Помогите найти мне самую длинную строку, а остальные строки выровнять до длины самой большой строки, используя символ " ! ".
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2010, 13:54     Динамические строки и массивы строк #5
Sens0, 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
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
#include <iostream>
 
int MaxLenght(const char* const* arr, int size)
{
  int max_lenght = 0;
 
  for(int i = 0; i < size; ++i){
    int lenght = strlen(arr[i]);
 
    if(lenght > max_lenght)
      max_lenght = lenght;
  }
 
  return max_lenght;
}
 
void Transform(char** arr, int size)
{
  int max_lenght = MaxLenght(arr, size);
 
  if(max_lenght == 0)
    return;
 
  for(int i = 0; i < size; ++i){
    int lenght = strlen(arr[i]);
 
    if(lenght < max_lenght){
      char* str = new char[max_lenght + 1];
 
      strcpy(str, arr[i]);
 
      for(int j = lenght; j < max_lenght; ++j)
        str[j] = '!';
 
      str[max_lenght] = '\0';
 
      delete [] arr[i];
      arr[i] = str;
    }
  }   
}
 
int main()
{
  int size = 0;
 
  std::cout << "Number of strings: ";
  std::cin >> size;
 
  const int max_string_lenght = 255;
 
  char** arr = new char*[size];
 
  for(int i = 0; i < size; ++i)
    arr[i] = new char[max_string_lenght + 1];
 
  for(int i = 0; i < size; ++i){
    std::cout << "Enter string " << i + 1 << ": ";
    std::cin >> arr[i];
  }
 
  std::cout << "Initial strings:" << std::endl;
 
  for(int i = 0; i < size; ++i)
    std::cout << arr[i] << std::endl;
 
  Transform(arr, size);
 
  std::cout << "Transformed strings:" << std::endl;
 
  for(int i = 0; i < size; ++i)
    std::cout << arr[i] << std::endl;
 
  for(int i = 0; i < size; ++i)
    delete [] arr[i];
 
  delete [] arr;
 
  return 0;
}
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
20.02.2010, 14:41  [ТС]     Динамические строки и массивы строк #6
CyBOSSeR, это не совсем то что мне нужно. Твоя программа ищет не максимальную строку, а максимальное слово, а остальные слова дополняет "!". Но все равно спасибо.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,423
20.02.2010, 17:54     Динамические строки и массивы строк #7
2 Sens0 В массиве объем заранее определен поэтому дозаполнить "!" очень легко.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char a[3][10]; // 3 строки по 10 символов
// тут как то заполнили эти строки
// а теперь дозаполним '!'
for (int i = 2; i > 0; i--)
{
   a[i][9] = '\0'; // завершаем строку
   for (int j = 8; j > 0; j--)
   {
      a[i][j] = '!';
      if ( a[i][j] == 0 ) // наткнулись на прошлый конец строки?
          break; // выходим. дальше же нормальная строка и не стоит её портить
   }
}
Если же массив динамический то не понятно... нужно как то перевыделять память для добавления этих "!"? Не пойму

Добавлено через 24 минуты
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
#include <iostream>
#include <string>
 
using namespace std;
 
#define N 3
 
int main()
{
 
    char** strs = new char*[N]; // 3 строки
    int max_i = 0, max_len = 0, cur_len = -1;
    for (int i = 0; i < N; i++)
    {
        string temp;
        getline(cin, temp);
        cur_len = temp.length()+1;
        if ( cur_len > max_len ) { max_len = cur_len; max_i = i; }
        strs[i] = new char[cur_len];
        memcpy(strs[i], temp.c_str(), temp.length()+1);
    }
    for (int i = 0; i < N; i++)
    {
        if ( i == max_i ) continue; // с максимальной строкой ничего не делаем
        string temp = strs[i]; // копируем строку
        delete [] strs[i]; strs[i] = new char[max_len]; // перевыделяем память
        memset(strs[i], '!', max_len);
        strs[i][max_len-1] = '\0';
        memcpy(strs[i], temp.c_str(), temp.length());
    }
return 0;
}
Вот так решилось. Ввел
a
bb
ccc
На выходе
a!!
bb!
ccc
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2010, 18:28     Динамические строки и массивы строк #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
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
 
/*
*   Вводится массив строк символов. Необходимо найти самую длинную строку и увеличить остальные строки 
*   в массиве до длины самой большой строки, используя символ " ! ".
*/
 
int main(){
    std::string buf;
    std::vector<std::string> arr;
    
    std::cout << "Enter some strings ending with empty one:" << std::endl;
    while ( true ){
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        arr.push_back(buf);
    }
 
    if ( arr.empty() ){
        std::cerr << "Error!" << std::endl;
        return 1;
    }
    
    size_t max_len = arr[0].size();
    for ( std::vector<std::string>::const_iterator i = arr.begin() + 1; i != arr.end(); ++i )
        if ( i->size() > max_len )
            max_len = i->size();
    
    for ( std::vector<std::string>::iterator i = arr.begin(); i != arr.end(); ++i ){
        int d;
        if ( ( d = i->size() ) < max_len ){
             d = max_len - d;
             while ( d-- )
                i->push_back('!');
        }
    }
    
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    return 0;
}
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
21.02.2010, 10:37  [ТС]     Динамические строки и массивы строк #9
insideone, а у меня программа не работает. Ввожу
Цитата Сообщение от insideone Посмотреть сообщение
a
bb
ccc
И ничего не происходит, только Press any key to continue.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,423
21.02.2010, 22:57     Динамические строки и массивы строк #10
Хехе, прошу прощения - я часто забываю вывод результата на экран, т.к. смотрю результат в дебаге по точкам останова. Программа делает то что надо, но результаты просто не выводятся. Чтобы все было ОК добавьте перед return 0 такой код
C++
1
2
for (int i = 0; i < N; i++)
    cout << strs[i] << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2010, 11:14     Динамические строки и массивы строк
Еще ссылки по теме:

C++ ДИНАМИЧЕСКИЕ МАССИВЫ.Найти номер строки, в которой сумма отрицательных нечетных элементов самая большая
C++ Шаблонные функции и динамические массивы строк
Взять статические строки заменить на динамические массивы и распечатать C++

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

Или воспользуйтесь поиском по форуму:
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
22.02.2010, 11:14  [ТС]     Динамические строки и массивы строк #11
Спс, так работает.
Yandex
Объявления
22.02.2010, 11:14     Динамические строки и массивы строк
Ответ Создать тему
Опции темы

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