Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
1

Указатели

29.10.2010, 16:50. Показов 1202. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Скопировать в новую строку два самых коротких слова исходной строки. Алгоритм просмотра исходной строки должен быть однопроходным. Решить задачу не используя библиотеку String(использовать указатели).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2010, 16:50
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; ...

19
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
29.10.2010, 21:01 2
Temirlan90, разбить строку на лексемы можно используя функцию strtok.
Вот здесь я приводил код, решающий похожую проблему, вам необходимо только организовать проверку длины с помощью strlen и сохранять слово, если оно меньше текущего минимального.
1
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
30.10.2010, 17:04  [ТС] 3
Temirlan90, разбить строку на лексемы можно используя функцию strtok.
Вот здесь я приводил код, решающий похожую проблему, вам необходимо только организовать проверку длины с помощью strlen и сохранять слово, если оно меньше текущего минимального.
MikeSoft, Я посмотрел ваш код, с длинной строки вроде как разобрался. А вот остальное не понял как делать.

Добавлено через 2 часа 19 минут
Я сделал но с библиотекой String, а как обойтись без неё?
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
#include <iostream.h>
#inlcude <string.h>
 
int main()
{
   char str[256];
   char buf*;
   int count = 0, min, max;
   
   cout << "Введите строку: ";
   cin.getline(str, 255);
   buf = strtok(str, " ");
   min = max = strlen(buf);
   while (buf)
   {
      if (min > strlen(buf))
         min = strlen(buf);
      if (max < strlen(buf))
         max = strlen(buf);
      count++;
      buf = strtok(NULL, " ");
   }
   cout << "В строке " << count << " слов." << endl;
   cout << "Самое длинное слово из " << max << " букв." << endl;
   cout << "Самое короткое - из " << min << " букв." << endl;
   system("pause");
   return 0;
}
Добавлено через 34 минуты
Для моего здания
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
#include <iostream.h>
#inlcude <string.h>
 
int main()
{
   char str[256];
   char buf*;
   int count = 0, min, max;
   
   cout << "Введите строку: ";
   cin.getline(str, 255);
   buf = strtok(str, " ");
   min = min1 = strlen(buf);
   while (buf)
   {
      if (min > strlen(buf))
         min = strlen(buf);
      if (min1 < min)
         min1 = strlen(buf);
      count++;
      buf = strtok(NULL, " ");
   }
   cout << "В строке " << count << " слов." << endl;
   cout << "Первое короткое слово: " << min1 << " букв." << endl;
   cout << "Второе короткое слово: " << min << " букв." << endl;
   system("pause");
   return 0;
}
без библиотеки не выходит.
1
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
30.10.2010, 17:18 4
Temirlan90, просто надо функции strtok и strlen написать самому и вставит их код вместо функций.
strtok для пробела
C
1
2
3
4
5
6
7
8
9
p = s;
while(*p==' ') p++;
if (*p=='\0') return NULL;
else {
   q = p;
   while(*q!=' ' && *q!='\0') q++;
   *q = '\0';
   return p;
}
strlen еще проще
C
1
2
 for(i=0, p=s; *p!='\0'; p++, i++) ;
 return i;
1
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
30.10.2010, 17:34  [ТС] 5
Day, Вы не могли бы выложить весь код?)
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
30.10.2010, 17:40 6
Temirlan90, самое простое, сделайте 2 функции, назвав их скажем, Tok и Len, и в своем тексте замените strtok - Tok, strlen - Len
1
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
30.10.2010, 17:56  [ТС] 7
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
#include <iostream.h>
 
int Len() {
    for(i=0, p=s; *p!='\0'; p++, i++) ;
    return i;
}
 
int Tok() {
     p = s;
          while(*p==' ') p++;
             if (*p=='\0') return NULL;
             else {
                  q = p;
         while(*q!=' ' && *q!='\0') q++;
         *q = '\0';
         return p;
}
}
 
int main()
{
   char str[256];
   char buf*;
   int count = 0, min, max;
   
   cout << "Введите строку: ";
   cin.getline(str, 255);
   buf = Tok(str, " ");
   min = min1 = Len(buf);
   while (buf)
   {
      if (min > Len(buf))
         min = Len(buf);
      if (min1 < min)
         min1 = Len(buf);
      count++;
      buf = Tok(NULL, " ");
   }
   cout << "В строке " << count << " слов." << endl;
   cout << "Первое короткое слово: " << min1 << " букв." << endl;
   cout << "Второе короткое слово: " << min << " букв." << endl;
   system("pause");
   return 0;
}
Он не компилируется...гад. Где ошибка?
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
30.10.2010, 18:20 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
int Len(char *s) {
 char *p; int i;
    for(i=0, p=s; *p!='\0'; p++, i++) ;
    return i;
}
 
