C++ Программа домашнее задание

katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

C++ Программа домашнее задание

Post by katyaever »

Привет, всем. Помогите, пожалуйста. Недавно начала изучать C++. Задали программу написать, где user вводит дата, а программа считает сколько там characters, сколько букв и потом сколько раз каждая буква встречается. Вот я и застряла на последнем етапе. Никак не могу написать loop, такой чтобы и каждая буква вылезала, а рядом с ней сколько раз она встречается.
Помогите люди добрые, а то скоро я уже компьютер за окно выброшу!!! :х
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: C++ Программа домашнее задание

Post by Sabina »

katyaever wrote:Привет, всем. Помогите, пожалуйста. Недавно начала изучать C++. Задали программу написать, где user вводит дата, а программа считает сколько там characters, сколько букв и потом сколько раз каждая буква встречается. Вот я и застряла на последнем етапе. Никак не могу написать loop, такой чтобы и каждая буква вылезала, а рядом с ней сколько раз она встречается.
Помогите люди добрые, а то скоро я уже компьютер за окно выброшу!!! :х


Конкретные условия в студию ну и плюс то, что вы уже написали :)
Я тоже сегодня начинаю курс Data Structures на С++ и тоже надо кучу всего вспоминать. Вот и вспомним на пару :wink:

Сабина
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Вот пока что написала, но loop который буквы щитает не выходит!

/* Program to accept a line of characters from the user and will count how many letters
are in the line, how many total characters the line contains. It will output the total
count of letters and the occurences of each unique character which is entered by the user.
It will display the total count of each character.*/

#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;

int main()
{
const int arraySize = 256;
const int letters = 52;
int numOfLetters = 0;
int count=0;

int numOfOccurences [letters]={0};
char string[arraySize]={0};
cout << "Please enter your data. When the input is complete, please hit enter." << endl;
cin.get(string,arraySize);
cout << "The characters you entered separated by spaces are: ";
for (int i = 0; string [i] != 0; i++)
{
cout << string[i] << " ";

}
cout << endl;
cout << "The string contains " << strlen(string) << " characters." << endl;// Displays number of characters.

cout << "The letters in the data you entered are: " << endl;
for (i = 0; string [i] != 0; i++)
{
if (string[i] < 91 && string[i] > 64 || string[i] >96 && string[i] < 123)
{
numOfLetters++;
cout << string[i] << " ";
}
}
cout << endl;

cout << "Out of the characters you entered, " << numOfLetters << " are letters." << endl;
return 0;
}
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

katyaever wrote:/* Program to accept a line of characters from the user and will count how many letters are in the line, how many total characters the line contains. It will output the total count of letters and the occurences of each unique character which is entered by the user. It will display the total count of each character.*/


Подробно еще не посмотрела (счас всех ужином накормлю :)). Но что в глаза бросается: такое ощущение, что автор задачи под characters и letters подразумевает одно и то же.

Если исходить из того, что юзер может набить любой character, а посчитать также надо сколько там всего БУКВ и сколько раз каждая буква встречается,
то по моему мнению надо сделать loop по буквам афавита и внутри loop по символам строки, сравнивать каждый ее символ с очередной буквой алфавита.
Не понятно что там с case-ом, предполагается, что они все lower case или upper case тоже возможен?

Outer loop что-то вроде

char ch='A';

for (ch = 'a'; ch <= 'z'; a++)

а внутри loop по символам строки.

(продолжение следует), если кто другой к тому времени не поможет, конечно.

Сабина
Evgeniy Loskutov
Posts: 1
Joined: 18 Jun 2004 03:57
Location: Russia, Omsk

Post by Evgeniy Loskutov »

Можно так:

Code: Select all

int nLen = strlen(string);
for (i = 0; i < nLen; i++)
{
     if (isalpha(string[i]))
     {
          if ((i == 0) || (find(string, string + i - 1, string[i]) == string + i - 1))
             printf("Count of %c is %d\r\n", string[i], std::count(string, string + nLen, string[i]));
     }
}
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Начнём с мелкой придирки. ;)

Леди, НЕ НАДО :nono#: вот так писать:
katyaever wrote:if (string[i] < 91 && string[i] > 64 || string[i] >96 && string[i] < 123)


