Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
1

Упорядочить слова в поле методом минимумов-максимумов

11.05.2012, 19:18. Показов 3987. Ответов 21
Метки нет (Все метки)

В общем получил задачу :"Есть структура, одно поле которой -предложение со словами длиной 6-16 символов. Каждое слово заканчивается пробелом , запятой или точкой.Упорядочить слова в поле методом минимумов-максимумов."

Насколько я понял задание мне нужно в символьном массиве организовать перестановки слов .
Если есть у кого-то какие-то советы или наработки буду БЛАГОДАРЕН.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2012, 19:18
Ответы с готовыми решениями:

Упорядочить последовательность по неубыванию методом поиска минимумов
Дана последовательность из n xbcyk (n<100). Упорядочить ее по не убыванию следующим методом :...

Упорядочить последовательность по неубыванию методом поиска минимумов
Дана последовательность из n-чисел (n<100). Упорядочить ее по не убыванию следующим методом : найти...

Упорядочить массив А в порядке возрастания элементов методом нахождения последовательных минимумов
(Пожалуйста помогите, очень срочно) Добавлено через 56 секунд Упорядочить массив А в порядке...

Упорядочить элементы строк матрицы по убыванию методом поиска последовательных минимумов (MFC)
Создать в Visual C++ 2013 однодокументное приложение для решения задачи. Дана матрица B, где...

21
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
12.05.2012, 11:11 2
Цитата Сообщение от Юриг Посмотреть сообщение
Насколько я понял задание мне нужно в символьном массиве организовать перестановки
Сортировать массив слов нужно в алфавитном порядке или по длине слова?
0
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 11:24  [ТС] 3
по алфавиту
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
12.05.2012, 11:59 4
Юриг, strtok делите на слова, и загоняете их в отдельный массив слов.
Потом сортируете его.
Затем из него формируете строку.
0
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
12.05.2012, 12:03 5
Ждите я скоро вышлю вам исходник на С++
0
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 12:24  [ТС] 6
Цитата Сообщение от go Посмотреть сообщение
Юриг, strtok делите на слова, и загоняете их в отдельный массив слов.
Потом сортируете его.
Затем из него формируете строку.
Спасибо идея хорошая
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
12.05.2012, 12:39 7
Цитата Сообщение от Юриг Посмотреть сообщение
Спасибо идея хорошая
Пожалуйста!
Только это почти единственно верный способ. Так что если будут проблемы, пишите.
0
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 13:01  [ТС] 8
как можно в структуре объявить динамический символьный массив , если данные считываются из файла
Хотел попробовать сначала считать данные в отдельный массив , после с помощью strlen вычислить нужный размер, но при первом пробеле строка считается законченной.

C
1
2
3
4
5
6
FILE *fid;
int  n=0;
char str[100]={0};
fscanf(fid,"%s",str,100);
   n=strlen(str);
   printf("n=%d",n);
Появилась мысль использовать цикл и записывать в двумерный массив слова, но чувствую запятые и точки войдут в одно "слово".
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
12.05.2012, 13:05 9
Цитата Сообщение от Юриг Посмотреть сообщение
fscanf(fid,"%s",str,100);
Используйте fgets.
0
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 15:42  [ТС] 10
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
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 struct st
{char *arr;
 int n;
} st,*pst;
 