char *Tok(char *s) {
  static char *pp = NULL;
  char *p, *q;
     if (s == NULL) p = pp;
     else              p = s;
     if (p==NULL) return NULL;
          while(*p==' ') p++;
             if (*p=='\0') {
              pp = NULL; 
              return NULL;
             }
             else {
                  q = p;
         while(*q!=' ' && *q!='\0') q++;
          if (*q== ' ') pp=q+1;
          else pp = NULL; 
         *q = '\0';
         return p;
}
}
В C и C++ положено переменные объявлять. Глупенький транслятор никак не может понять, что такое p, s, q, i.
На будущее - если чего не компилиться, приводи - что он говорит
Функцию Tok я немного изменил, с тем, чтобы повторные вызовы с аргументом NULL работали

Добавлено через 3 минуты
C
1
buf = Tok(str);
Tok имеет только 1 аргумент. Она менее универсальная чем strtok и уже заточена на разделитель-пробел
Чуть ниже исправь тоже.
1
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
30.10.2010, 19:02 9
Скопировать в новую строку два самых коротких слова исходной строки
тут не знаю как без strcpy() обойтись
что касается самого короткого и самого длинного слов вот что у меня получилось:

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
#include <iostream>
#include <ctype.h>
using namespace std;
 
int main()
{
    char str[255];
    char *p1,*p2;
    int len, min, max;
    
    cout << "Enter string \n";
    cin.getline(str,256);
    max = 0; min = 1;
p1 = p2 = str;
 
    while(str[p2-str]){
        p1 = p2;
    while(isalnum(p2[0]))
        ++p2;
    len = int(p2 - p1);
    if(min > len) min = len;
    if(max < len) max = len;
    
    for(int i = 0;i < len && !isalnum(p2[0]);i++){
if(p2[0] == '\0') break;
p2++;
    }   
    }
cout << "Max " << max << endl;
cout << "Min " << min << endl;
 
  std::system("pause");
  return 0;
}
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
30.10.2010, 20:40 10
Копировать можно и посимвольно, а получилась, извините, несуразица. ПРотестируйте:
пробел символ и посмотрите что получилось. И комменты неплохо посмотреть было бы.
0
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
30.10.2010, 21:14  [ТС] 11
Копировать можно и посимвольно, а получилась, извините, несуразица. ПРотестируйте:
пробел символ и посмотрите что получилось. И комменты неплохо посмотреть было бы.
kravam, к кому ваше сообщение?

А да кстати вот и мой код
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
#include <iostream.h>
 
int Len(char *s) {
 char *p; int i;
    for(i=0, p=s; *p!='\0'; p++, i++) ;
    return i;
}
 
char *Tok(char *s) {
  static char *pp = NULL;
  char *p, *q;
     if (s == NULL) p = pp;
     else              p = s;
     if (p==NULL) return NULL;
          while(*p==' ') p++;
             if (*p=='\0') {
              pp = NULL; 
              return NULL;
             }
             else {
                  q = p;
         while(*q!=' ' && *q!='\0') q++;
          if (*q== ' ') pp=q+1;
          else pp = NULL; 
         *q = '\0';
         return p;
}
}
 
int main()
{
   char str[256];
   char *buf;
   int count = 0, min, min1;
   
   cout << "Введите строку: ";
   cin.getline(str, 255);
   buf = Tok(str);
   min = min1 = Len(buf);
   while (buf)
   {
      if (min > Len(buf))
         min = Len(buf);
      if (min1 < min)
         min1 = Len(buf);
      count++;
      buf = Tok(NULL);
   }
   cout << "В строке " << count << " слов." << endl;
   cout << "Первое короткое слово: " << min1 << endl;
   cout << "Второе короткое слово: " << min << endl;
   system("pause");
   return 0;
}
0
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
30.10.2010, 21:27 12
к кому ваше сообщение?
Это в мой огород камушек

получилась, извините, несуразица. ПРотестируйте:
пробел символ и посмотрите что получилось. И комменты неплохо посмотреть было бы.
Немножко намудрил конечно, исправлено:

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
#include <iostream>
#include <ctype.h>
using namespace std;
 