Человеку, который будет это читать, придётся напрягаться :(, соображая, что означают магические цифры 91, 64, 96 и 123.

Напишите понятнее:

Code: Select all

if ( string[i] >= 'A' && string[i] =< 'Z' || string[i] >= 'a' && string[i] =< 'z' )


А для подсчёта букв Вам нужно завести массив целых чисел. Каждой букве соответствует своё собственное число. В начале все числа - нули. Затем, встречая букву, Вы увеличиваете "её" число на 1. В конце программы печатаете те буквы, количество которых > 0.

Поскольку Вас интересуют только латинские буквы, достаточно взять массив из 128 чисел.

Итого получаем:

Code: Select all

#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;

int main()
{
   const int arraySize = 256;
   const int letters = 52;
   int numOfLetters = 0;
   int count=0;
   int LetterCounts[128];
   char c;

   int numOfOccurences [letters]={0};
   char string[arraySize]={0};
   cout << "Please enter your data. When the input is complete, please hit enter." << endl;
   cin.get(string,arraySize);
   cout << "The characters you entered separated by spaces are: ";
   for (int i = 0; string [i] != 0; i++)
   {
      cout << string[i] << " ";
      
   }
   cout << endl;
   cout << "The string contains " << strlen(string) << " characters." << endl;// Displays number of characters.
   
   // Set all counts to 0
   for (c = 0; c < 128; c++)
   {
      LetterCounts[c] = 0;
   }

   // Count letters
   for (i = 0; string [i] != 0; i++)
   {
      if ( string[i] >= 'A' && string[i] =< 'Z' || string[i] >= 'a' && string[i] =< 'z' )
      {
         LetterCounts[ string[i] ]++;
      }
   }

   cout << "The letters in the data you entered are: " << endl;
   for (c = 0; c < 128; c++)
   {
      if (LetterCounts[c] > 0)
      {
         numOfLetters++;
         cout << c << " - " << LetterCounts[c] << " times" << endl;
      }
   }
      
   cout << "Out of the characters you entered, " << numOfLetters << " are letters." << endl;
   return 0;
}


P.S. Разумеется, это далеко не единственное решение.
Не гоните, и не гонимы будете...
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Засунула код в project, and it doesn't run. 2 errors:
error C2059: syntax error : '<'
error C2143: syntax error : missing ';' before '{'
С чего бы ето? :pain1: Вроде выглядит нормально...
А за придирку, спасибо, как у вас и действительно, понятней :D
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Нашла error, it runs now. Вот только ничего не делает... сидит курсор, мигает, и все :(
А у вас етот код ran?
Извините, что полу по-русски, полу по-aнглиски, я по-русски ети истории никогда и не видела.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

SBolgov wrote:....
int numOfOccurences [letters]={0};
.....


Там еще просят "the occurences of each unique character". Стало быть еще один цикл, где текущий символ строки в буфер и с ним сравнивать все остальные?

Сабина
Last edited by Sabina on 29 Jun 2004 05:06, edited 1 time in total.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

katyaever wrote:А у вас етот код ran?


Я еще VС++ не установила :(
Препод советует взять student license для Metrowerk’s CodeWarrior Version 8, но я что-то не вижу смысла потратить 60 баксов, когда есть VC++.

Сабина
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Спасибо всем. Буду сидеть, разбираться, чего не работает. :wink:
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

katyaever wrote:А у вас етот код ran?


Установила VC++. Код ваш прогнала. Получилось вот что
Image

Вы каким IDE пользуетесь? Если тоже VC++, может вы свойства проекта неправильно задали?

Сабина
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

Девушки, начните с алгоритма. Из того что уже написано, он должен быть предельно ясным, нет? также, не устанавливайте всякие лимиты - типа 256 символов в строке, и так далее. Насколько я помню, метод который вам бы тут очень подошел называется [bin counting], или что-то в этом роде. Например, есть куча бумажек - каждая бумажка принадлежит одному из 5 видов. Как бы вы их посчитали, в жизни - разрожили бы на 5 стопок, а потом пересчитали бы каждую. Здесь то же самое. Почему не прочитать символ за символом (а не всю строку за один раз), и не расфасовать по "кучкам"? А потом не пройтись по кучкам, и все не напечатать?

Попробуйте такое написать, а потом результаты покажите. Исправим.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Ето у Вас не С++. Ето С. С вкраплениями С++.
Если СТЛ не проходили, то ладно, иначе используйте
std::string, string::find string::replace

Прочитали строку, потом смотрим первую букву и сколько таких всего, печатаем результат, ети буквы удаляем, смотрим опьять какая первая буква и сколько таких и т.д. пока буквы есть.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

Неохота влезать в Си, но там же вроде есть массивы.
Я такие задачи делаю так:
- Заводим массив размером равным количеству букв,
а потом для каждой буквы делаем
letters_array[letter]++, в конце распечатываем
letter = letter_array[letter]
Не годится?

Return to “Вопросы и новости IT”