int main()
{ SetConsoleOutputCP(1251);
 int  k;
 FILE *fid;
 char filename[256];
 char str[100]={0};
 char *pstr=&str[0];
 pst=&st;
 printf("\n Укажите путь к имени входного файла: ");
       scanf("%s", filename);
       if((fid=fopen(filename, "rt"))==NULL)
            {printf("\n\tНе відчиняється файл! Перевірте його наявність!");
            printf("\n Натисніть будь-яку клавішу ");
            _getch(); return 0;
             }   
   fgets(pstr,99,fid);
 
 
   pst->arr=(char*)malloc(strlen(pstr));
   if(!pst->arr){printf("\nНевозможно выделить память!");
                 exit(1);}
 
pst->arr=pstr;
printf("\n%s",pst->arr);
getch();
free(pst->arr);
    return 0;
}
При выполнении программы а именно(если смотреть пошагово выполнение) на строке "free(pst->arr);" выдаёт ошибку:
"ОС Windows инициировала точку останова в kurs4.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в kurs4.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит kurs4.exe"
Кто подскажет что это может быть?
0
669 / 197 / 29
Регистрация: 10.05.2012
Сообщений: 595
12.05.2012, 15:58 11
Цитата Сообщение от Юриг Посмотреть сообщение
В общем получил задачу :"Есть структура, одно поле которой -предложение со словами длиной 6-16 символов. Каждое слово заканчивается пробелом , запятой или точкой.Упорядочить слова в поле методом минимумов-максимумов."

Насколько я понял задание мне нужно в символьном массиве организовать перестановки слов .
Если есть у кого-то какие-то советы или наработки буду БЛАГОДАРЕН.
1)Неправильно вы поняли =) , вам нужно в строчном массиве перестановки организовать =)
2) сейчас напишу примитивный код (+ короткий)
3) В случае, если вы поняли правильно, то тому, кто дал вам задание нужно сказать, что массив слов - это тоже предложение

Добавлено через 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
#include <iostream>
#include <string>
#include <set>
#include <fstream>
#include <algorithm>
#include <utility>
#include <stdio.h>
#include <conio.h>
using namespace std;
struct strc{
    set <string> mas; 
};
int main(){
    strc temp;
    string stemp;
    ifstream in("input.txt");//открываете файл
    while (in>>stemp){ //вот тут небольшой камень: вы считываете из файла все слова (а не то что распологается на 1-й линии)
        if (stemp[stemp.length()]!=' ') stemp.erase(stemp.length()-1);// если закончилось не на пробел, то удалить последний элемент
        temp.mas.insert(stemp); //зафигачиил строку в set в структуре strc 
    };
    //теперь в temp хранится отсортированный массив (лексикографически) строк
    return 0;
};
0
Эксперт С++
5026 / 2605 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.05.2012, 16:01 12
Ternsip, мы здесь пишем на Си
0
669 / 197 / 29
Регистрация: 10.05.2012
Сообщений: 595
12.05.2012, 16:09 13
Виноват...А разве в С нету контейнеров?
0
Эксперт С++
5026 / 2605 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.05.2012, 19:36 14
Ternsip, в Си нет классов.
0
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
12.05.2012, 19:53 15
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
#include <string.h>
 
void swaps(char* psz1, char* psz2);
bool iseqkey(char* psz1, char* psz2, int pos);
 
typedef struct Words
{
    char m_szLine[256];
} WORDS;
 
int main()
{
    WORDS words;
    memset((void*)&words, 0x00, sizeof(WORDS));
 
    const char* line = "apricot, apple, strawbery, bagage, back, cranbery, count, cat, dog, dig.";
    strcpy(words.m_szLine, line);
 
    char* word = strtok(words.m_szLine, " ");
    int r = 0; char** ppsz = new char*[256];
    while ((word != NULL) && (r < 256))
    {
        ppsz[r] = new char[16];
        strcpy(ppsz[r++], word); 
        word = strtok(NULL ," ");
    }
 
    for (int q = 0; q < 16; q++)
        for (int i = 0; i < r; i++)
            for (int k = i+1; k < r; k++)
                if (ppsz[k][q] < ppsz[i][q])
                {
                    if (!iseqkey(ppsz[i],ppsz[k],q) && q > 0) 
                        continue;
                
                    swaps((char*)ppsz[k],(char*)ppsz[i]);
                }
 
    for (int n = 0; n < r; n++)
        printf("%s\n",ppsz[n]);
 
    printf("\n");
    
    return 0;
}
 
bool iseqkey(char* psz1, char* psz2, int pos)
{
    for (int i = pos-1; i >= 0; i--)
        if (psz1[i] != psz2[i])
            return false;
 
    return true;
}
 
void swaps(char* psz1, char* psz2)
{
    static char* psztemp = new char[256];
    strcpy(psztemp, psz1);
    strcpy(psz1, psz2); 
    strcpy(psz2, psztemp);
}
http://liveworkspace.org/code/... e5f6bcf1e2
1
Эксперт С++
5026 / 2605 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.05.2012, 20:12 16
zitxbit, это к сожалению тоже С++, но уже ближе к истине:
  1. В Си нет типа bool. Вернее в C99 он есть, но называется _Bool. Если подключить заголовочный файл stdbool.h, то можно будет использовать привычные для C++ bool, true, false.
  2. В Си нет new. В Си используются несколько другие способы выделения памяти в куче, а именно malloc/calloc/realloc.
  3. Объявление переменной не в начале блока возможно опять же только в C99, я имею в виду вот эти моменты:
    C
    1
    
    for (int q = 0 ...)

Теперь о другом:
  1. Использовать memset для инициализация массивов или структур черевато незамеченными ошибками. Даже, если Вы очень крутой программист. Все мы люди. Лаконичнее и красивее использовать такую конструкцию:
    C
    1
    2
    3
    4
    5
    6
    7
    8
    
    typedef struct Words
    {
        char m_szLine[256];
    } WORDS;
     
    int main()
    {
        WORDS words = { { 0 } };
  2. Таки выделенную память надо освобождать.

Если Вы даете ссылку на lws, то для проверки можно выбрать язык C, а не C++.
0
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 20:21  [ТС] 17
Цитата Сообщение от zitxbit Посмотреть сообщение
memset((void*)&words, 0x00, sizeof(WORDS));
Тут вы очищаете поля структуры?

Цитата Сообщение от zitxbit Посмотреть сообщение
char* word = strtok(words.m_szLine, " ");
находим указатель на конец первого слова

Цитата Сообщение от zitxbit Посмотреть сообщение
int r = 0; char** ppsz = new char*[256]; while ((word != NULL) && (r < 256)) { ppsz[r] = new char[16]; strcpy(ppsz[r++], word); word = strtok(NULL ," "); }
Пока не дойдём до конца каждое слово разделенное пробелом будем заносить в двумерную матрицу

и далее идут циклы перестановки и сравнивания слов .
Я верно понял ваш код?
0
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
12.05.2012, 20:30 18
Да, конечно.
1
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 20
12.05.2012, 20:37  [ТС] 19
Но вы разделяете слова пробелом .
А чтоб разделять еще с запятой и точкой необходимо записать:
C
1
strtok(words.m_szLine, " "","".");
?
0
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
13.05.2012, 14:25 20
C++
1
strtok(words.m_szLine, " ,.");
Добавлено через 1 час 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
#include <stdio.h>
#include <string.h>
 
void swaps(char* psz1, char* psz2);
bool iseqkey(char* psz1, char* psz2, int pos);
 
typedef struct Words
{
   char m_szLine[256];
} WORDS;
 
int main()
{
   WORDS words;
   memset((void*)&words, 0x00, sizeof(WORDS));
 
   const char* line = "apricot, apple, strawbery, bagage, back, cranbery, count, cat, dog, dig.";
   strcpy(words.m_szLine, line);
 
   char* word = strtok(words.m_szLine, " ");
   int r = 0; char** ppsz = new char*[256];
   while ((word != NULL) && (r < 256))
   {
      ppsz[r] = new char[16];
      strcpy(ppsz[r++], word); 
      word = strtok(NULL ," ");
   }
 
   for (int q = 0; q < 16; q++)
      for (int k = 0; k < r; k++)
      {
         int min = k; 
         for (int i = k+1; i < r; i++)
            if ((ppsz[i][q] < ppsz[min][q]) && 
               (iseqkey(ppsz[i], ppsz[k], q))) min = i;
          swaps(ppsz[k],ppsz[min]);
      }
 
    for (int n = 0; n < r; n++)
      printf("%s\n",ppsz[n]);
 
   printf("\n");
   
   return 0;
}
 
bool iseqkey(char* psz1, char* psz2, int pos)
{
   for (int i = pos-1; i >= 0; i--)
      if (psz1[i] != psz2[i])
         return false;
 
   return true;
}
 
void swaps(char* psz1, char* psz2)
{
   static char* psztemp = new char[256];
   strcpy(psztemp, psz1);
   strcpy(psz1, psz2); 
   strcpy(psz2, psztemp);
}
http://liveworkspace.org/code/... 73b50ba440

Добавлено через 15 часов 51 минуту
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
#include <stdio.h>
#include <string.h>
 
void swaps(char* psz1, char* psz2);
bool iseqkey(char* psz1, char* psz2, int pos);
 
typedef struct Words
{
   char m_szLine[256];
} WORDS;
 
int main()
{
   WORDS words;
   memset((void*)&words, 0x00, sizeof(WORDS));
 
   const char* line = "apricot, apple, strawbery, bagage, back, cranbery, count, cat, dog, dig.";
   strcpy(words.m_szLine, line);
 
   char* word = strtok(words.m_szLine, " ");
   int r = 0; char** ppsz = new char*[256];
   while ((word != NULL) && (r < 256))
   {
      ppsz[r] = new char[16];
      strcpy(ppsz[r++], word); 
      word = strtok(NULL ," ");
   }
 
   for (int q = 0; q < 16; q++)
   {
       for (int t = 0; t < r; t++)
       {
            int min = t, max = r-t-1;
            for (int i = t; i < r-t; i++)
            {
                min = ((ppsz[i][q] < ppsz[min][q]) && 
                    iseqkey(ppsz[i], ppsz[min], q)) ? i : min;
                max = (ppsz[i][q] > ppsz[max][q]) && 
                    iseqkey(ppsz[i], ppsz[max], q) ? i : max;
            }
 
            if (max == t && min == r-t-1)
                swaps(ppsz[min],ppsz[max]);
 
            if (max == t)
            {
                swaps(ppsz[r-t-1],ppsz[max]);
                swaps(ppsz[t],ppsz[min]);
            }
 
            else
            {
                swaps(ppsz[t],ppsz[min]);
                swaps(ppsz[r-t-1],ppsz[max]);
            }
       }
   }
 
   for (int n = 0; n < r; n++)
      printf("%s\n",ppsz[n]);
 
   printf("\n");
   
   return 0;
}
 
bool iseqkey(char* psz1, char* psz2, int pos)
{
   for (int i = pos-1; i >= 0; i--)
      if (psz1[i] != psz2[i])
         return false;
 
   return true;
}
 
void swaps(char* psz1, char* psz2)
{
   static char* psztemp = new char[256];
   strcpy(psztemp, psz1);
   strcpy(psz1, psz2); 
   strcpy(psz2, psztemp);
}
http://liveworkspace.org/code/... b5939b9611
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2012, 14:25

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Сумма минимумов и максимумов
В произвольно-заданной матрице D (10x10) сумму максимального и минимального элементов каждой строки...

Разность максимумов и минимумов
1. Даны натуральные n, m и последовательности вещественных чисел х1, х2, …, хn, y1, y2, …, ym....

Нахождение максимумов и минимумов на графике
Доброго времени суток. Имеются 2 кривых, координаты которых записаны в массивы. Необходим...

Нахождение максимумов и минимумов в диапазоне
Добрый вечер. Подскажите пожалуйста как вывести в ячейки максимум и минимум в выделенном диапазоне...


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

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

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