int main()
{
        char str[255];
        char *p1,*p2;
        int len, min, max;
        
        cout << "Enter string \n";
        cin.getline(str,256);
        max = 0; min = 1;
p1 = p2 = str; // оба указателя указывают на начало строки str
 
        while(str[p2-str]){ // условие цикла - пока не кончится строка
                p1 = p2; 
                //----------------------------------
while(!isalnum(p2[0])) 
        {
if(p2[0] == '\0') break; // это на случай если строка начинается с пробела
p2++;
}
//----------------------------------------------------
        while(isalnum(p2[0])) // переводим p2 на конец слова
                ++p2;
        len = int(p2 - p1); // измеряем его длину(слова)
        if(min > len) min = len;
        if(max < len) max = len;
        
        while(!isalnum(p2[0])) // переводим p2  в начало следующего слова
        {
if(p2[0] == '\0') break; // если конец строки то break
p2++;
        } // при переходе в начало цикла p1 тоже переводится в начало следующего слова
        }
cout << "Max " << max << endl;
cout << "Min " << min << endl;
 
  std::system("pause");
  return 0;
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
30.10.2010, 21:34 13
Дело твоё, конечно, но тестировать всё-таки надо:
"символ пробел два_символа пробел три_символа"
Это Temirlan90у

Добавлено через 4 минуты
NikolaWhite,тестируем так:
"три_пробела символ пробел два_символа пробел три_символа "
0
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
30.10.2010, 21:44  [ТС] 14
Дело твоё, конечно, но тестировать всё-таки надо:
"символ пробел два_символа пробел три_символа"
Это Temirlan90у
хорошо
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
31.10.2010, 11:02 15
NikolaWhite,
тут не знаю как без strcpy() обойтись
C
1
2
3
4
Cpy(char *s, char *t)
{
 while(*t!='\0') *(s++) = *(t++);
}
2
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
31.10.2010, 11:26  [ТС] 16
C++
1
2
3
4
5
 
Cpy(char *s, char *t)
{
 while(*t!='\0') *(s++) = *(t++);
}
а как эту функцию задействовать в данном коде?
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
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
int Len(char *s) {
 char *p; int i;
    for(i=0, p=s; *p!='\0'; p++, i++) ;
    return i;
}
 
char *Tok(char *s) {
  static char *pp = NULL;
  char *p, *q;
     if (s == NULL) p = pp;
     else              p = s;
     if (p==NULL) return NULL;
          while(*p==' ') p++;
             if (*p=='\0') {
              pp = NULL; 
              return NULL;
             }
             else {
                  q = p;
         while(*q!=' ' && *q!='\0') q++;
          if (*q== ' ') pp=q+1;
          else pp = NULL; 
         *q = '\0';
         return p;
}
}
 
int main()
{
   char str[256];
   char *buf;
   int count = 0, min, max;
   
   std::cout << "Enter string: ";
   std::cin.getline(str, 255);
   buf = Tok(str);
   min = max = Len(buf);
   while (buf)
   {
      if (min > Len(buf))
         min = Len(buf);
      if (max < Len(buf))
         max = Len(buf);
      count++;
      buf = Tok(NULL);
   }
   std::cout << "In string " << count << " words." << std::endl;
   std::cout << "Must longest " << max << " word." << std::endl;
   std::cout << "Must short " << min << " word." << std::endl;
   system("pause");
   return 0;
}
1
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
31.10.2010, 11:42 17
Temirlan90, в вашем коде она не нужна, т.к. не используется функция strcpy
Это просто ответ NikolaWhite и демонстрация того насколько просты функции библиотеки string.
А попытаться их сделать и понять самостоятельно, ИМХО, полезное упражнение для начинающего.
0
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
31.10.2010, 17:45  [ТС] 18
Как сделать что бы не только количество символов самого короткого и самого длинного слова выводилось, но и самое короткое и самое длинное само слово?
0
3 / 3 / 0
Регистрация: 04.11.2010
Сообщений: 38
04.11.2010, 16:21 19
На форуме есть похожая тема.
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
04.11.2010, 22:05 20
Temirlan90, при выделения слова делать проверку на минимальный/максимальный элемент и копировать во временную переменную указатель или непосредственно содержимое.

Если не знаете, как это сделать - тогда советую незамедлительно почитать какую-то литературу. Без этого дальше будет очень сложно.
0
04.11.2010, 22:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2010, 22:05
Помогаю со студенческими работами здесь

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F...

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru