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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2009, 16:44   #11
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Спасибо большое, не подскажете какую-нибудь хорошую книжку по программированию , знаю в нете их много, но многие не понятные
Сложно сказать.. Я не учился по какой-то конкретной.
Почитайте Шилдта, например. А вообще, накачайте побольше из темы с литературой (см. подпись) и читайте то, что покажется понятней.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Понёс сдавать преподаватель сказал сделать это всё без использования переменных, только что бы были одни указатели
подскажите почему не работает вот так
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>


void strToMas(char *str, char *masstr, int& N)
{
 N = 0;
 char *p;
 p = strtok(str," ,.:\n");
 if(p) strcpy(*masstr[N++],p);
 while(p = strtok(NULL," ,.:\n")) strcpy(*masstr[N++],p);
}
//------------
void sortMas(char *masstr, 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(*masstr[j])<strlen(*masstr[k])) k = j;
	strcpy(tmp,*masstr[k]);
	strcpy(*masstr[k],*masstr[i]);
	strcpy(*masstr[i],tmp);
  }
}

int main(){
char str[1000];
char mas[100][100], (*masstr)[100];
int N,i,j;
clrscr();
masstr=mas;
printf("Введите строку:\n");
gets(str);
printf("\n");
strToMas(str, *masstr, N);
sortMas(*masstr,N);
printf("Упорядоченная строка:\n");
for(i=0; i<N; i++)
 printf("%s ",mas[i]);

getch();
return 0;
}
В чём ошибка моего указателя
Nitrino вне форума Ответить с цитированием
Старый 18.05.2009, 21:04   #13
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
void sortMas(char *masstr, int N)
Принимаете в функции массив символов. А надо слов.
Дальше не смотрел. Скажите, что значит одни указатели?

В вашей программе по-прежнему полно переменных.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Это я начал делать и возникла неразбериха, а так всюду должны использоваться только указатели на переменные
Nitrino вне форума Ответить с цитированием
Старый 18.05.2009, 21:14   #15
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

а разве после функции strToMas в масиве mas не будут находится слова?
Извините за примитивные вопросы, просто литературы по указателям прочитал много, как работать с ними понял, а как передавать их в функцию не могу понять
Nitrino вне форума Ответить с цитированием
Старый 18.05.2009, 21:21   #16
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;
}
Цитата:
а разве после функции strToMas в масиве mas не будут находится слова?
Да. Но Вы принимаете в функции массив символов, а не слов.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

смотрите в функцию передаётся же сам масив mas
Код:
void strToMas(char *str, char mas[][100], int& N)
я хотел избавится от этого, так что бы в функцию передавался указатель на этот масив, возможно ли это?
и ещё вопрос почему есля я заменяю счётчики на указатели
компилятор выдаёт ошибку, разве так нелья?
Код:
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);
  }
}
Nitrino вне форума Ответить с цитированием
Старый 18.05.2009, 21:45   #18
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

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

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.05.2009, 22:09   #20
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Функция находит в строке самое длинное слово и возвращает указатель на него.
Здесь просто слово..
Вот так можно сделать на С++. (если кому интересно)
Код:
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <iostream>
#include <iterator>

/*

Найти самое длинное слово.

*/

template <
typename T,
template <typename> class P
>
struct find : public std::binary_function<T, T, bool>
{
	bool operator() (const T& v1, const T& v2) const
	{
		return p_(v1.size(), v2.size());
	}
	P<typename T::size_type> p_;
};


template <
typename _E, typename _Tr, typename _Ax,
template <typename, typename, typename> class _S
>
_S<_E, _Tr, _Ax> max_word(const _S<_E, _Tr, _Ax>& s)
{
	typedef _S<_E, _Tr, _Ax> string_type;
	typedef std::vector<string_type> V;
	V v;
	{
		std::basic_istringstream<_E, _Tr, _Ax> ss(s);
		std::copy(
			std::istream_iterator<string_type, _E>(ss),
			std::istream_iterator<string_type, _E>(), std::back_inserter(v));
	}

	return *std::max_element(v.begin(), v.end(), find<string_type, std::less>());//max
	//return *std::max_element(v.begin(), v.end(), find<string_type, std::greater>());//min

	
}

int main()
{
	std::string s;

	getline(std::cin,s);

	std::string max_ = max_word(s);
	std::cout << s << std::endl;
	std::cout << max_ << std::endl;

	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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