Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 17:22   #1
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
Вопрос Упорядочивание слов в строке

Помогите пожалуйста вот с такой задачей:
Функция находит в строке самое длинное слово и возвращает указатель на него. С её помощью реализовать размещение слов в выходной строке в порядке убывания их длины.
Написал функцию находящую самое длинное слово, не могу понять где ошибки!
Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void Enter_strlen(char a[])
{
 clrscr();
 printf("Введите строку\n");
 gets(a);
 printf("%s\n",a);
 getch();
}
int Max_dlin_slova(char a[])
{
 int *temp,*max_word;
 char *pa,*end;
 *max_word=0;
 for(pa=a; *pa!="\0"; pa++)
 {
	for(end=pa; *end!=" "; end++);
	*temp=end-pa;
	pa+=end-1;
	if(*max_word<*temp) {*max_word=*temp;}
  }
 	return(max_word);
}

void main()
{
char a[1000];
Enter_strlen(a);
printf("%d",Max_dlin_slova);
}
Nitrino вне форума Ответить с цитированием
Старый 06.05.2009, 17:37   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Как вам такой вариант?
Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

void Enter_strlen(char a[])
{
 printf("Введите строку\n");
 gets(a);
 printf("%s\n",a);
}

char* Max_dlin_slova(char a[],int &max)
{
int l;
char *p,*t;
max = 0;
p = strtok(a," ,.:\n");
if(p) max = strlen(p);
while(p=strtok(NULL," ,.:\n"))
 {
  l = strlen(p);
  if(l>max)
   {
    max = l;
    t = p;
   }
 }
return t;
}


int main()
{
char a[1000],*c;
int len;
Enter_strlen(a);
c = Max_dlin_slova(a,len);
printf("Slovo: %s\nDlina slova: %d\n",c,len);

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.05.2009, 17:38   #3
MAKEDON
The First Person!
Форумчанин
 
Аватар для MAKEDON
 
Регистрация: 07.08.2007
Сообщений: 228
По умолчанию

Так..ну у вас тут есть логические ошибки. Например, тут.

Код:
printf("%d",Max_dlin_slova(...));
Вместо точек, то значение, которое надо передать функции.

И вопрос. Тут просто реализована функция нахождения самого длинного слова?
Программа обычно делает то что вы ей сказали сделать, а не то что бы вы хотели, чтобы она сделала.
MAKEDON вне форума Ответить с цитированием
Старый 06.05.2009, 18:53   #4
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

MAKEDON
Да тут только нахождение.
Sazary
Спасибо как раз то что нужно.
Подскажите как реализовать её дальше?
То не могу понять как копировать или перенести часть строки

Последний раз редактировалось Nitrino; 06.05.2009 в 19:05.
Nitrino вне форума Ответить с цитированием
Старый 06.05.2009, 19:07   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Подскажите как реализовать её дальше?
По-моему, лучше просто загнать слова в массив сначала. И еще один массив из длин этих слов.
Тогда и сортировать легче будет.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.05.2009, 19:15   #6
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Sazary
Если не трудно подскажите как это реализовать?
Мы же вводим слова в одну строку, как перенести слова в массив?
Я понимаю что нужно сделать цикл перечитывающий строку до пробела, и то что до пробела перенести в первый элемент массива и параллельно подсчитать длину этого слова и занести в другой массив, но я незнаю как реализовать перенос слова из строки в массив
Nitrino вне форума Ответить с цитированием
Старый 06.05.2009, 19:19   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Мы же вводим слова в одну строку, как перенести слова в массив?
С помощью strtok.
Получаете слово - пишете в массив. И так, пока strtok не вернет NULL.
Поищите по форуму по названию этой функции.

Вот парочка тем:
http://programmersforum.ru/showthread.php?t=46659
http://programmersforum.ru/showthread.php?t=48285
http://programmersforum.ru/showthread.php?t=45257
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.05.2009, 16:04   #8
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
Вопрос

Вот попробовал дописать программу, подскажите пожалуйста какую дописать функцию (на место знаков вопроса) для того что бы после занесения слова в другую строку удалить или заменить пробелами это слово в старой? может для этого есть какая стандартная функция? Или может у меня тут есть ещё какие то недоработы или что то я делаю неправильно? объясните пожалуйста
Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

void Enter_strlen(char a[])
{
 printf("Введите строку\n");
 gets(a);
 printf("%s\n",a);
}

char* Max_dlin_slova(char a[],int &max)
{
int l;
char *p,*t;
max = 0;
p = strtok(a," ,.:\n");
if(p) max = strlen(p);
while(p=strtok(NULL," ,.:\n"))
 {
  l = strlen(p);
  if(l>max)
	{
	 max = l;
	 t = p;
	}
 }
return t;
}

void New_strlen(char a[] char b[])
{
int *pb=0;
while(b[pb]!='\0')
 {
  c=Max_dlin_slova(a,len);
  if(c='0') b[pb]='\0'
  b[pb]=c;
  b[pb++]=' ';
  pb+=2;
//???????????????????????????????????????????????????
 }
}

int main()
{
char a[1000],b[1000],*c;
int len, *pb;
Enter_strlen(a);
New_strlen(a,b);
printf("Slovo: %s\nDlina slova: %d\n",c,len);
for(pb=0; b[pb]!='\0'; pb++)
	print("\n%c",b[pb]);
getch();
return 0;
}
Nitrino вне форума Ответить с цитированием
Старый 11.05.2009, 16:23   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот, в общем. Через массив.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>


void strToMas(char *str, char mas[][100], int& N)
{
 N = 0;
 char *p;
 p = strtok(str," ,.:\n");
 if(p) strcpy(mas[N++],p);
 while(p = strtok(NULL," ,.:\n")) strcpy(mas[N++],p);
}
//------------
void sortMas(char mas[][100], int N)
{
 int i,j,k;
 char tmp[100];
 for(i=0; i<N-1; i++)
  {
   for(k=i,j=i+1; j<N; j++)
    if(strlen(mas[j])<strlen(mas[k])) k = j;
   strcpy(tmp,mas[k]);
   strcpy(mas[k],mas[i]);
   strcpy(mas[i],tmp);
  }
}

int main(){
char str[1000];
char mas[100][100]; // массив слов
int N,i,j;

gets(str);
printf("\n");
strToMas(str, mas, N);
sortMas(mas,N);
for(i=0; i<N; i++)
 printf("%s\n",mas[i]);

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.05.2009, 16:40   #10
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

скажи а почему используется именно главная функция int main() нас учили что может быть только void main(), говарили что она ничего не возвращает. в чём различие?
Спасибо большое, не подскажете какую-нибудь хорошую книжку по программированию , знаю в нете их много, но многие не понятные

Последний раз редактировалось Nitrino; 11.05.2009 в 16:45.
Nitrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В заданной строке символов заменить все первые буквы слов на заглавные NV-salt Общие вопросы C/C++ 4 05.04.2009 18:41
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19
Поиск слов в строке Neymexa Общие вопросы C/C++ 3 16.12.2008 18:33
Разделение 2-х слов в строке 856100 Общие вопросы Delphi 9 06.10.2008 20:41