Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Как организовать массив разных строк и длины
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
neo_den neo_den вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.01.2006
По умолчанию Как организовать массив разных строк и длины - 09.05.2006, 15:48

Не так давно нашел книжку по С, поразбирал примеры оттуда.
Но вот возник вопрос.
Организуется массив строк разной длины. Ни размеры массива ни длины строк неизвестны, делается все динамически.
Код:
Код:
#include<stdio.h>
#include<stdlib.h>

void main()
{
    double **line;
    int i,j,n;
    double dd;
    int *m,b;

    printf("nEnter number of rows n=");
    scanf("%d",&n);
    line=(double**)calloc(n,sizeof(double*));
    m=(int*)malloc(sizeof(int)*n);

    for(i=0;i<n;i++)
    {
  printf("Enter length of row m[%d]=",i);
  scanf("%d",&m[i]);
  line[i]=(double*)calloc(m[i],sizeof(double));
  for(j=0;j<m[i];j++)
  {
      printf("line[%d][%d]=",i,j);
      scanf("%le",&dd);
      line[i][j]=dd;
  }
    }

    printf("Result");
    for(i=n-1;i>=0;i--)
    {
  printf("nRow %d, elements %d:n",i,m[i]);
  for(j=0;j<m[i];j++)
      printf("t%f",line[i][j]);
  free(line[i]);
    }
    free(line);
    free(m);
    printf("n");
}
И никак ума не приложу - а как отсортировать все это хозяйство :
1) по длинам строк
2) элементы каждой строки по возрастанию

По первому пункту на мой взгляд можно бы ло бы так:
добавить перед выводом результата
Код:
for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
      if(m[i]>m[j])
      {
    b=m[i];
    m[i]=m[j];
    m[j]=b;
      }
Но это приводит к ошибке - выводятся не те элементы, которые были введены, часть из них получаются нулевыми.
Делал аналогичную конструкцию и для сортировки *line[i] - тоже не дает решения.

