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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.67
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
#1

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

19.02.2010, 09:31. Просмотров 11520. Ответов 10
Метки нет (Все метки)

Всем привет, помогите мне решить вот такие задачи:
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 минут
Люди, помогите пожалуйста, очень нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 09:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамические строки и массивы строк (C++):

Шаблонные функции и динамические массивы строк - C++
Всем доброго времени суток. Я уже наверное всех достал вопросами, но опять не могу отловить ошибку сам... Задача: написать шаблонную...

Динамические массивы, удаление строк/столбцов - C++
Программка делает следующее: удаляет строки/столбцы, состоящие только из 0, помогите переделать под динамический массив (с учетом того, что...

Динамические массивы и строки - C++
Господа, не подскажете готовые и более-менее популярные библиотеки (и где их можно скачать) для чистого ANSI С++ для работы с...

Динамические массивы, файлы, строки - C++
В первой строке файла указано количество строк. Выделить память под массив указателей на строки, ввести текст построчно, динамически...

Взять статические строки заменить на динамические массивы и распечатать - C++
нужно решить задачу Взять статические строки заменить на динамические массивы и распечатать

Пользователь вводит две строки, которые сохраняются в динамические массивы - C++
Кто знает, как решить задачу на С++?Задание на строки. Пользователь вводит две строки, которые сохраняются в динамические массивы. ...

10
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
20.02.2010, 10:56  [ТС] #2
Мне до понедельника нужно хотя бы 2 задачи из 3 сделать, помогите пожалуйста!!!
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
20.02.2010, 11:13 #3
Ну так чем помочь-то? Где твой код? Что именно не получается? Выкладывай, поглядим.....
0
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();
 }
Помогите найти мне самую длинную строку, а остальные строки выровнять до длины самой большой строки, используя символ " ! ".
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 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;
}
1
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
20.02.2010, 14:41  [ТС] #6
CyBOSSeR, это не совсем то что мне нужно. Твоя программа ищет не максимальную строку, а максимальное слово, а остальные слова дополняет "!". Но все равно спасибо.
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
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;
}
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.
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
21.02.2010, 22:57 #10
Хехе, прошу прощения - я часто забываю вывод результата на экран, т.к. смотрю результат в дебаге по точкам останова. Программа делает то что надо, но результаты просто не выводятся. Чтобы все было ОК добавьте перед return 0 такой код
C++
1
2
for (int i = 0; i < N; i++)
    cout << strs[i] << endl;
1
Sens0
15 / 2 / 0
Регистрация: 06.12.2009
Сообщений: 27
22.02.2010, 11:14  [ТС] #11
Спс, так работает.
0
22.02.2010, 11:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2010, 11:14
Привет! Вот еще темы с ответами:

Динамические массивы. Найти наибольшие элементы каждой строки матрицы Х и записать их в массив Y - C++
Найти наибольшие элементы каждой строки матрицы Х и записать их в массив Y. Размер Марицы вводить с клавиатуры, а элементы разместить в...

ДИНАМИЧЕСКИЕ МАССИВЫ.Найти номер строки, в которой сумма отрицательных нечетных элементов самая большая - C++
не знаю почему не правильно считает ведь все правильно сделал?(( подскажите кто нибуть Пожалуста #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Динамические массивы и функции. Динамические массивы. - C++
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные числу, введенному с клавиатуры.

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru