1

Тема: Рядки і сортування рядків

допоможіть  с  сортуванням    рядків       від   меншого до більшого     

#include <vcl.h>
   #include<iostream.h>
#include<string.h>
#include<ctype.h>
#define max 10
#define k 5
#include<conio.h>
   void sort (char *v_sl[],int i);
int main()
{int i=0,n=0,p=0,q=0,m=0;
 char m_s[k][max];
 char v_s[100][max];
 char sl[max];

 while((i<k)&&(gets(sl)))
  {strcpy(v_s[n],sl);
   if(sl[0]==toupper(sl[0]))
    {strcpy(m_s[i],sl);
       i++;
    }
      else
      cout<<endl<<"line does not start with a capital letter!";
    n++;

  }
  cout<<endl<<"all input lines:";
 for(i=0;i<n;i++)
  {
  cout<<v_s[i]<<endl;
  }
   cout<<endl<<"correct lines:"<<endl;
 for(i=0;i<k;i++)
  {
  cout<<m_s[i]<<endl;
  }
  p=strlen(v_s[0]);
  for(i=0;i<n;i++)
   {q=strlen(v_s[i]);
    if(q>p)
    {p=q;}
   }
   cout<<endl<<"the longest row:";
   for(i=0;i<n;i++)
   {if(strlen(v_s[i])==p)
    cout<<endl<<v_s[i];
   }

  cout<<endl<<"enter";

  getch();
  return 0;
       }

17   завдання   напшіть  будь-ласка коментарі до коду

2

Re: Рядки і сортування рядків

http://не-дійсний-домен/i7/88f518d3777f6940fa723478a547cfb7/4-55-1696/6105603/HMgA58oa5QU_240.jpghttp://не-дійсний-домен/a3/2013-02-09-16-20/i7-4108925/240x180-r/i.gif

3

Re: Рядки і сортування рядків

reywwe95 написав:

допоможіть  с  сортуванням    рядків       від   меншого до більшого

reywwe95 написав:

17   завдання   напшіть  будь-ласка коментарі до коду

З чим із двох, все-таки?..

З.І: Коментарі до коду:

1. Читабельність слабка завдяки недостатньому форматуванню та назвам змінних.
2. Функція sort() не визначена.

Чи малося на увазі інше? :)

4

Re: Рядки і сортування рядків

з   2   завданнями   пропустив лекцію нічого не  розумію якщо  не  скаладно    напишть новий код  по 17  завданню  з коментарями

5 Востаннє редагувалося User 298 (09.02.2013 19:08:26)

Re: Рядки і сортування рядків

reywwe95 написав:

з   2   завданнями   пропустив лекцію нічого не  розумію

1. Динамічні масиви char* або статичні char[].
2. Введення рядків з клавіатури.
3. Нехитра функція strlen() або strcmp() як умова порівняння.

Що з цього вам незрозуміло? :)

З.І: це розуміти так, що код - не ваш?..

6

Re: Рядки і сортування рядків

я нерозумію як  виконати  завдання