Вопрос небольшой, буду длагодарен за помощь.
Ответить с цитированием
  (#2 (permalink)) Старый
Sartorius Sartorius вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.04.2006
По умолчанию 09.05.2006, 17:02

Си не позволяет так просто сравнивать строки, когда ты пришешь
m[i] < m[j] ты сравниваешь указатели на строки, используй strcmp()
Ответить с цитированием
  (#3 (permalink)) Старый
Rockie Rockie вне форума
Member
 
Сообщений: 126
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2005
По умолчанию 09.05.2006, 19:05

насколько я понял, получается нечто вроде матрицы с переменной длиной строк. поэтому чтобы такое сортировать, нужно где-то запоминать длину для каждой строчки отдельно. похоже в твоем коде она сохраняется в массиве длин m[]. сортируешь его пузырьком(хуже не придумаешь) и меняешь строчки местами. с элементами внутри строк - по аналогии.
Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void main()
{  int i,j,
       n = 3;
   double line[3][10]= { {12,34,56,67,87,9},
                         {21,54,65,87,90},
                         {98,76,65,54,43,32,123}
                       };
   int m[3] = {6,5,7};                            // lenght array
   int temp[10] = {0,0,0,0,0,0,0,0,0,0};          // temp for swap strings


int t = 0;                 // BUBBLESORT
bool flag=1;
while(flag)
 {flag=0;                  // no swap flag
  for(int i=0;m[i+1];i++)  // if next exists
   { if(m[i]>m[i+1])
       { for(int k=0;k<m[i];k++) // if m[i]>[i+1] SWAP STRINGS
         temp[k]=line[i][k];     // copy string to temp

         for(int k=0;k<m[i];k++)
         line[i][k]=line[i+1][k];

         for(int k=0;k<m[i];k++)
         line[i+1][k]=temp[k];

         t = m[i]; m[i] = m[i+1]; m[i+1] = t; // swap lenght 

         flag=1;                 // flag = 1 means that was swap
       }
   }
 }

for(int i=0;i<n;i++)
 { for(int j=0;j<m[i];j++)
   printf("%.2f ",line[i][j]);
   printf("n");
 }

getch();
}
Ответить с цитированием
  (#4 (permalink)) Старый
Sartorius Sartorius вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.04.2006
По умолчанию 09.05.2006, 22:39

Что бы отсортировать набор строк, вовсе не нужно таскать эти строки
туда сюда по памяти, достаточно обменивать указатели на них.
Ответить с цитированием
  (#5 (permalink)) Старый
Rockie Rockie вне форума
Member
 
Сообщений: 126
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2005
По умолчанию 10.05.2006, 01:59

Цитата:
Originally posted by Sartorius
[b]не нужно таскать эти строки туда сюда
согласен. впрочем я и не претендовал на лучшее по производительности решение (не буду бросаться на амбразуру утверждая что сортировка пузырьком - the best) =)
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
neo_den neo_den вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.01.2006
По умолчанию 10.05.2006, 11:48

To Rookie

Твой код я опробовал, вроде работает. Хотя ты его сделал и для статического определения массивов, но понятно, что после динамического создания массива в моем листиге с ним я обращаюсь как с обычным.
Хотя есть и особенность, которую я бы и хотел использовать, а именно обменивать иказатели. Длина строк действиельно хранится в m[].
Вот как бы по сотртировке m[i]?
Ну и аналогично с сортировкой внутри строк.
А что до типа сортировки - пусть будет хоть какой-нибудь.
Ответить с цитированием
  (#7 (permalink)) Старый
neo_den neo_den вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.01.2006
По умолчанию 10.05.2006, 11:48

To Rookie

Твой код я опробовал, вроде работает. Хотя ты его сделал и для статического определения массивов, но понятно, что после динамического создания массива в моем листиге с ним я обращаюсь как с обычным.
Хотя есть и особенность, которую я бы и хотел использовать, а именно обменивать иказатели. Длина строк действиельно хранится в m[].
Вот как бы по сотртировке m[i]?
Ну и аналогично с сортировкой внутри строк.
А что до типа сортировки - пусть будет хоть какой-нибудь.
Ответить с цитированием
  (#8 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 10.05.2006, 22:20

Просто меняешь line[i] и line[j] - то есть меняешь указатели, это эквивалентно переписыванию строк.
Ответить с цитированием
  (#9 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 10.05.2006, 22:20

Просто меняешь line[i] и line[j] - то есть меняешь указатели, это эквивалентно переписыванию строк.
Ответить с цитированием
  (#10 (permalink)) Старый
neo_den neo_den вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.01.2006
По умолчанию 11.05.2006, 18:38

Спасибо, понял.
Ответить с цитированием
  (#11 (permalink)) Старый
neo_den neo_den вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.01.2006
По умолчанию 11.05.2006, 18:38

Спасибо, понял.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод переменных с разных строк. Estonec86 С/С++ 10 25.11.2011 13:30
Массив строк fredwriter Pascal 3 06.05.2010 10:52
Массив строк как с ним работать Зирк С/С++ 9 04.05.2010 13:01
пользовательская функция, возвращающая массив перем-й длины AlexSh Visual Basic 11 07.06.2006 19:15
Как отсортировать массив строк в С++ Igorock Вопросы начинающих программистов 6 15.04.2006 14:06
Как сформировать массив заданной длины Black Monarh Pascal 22 02.12.2005 22:08
Как организовать ввод текста, состоящего из строк redwind Вопросы начинающих программистов 0 26.02.2005 23:18
Множества строк как организовать поиск MrVik Delphi 17 31.01.2005 22:18
Как сформировать массив строк Dzmitry Вопросы начинающих программистов 4 31.01.2005 17:51
Как можно в Delphi организовать связь между двумя компьютерами для передачи строк SpaceShark Delphi 7 27.01.2005 22:50
Как можно сделать в ListView свой цвет фон для разных строк evg Delphi 1 05.08.2004 11:34
как отсортировать массив состоящий из строк разной длины VolanD С/С++ 3 07.05.2004 02:27



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов