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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 13:28   #1
СергейАС
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 14
По умолчанию Строки в си

Подскажите, как подсчитать количество слов в строке без использования строковых подпрограмм? И как определить является ли текст перевёртышем без учёта пробелов и различия строчных и просписных букв???
СергейАС вне форума Ответить с цитированием
Старый 20.02.2012, 14:18   #2
Blondes
 
Регистрация: 20.02.2012
Сообщений: 8
По умолчанию

Число слов в строке в простейшем случае, если между словами не более 1 пробела:
Количество слов = Количество пробелов + 1
Иначе посложнее, можно удалить лишние пробелы и оставить по одному между словами.

Насчет перевертыша я бы попробовала так:
1) Исходную строку очистила бы от лишних пробелов и перевела все символы в нижний регистра
2) Строку-перевертыш тоже от пробелов и нижний регистра
3) Строку-перевертыш копирую посимвольно в временную строку, начиная с последней до первой буквы
4) сравниваю исходную строку с этой временной строкой, например, с помощью strcmp

Это примерный алгоритм, по ходу можно доработать

Последний раз редактировалось Blondes; 20.02.2012 в 14:21.
Blondes вне форума Ответить с цитированием
Старый 20.02.2012, 14:39   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
3) Строку-перевертыш копирую посимвольно в временную строку, начиная с последней до первой буквы
4) сравниваю исходную строку с этой временной строкой, например, с помощью strcmp
это можно сделать в одном цикле - сравнивать текущий и (длина строки - текущий + 1) символы в строке. Если не совпадут - значит не перевёртыш. И цикл будет лишь до середины строки. И так будет правильнее, поскольку в задании:
Цитата:
без использования строковых подпрограмм
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 20.02.2012, 14:49   #4
СергейАС
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 14
По умолчанию

Я всё это понимаю,но я не могу додуматься как примерно записать это в виде кода?
СергейАС вне форума Ответить с цитированием
Старый 20.02.2012, 15:50   #5
Jaguar83
Профессионал
Пользователь
 
Аватар для Jaguar83
 
Регистрация: 25.05.2011
Сообщений: 91
По умолчанию

Если ты это всё понимаешь, стало быть у тебя есть какие-то попытки написать код.
Выкладывай его сюда, посмотрим.
Помог? Будь человеком - жми на весы слева!
Jaguar83 вне форума Ответить с цитированием
Старый 20.02.2012, 16:03   #6
СергейАС
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 14
По умолчанию

Код:
#include<stdio.h>
#define M 100
int main()
{
	int i,kol=0;
	char s[M];
	printf("Vvedite stroku:\n");
	scanf("%s",&s[M]);
	for(i=0;i<M;i++)
	{
		if(s[i]==' '||s[i]=='\n'||s[i]=='\t') 
			kol++;
	}
		printf("%d",kol+1);
Это фрагмент для определения числа слов

Последний раз редактировалось ACE Valery; 20.02.2012 в 18:07.
СергейАС вне форума Ответить с цитированием
Старый 20.02.2012, 16:27   #7
Blondes
 
Регистрация: 20.02.2012
Сообщений: 8
По умолчанию

для строки-перевертыша можно как-то так

Код:
 

int main()
{
	char str[256], str_reverse[256];
	int i, m = 0;
	char is_duplicate = 0;
	

	//input strings
	gets(str);
	gets(str_reverse);

	//нижний регистр
	i = 0;
	while(str[i] != '\0'){
		if( (str[i] >= 'A') && (str[i] <= 'Z') )
			str[i] += 32;
		i++;
	}

	i = 0;
	while(str_reverse[i] != '\0'){
		if( (str_reverse[i] >= 'A') && (str_reverse[i] <= 'Z') )
			str_reverse[i] += 32;
		i++;
	}

	//length string-reverse
	m = 0;
	while(str_reverse[m] != '\0') m++;

	i = 0;
	m--;
	while(str[i] != '\0'){
		if( str[i++]== str_reverse[m--]) 
			is_duplicate = 1;
		else{
			is_duplicate = 0;
			break;
		}
	}

	if (is_duplicate)
		printf("Strings is identically\n");
	else 
		printf("Strings not is identically\n");

	return 0;
}
но здесь считается, что между словами не более одного пробела и нет знаков препинания
Blondes вне форума Ответить с цитированием
Старый 20.02.2012, 17:00   #8
СергейАС
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 14
По умолчанию

Ну с перевёртышем я разобрался,а вот с количеством слов нет. Подскажите пожалуйста. Очень надо
СергейАС вне форума Ответить с цитированием
Старый 20.02.2012, 17:25   #9
Blondes
 
Регистрация: 20.02.2012
Сообщений: 8
По умолчанию

вы нормально вроде написали количество слов. только я бы написала условия цикла другие


Код:
for(i=0; s[i] != '\0'; i++)
{
if(s[i]==' '||s[i]=='\n'||s[i]=='\t')
kol++;
}

kol++;//чтобы последнее слово засчитать
то есть проверять не весь массив символов, а только до конца строки, т.к. после конца мусор, если не весь массив заполнили символами
возможно убрать проверку '\n' из условия.

Последний раз редактировалось ACE Valery; 20.02.2012 в 18:07.
Blondes вне форума Ответить с цитированием
Старый 20.02.2012, 17:37   #10
СергейАС
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 14
По умолчанию

Но всё равно получается неправильный ответ, всё время 1 пишет
СергейАС вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10