Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программа на строчки 
:(
    Опции темы
qaswed
Дата 11.12.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Привет. помогите написать прогу, я новичок и не совсем догоняю пока. суть программы в следующем: Дан произвольный текст. Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному разу.         И желательно на начальном уровне, то есть используя лишь библиотеки <stdio.h> и <string.h>  ну или хотя бы подскажите как делать))) заранее спасибо smile 
PM MAIL   Вверх
Dmi3ev
Дата 12.12.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Код

//---------------------------------------------------------------------------
#include <iostream.h>
#include <string.h>
//---------------------------------------------------------------------------


int main()
{
char s[255];
char b[33];
char c;
bool insert=true;
int ii=0;
for (int i=0; i<strlen(s);i++)
 s[i]=NULL;
cout<<"Enter string: "<<endl;
cin.getline(s,255);
for (int j=0; j<strlen(b); j++)
 b[j]=NULL;

for (int i=0; i<strlen(s);i++)
 if (isalpha(s[i]))
  {
   for (int j=0; j<strlen(b); j++)
    {
     if (s[i]==b[j])
      insert=false;
    }
   if (insert && s[i]!='\0')//тут можно еще на что-нибудь проверять...
    {
     b[ii]=s[i];
     ii++;
    }
   insert=true;
  }
cout<<"Answer before sort: "<<b<<endl;
// сортировка, можешь искать сортировку методом пузырька... как вариант
return 0;
}
//---------------------------------------------------------------------------

ну так вот примерно ))) только отсортируй...



--------------------

PM MAIL   Вверх
jonie
Дата 12.12.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



тока несколько замечаний..

Код

for (int j=0; j<strlen(b); j++)
 b[j]=NULL;
заменить можно на memset(b,0, strlen(b)).
да и вообще NULL не используется таким образом. NULL используется для указания NULL pointer-ов. Используйте для указания нуля тут именно 0.

и вообще занулять b тут нет смысла (лишняя трата рессурсов).

Код

for (int i=0; i<strlen(s);i++)
эти циклы переписать ст0ит, убрав за цикл вызов strlen....


ну там про то что уже давно iostream.h нету не говорю -  потом почитаете 8-)


предлагаю другой алгоритм (более быстрый):
исходит он из того, что мы работаем с символами от 0 до 255 (это, конечно, неправильно! ну допустим так есть). Просто заведем массив в 256 значений. в общем как-то так:
Код

char s[256];
std::cout<<"Enter string: "<<endl;
std::cin.getline(s,255);

int counter[256];
memset(counter, 0, sizeof(counter));
char* ps = s;
while(*ps) {
 counter[*ps]++;
 ps++;
}

for(int i=0;i<sizeof(counter) / sizeof(counter[0]); ++i) {
 if(counter[i]>1) continue;
   std::cout<<(char)i;
}

вот и вся программа... писал тут могут быть ошибки)

ЗЫ: когда сюда встроят дебаггер?


Это сообщение отредактировал(а) jonie - 12.12.2008, 09:19


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
qaswed
Дата 12.12.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



спасибо, но последнюю прогу не оч поняла
PM MAIL   Вверх
Dmi3ev
Дата 12.12.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

ну там про то что уже давно iostream.h нету не говорю -  потом почитаете 8-)

а вот я-то не знал, как это так? тебе сказали, а мне не сказали? Вот гады, стандарты меняют, а никто об этом не знает, кроме jonie  smile  
Цитата

да и вообще NULL не используется таким образом.

а я использую и чего?
Цитата

и вообще занулять b тут нет смысла (лишняя трата рессурсов).

ну если у тебя комп не тянет, можешь заменить или убрать... У меня на ноуте даже CRYSIS на максимальных настройках не притормаживает, когда я запускаю эту программу ))) У тебя не знаю, можешь стереть... 
Цитата

исходит он из того, что мы работаем с символами от 0 до 255

это немного попроце, потому что...
Цитата

char s[256];
std::cout<<"Enter string: "<<endl;
std::cin.getline(s,255);
int counter[256];
memset(counter, 0, sizeof(counter));
char* ps = s;
while(*ps) {
 counter[*ps]++;
 ps++;
}
for(int i=0;i<sizeof(counter) / sizeof(counter[0]); ++i) {
 if(counter[i]>1) continue;
   std::cout<<(char)i;
}

кроме того, что в этой проге перед сout поставлено std (мы-то дураки и не знали о существовании пространства имен) ничего тут хорошего нет.
А ты уверен, что это боллее быстрый алгоритм???))) да, только в таком виде это или будет работать неверно, или ваще не будет работать))) прям здесь смотрел, ты прям здесь писал, а я прям здесь смотрел))) классно, вот ты ничего не обнуляешь))) введи в s два символа и будет классно, я обещаю)))


--------------------

PM MAIL   Вверх
jonie
Дата 13.12.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

а я использую и чего?
де нет, ничего...я с вами не работаю же, значит ничего.

Цитата

ну если у тебя комп не тянет, можешь заменить или убрать... У меня на ноуте даже CRYSIS на максимальных настройках не притормаживает, когда я запускаю эту программу ))) У тебя не знаю, можешь стереть... 
поставьте висту. как раз примерчик "правильного" с т.з. экономиии ресурсов ПО.

Цитата

А ты уверен, что это боллее быстрый алгоритм???))) 
да,  уверен.
да, там есть одна опечатка: "if(counter[i]>1)" следует читать как "if(counter[i]!=1)", суть не меняется.

Цитата

классно, вот ты ничего не обнуляешь))) введи в s два символа и будет классно, я обещаю)))
ну вввел, и что? ничего не случилось, все работает как надо.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dmi3ev
Дата 13.12.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



может так?
Код

char s[256];
std::cout<<"Enter string: "<<endl;
std::cin.getline(s,255);
int counter[256];
memset(counter, 0, sizeof(counter));
char* ps = s;
while(*ps) {
 counter[*ps]++;
 ps++;
}
for(int i=0;i<sizeof(counter) / sizeof(counter[0]); ++i) {
 if(counter[i]>0)
   std::cout<<(char)i;
}

просто я далеко не профи, но... то что у тебя написано:
for(int i=0;i<sizeof(counter) / sizeof(counter[0]); ++i) {
 if(counter[i]>1) continue;
   std::cout<<(char)i;
}
Не совсем правильно, по-моему))) Компильни, я просто думаю, что результат не будет желаемым))) 


--------------------

PM MAIL   Вверх
jonie
Дата 14.12.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

просто я далеко не профи, но... то что у тебя написано:
for(int i=0;i<sizeof(counter) / sizeof(counter[0]); ++i) {
 if(counter[i]!=1) continue;  //я на неравно указывал чуть выше
   std::cout<<(char)i;
}
Не совсем правильно, по-моему))) Компильни, я просто думаю, что результат не будет желаемым))) 
ты будешь удивлен, но он будет верным  и ожидаемым.

итак, поясню: мы имеем вектор от 0 до 255, каждый элемент которого есть счетчик попаданий этого символа в строку.
Далее, мы будем выводить лишь те символы (код их будет именно i), которые встретились только раз.

притом что будет сразу отсортировано по алфавиту

чего не так-то?



Это сообщение отредактировал(а) jonie - 14.12.2008, 17:50


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dmi3ev
Дата 14.12.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному разу.

извиняюсь, не понял задания немного. мой косяк...


--------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.