while((i<k)&&(gets(sl)))
  {strcpy(v_s[n],sl);
   if(sl[0]==toupper(sl[0]))
    {strcpy(m_s[i],sl);
       i++;
    }

що  робить ця  частина коду навіщо вона  що  це  за   строчка    в  код вставте  сорутвання

7

Re: Рядки і сортування рядків

А чим, власне, сортування рядків відрізняється від сортування будь яких інших даних? (напр числ)

8

Re: Рядки і сортування рядків

При сортуванні рядків необхідно використовувати лексикографічні порівняння, на відміну від порівняння більше-менше для int.
Для сортування використовуйте qsort() функцію.

9

Re: Рядки і сортування рядків

ADR написав:

А чим, власне, сортування рядків відрізняється від сортування будь яких інших даних? (напр числ)

char *str1="asd", *str2="asa";
cout<<(str1<str2)<<endl;

У даному разі буде порівняння покажчиків, але не рядків. Із тим же успіхом можна порівнювати масиви чисел.

keithfay написав:

Для сортування використовуйте qsort() функцію.

Прекрасна річ. Особливо перед початком вивчення STL. Хоча і відносно небезпечніша за STL-алгоритми.

10

Re: Рядки і сортування рядків

reywwe95 написав:

я нерозумію як  виконати  завдання

while((i<k)&&(gets(sl)))
  {strcpy(v_s[n],sl);
   if(sl[0]==toupper(sl[0]))
    {strcpy(m_s[i],sl);
       i++;
    }

що  робить ця  частина коду навіщо вона  що  це  за   строчка    в  код вставте  сорутвання

Підозрюю, що тут іде вичитування рядків з клавіатури та розміщення у буфері у програмі, а у випадку початку з великої літери - ще й до окремого буферу.

З.І: Старайтесь не допускати граматичних помилок, поважайте учасників форуму.

11

Re: Рядки і сортування рядків

спасибі     сам  хвилин десять   тому розібрав  код   але     не  можу     написати    соритровку хоч   вбий а  qsort() ніколи не   користувався сорутвали завжди бульбашками((((

12

Re: Рядки і сортування рядків

reywwe95 написав:

спасибі     сам  хвилин десять   тому розібрав  код   але     не  можу     написати    соритровку хоч   вбий а  qsort() ніколи не   користувався сорутвали завжди бульбашками((((

Бульбашка - найпростіший алгоритм, тому і популярний. :)

for(int iRow = 0; iRow < 100; iRow++)
{
    for(int j = 1; j < 100; j++)
    {
        if( strcmp(v_s[j-1], v_s[j]) > 0 )
        {
            //swap rows
        }
    }
}

Наче так було.

13

Re: Рядки і сортування рядків

А з qsort() мало би бути приблизно так:

int comp(const void* el1, const void* el2)
{
    return strcmp((char*)el1, (char*)el2);
}
qsort(v_s, 100, sizeof(char), comp);

З.І: а тут і випливе, чому функція "трохи небезпечна".

14

Re: Рядки і сортування рядків

keithfay написав:

При сортуванні рядків необхідно використовувати лексикографічні порівняння, на відміну від порівняння більше-менше для int.
Для сортування використовуйте qsort() функцію.

С++ не вміє порівнювати рядки? Ок. Тоді пишемо функу яка вміє, підставляємо її замість порівняння, а дальше алгоритм той самий.

15

Re: Рядки і сортування рядків

ADR написав:
keithfay написав:

При сортуванні рядків необхідно використовувати лексикографічні порівняння, на відміну від порівняння більше-менше для int.
Для сортування використовуйте qsort() функцію.

С++ не вміє порівнювати рядки? Ок. Тоді пишемо функу яка вміє, підставляємо її замість порівняння, а дальше алгоритм той самий.

Я говорив про string тип.

16

Re: Рядки і сортування рядків

ADR написав:

С++ не вміє порівнювати рядки? Ок. Тоді пишемо функу яка вміє, підставляємо її замість порівняння, а дальше алгоритм той самий.

Велосипед із прикладом вище - лише перестраховка для підстановки strcmp() до qsort() - можна і стандартними обійтися у більшості випадків. :)

keithfay написав:

Я говорив про string тип.

Вірно казали: зручний декоратор.

17

Re: Рядки і сортування рядків

#include <vcl.h>
   #include<iostream.h>
#include<string.h>
#include<ctype.h>
#define max 10
#define k 5
#include<conio.h>
;
int main()
{int i=0,n=0,p=0,q=0,m=0;
 char m_s[k][max];
 char v_s[100][max];
 char sl[max];
 char  r[10];

 while((i<k)&&(gets(sl)))
  {strcpy(v_s[n],sl);
   if(sl[0]==toupper(sl[0]))
    {strcpy(m_s[i],sl);
       i++;
    }
      else
      cout<<endl<<"line does not start with a capital letter!";
    n++;

  }
  cout<<endl<<"all input lines:";
 for(i=0;i<n;i++)
  {
  cout<<v_s[i]<<endl;
  }
   cout<<endl<<"correct lines:"<<endl;
 for(i=0;i<k;i++)
  {
  cout<<m_s[i]<<endl;
  }
  p=strlen(v_s[0]);
  for(i=0;i<n;i++)
   {q=strlen(v_s[i]);
    if(q>p)
    {p=q;}
   }
   cout<<endl<<"the longest row:";
   for(i=0;i<n;i++)
   {if(strlen(v_s[i])==p)
    cout<<endl<<v_s[i];
   }
     m:
   for(i=0;i<n-1;i++)
   {if(strcmp(v_s[i],v_s[i+1])>=0)
    {strcpy(r,v_s[i]);
     strcpy(v_s[i],v_s[i+1]);
     strcpy(v_s[i+1],r);
     goto m;
    }}
    
    cout<<endl<<endl<<"sorted lines:";
    for(i=0;i<n;i++)
    {cout<<endl<<v_s[i];
    }
  cout<<endl<<"enter";


  getch();
  return 0;
 

   повністю робоча   програма

18

Re: Рядки і сортування рядків

reywwe95 написав:
#include <vcl.h>
   #include<iostream.h>
#include<string.h>
#include<ctype.h>
#define max 10
#define k 5
#include<conio.h>
;
int main()
{int i=0,n=0,p=0,q=0,m=0;
 char m_s[k][max];
 char v_s[100][max];
 char sl[max];
 char  r[10];

 while((i<k)&&(gets(sl)))
  {strcpy(v_s[n],sl);
   if(sl[0]==toupper(sl[0]))
    {strcpy(m_s[i],sl);
       i++;
    }
      else
      cout<<endl<<"line does not start with a capital letter!";
    n++;

  }
  cout<<endl<<"all input lines:";
 for(i=0;i<n;i++)
  {
  cout<<v_s[i]<<endl;
  }
   cout<<endl<<"correct lines:"<<endl;
 for(i=0;i<k;i++)
  {
  cout<<m_s[i]<<endl;
  }
  p=strlen(v_s[0]);
  for(i=0;i<n;i++)
   {q=strlen(v_s[i]);
    if(q>p)
    {p=q;}
   }
   cout<<endl<<"the longest row:";
   for(i=0;i<n;i++)
   {if(strlen(v_s[i])==p)
    cout<<endl<<v_s[i];
   }
     m:
   for(i=0;i<n-1;i++)
   {if(strcmp(v_s[i],v_s[i+1])>=0)
    {strcpy(r,v_s[i]);
     strcpy(v_s[i],v_s[i+1]);
     strcpy(v_s[i+1],r);
     goto m;
    }}
    
    cout<<endl<<endl<<"sorted lines:";
    for(i=0;i<n;i++)
    {cout<<endl<<v_s[i];
    }
  cout<<endl<<"enter";


  getch();
  return 0;
 

   повністю робоча   програма

Робоча то робоча, та не радив би так писати. Зокрема, у зв'язку з химерним оператором goto.

З.І: А якщо хочете ефективно і швидко розбиратися з будь-якою мовою програмування - візьміть за правило вислів:

Martin Golding написав:

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.