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]
Не годится?
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

f_evgeny wrote:Неохота влезать в ...


:radio%:

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

Post by katyaever »

Вот что я здесь напридумывала... Я сделала копию етого array и пытаюсь сравнить их.
Here is how I understand:
1. I have to make an outer loop to display the characters of the array, if they are letters.
2. The inner loop then takes the first element of the array (array[i], i is initialized to 0) and compares it to the first element of the copy of that array (copyOfArray [index], index is initialized to 0). If they are the same index is inceremented by 1, index++. The inner loop then takes the 1st element of the array and compares it to the 2nd element of the copy of the array (if array[0] == copyOfArray[1]), and so on.
When I put in the code, following this logic, everything is displayed fine, except the counts are all screwed up!!!
WHERE DID I GO WRONG? :pain1: :x
P.S. А что такое массив? :oops:



/* 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, index = 0;

int numOfOccurences [letters]={0};
char string[arraySize]={0};
char copyOfString[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;
strcpy (copyOfString, string);
cout << "Copy of string contains: " << copyOfString << 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;


for (i = 0; string [i] !=0; i++)
{
if (string[i] <= 'A' && string[i] >= 'Z' || string[i] >='a' && string[i] <= 'z')
{
for (index = 0; index < numOfLetters; index++)
{
cout << string[i] << " is compared to " << copyOfString[index] << endl;
if (string[i] == copyOfString [index])
{
index++;
cout << "The letter is displayed "<< index << " times." << endl;
}
}
}
return 0;
}
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

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

Старая русская поговорка: "use the right tools for the job" подходит сюда как нельзя больше... Хоть string и удобная фишка, find() и replace() в данной задаче совершенно не к месту!
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

Катя,

Массив == array. Я сам по-русски в этих всех терминах не шарю :) так, в эхе нахватался пекоторых терминов :)

Кто-то из нас не понимает условия задачи, и очень возможно что это я :) Нам что нужно посчитать - сколько всего букв было введено? Или "how many instances of each letter you have encountered"?
I think its the latter. Тогда я вижу у вас 2 выхода (хотя их можно, наверное, придумать и много больше):
1. Метод Фигли (предполагающий что вы уже учили STL): читаете все в string (в C++ strings сами растут и сжимаются, что делает их очень удобными. Не путать с array of characters ala C). Так вот, читаете все предложение, а потом используете функции приведенные Фигли, чтобы буковки, и их посчитат. Сначаал ищете а, потом б, потом в, и т.д.
2. Используете метод, который я описал выше. Кстати, если вы strings уже проходили, то можно не читать символ за символом, а прочитать все в string. A потом просо сделать array и "расфасовать все по кучкам".

То что написали вы, я не совсем понимаю - зачем вам сравнивать arrays? Естественно, что при таком подходе ваши counts будут "screwed up".
Last edited by theukrainian on 29 Jun 2004 18:10, edited 1 time in total.
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

katyaever wrote:Вот что я здесь напридумывала... Я сделала копию етого array и пытаюсь сравнить их.
Here is how I understand:
1. I have to make an outer loop to display the characters of the array, if they are letters.
2. The inner loop then takes the first element of the array (array[i], i is initialized to 0) and compares it to the first element of the copy of that array (copyOfArray [index], index is initialized to 0). If they are the same index is inceremented by 1, index++. The inner loop then takes the 1st element of the array and compares it to the 2nd element of the copy of the array (if array[0] == copyOfArray[1]), and so on.
When I put in the code, following this logic, everything is displayed fine, except the counts are all screwed up!!!
WHERE DID I GO WRONG? :pain1: :x
P.S. А что такое массив? :oops:


Массив, это array.
Попробую повторить идею, записав ее на псевдо языке. Поскольку вспоминать Си некогда, в синтаксисе могут быть ошибки.

Code: Select all

// Объявление массива 
char array_of_number_of_letter[255] =;
// Инициализация массива
for(int i=0;i != 256;i++){
       array_of_number_of_letter[i] = 0;
}
// Считываем строку по однму символу
 for (int i = 0; string [i] != 0; i++) {
       // Для каждого считываемого символа
       // увеличиваем на единицу член массива
       // с индексом равным ASCII коду символа
       // возможно, нужно будет сделать cast
       // для string[i]
       array_of_number_of_letter[string[i]]++;
}
// Теперь значение каждого элемента вашего массива
// с индексом, равным ASCII буквы, содержит
// количество этих букв в строке.

Пардон, если что не так понял.
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Я увидела
Если СТЛ не проходили, то ладно

И вспомнила песенку, ето мы не проходили, ето нам не задавали... парам-пам-пам :mrgreen:
На самом деле еще не проходили, но выглядит так, что СТЛ ета полезная штука...
Last edited by katyaever on 29 Jun 2004 18:15, edited 1 time in total.
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

Спасибо, приду домой, обязательно попрубую.
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

katyaever wrote:Я увидела
Если СТЛ не проходили, то ладно

И вспомнила песенку, ето мы не проходили, ето нам не задавали... парам-пам-пам :mrgreen:

Насколько я помню, это не очень хорошо закончилось :)
Тогда, используйте другой метод.. Куски этого метода Евгений вам написал. Только не списывайте, а разберитесь сначала. Честное слово, хоть это и звучит глупо, но если вы сами будете так лезть "через" проблемы, то методом тыка выработаются навыки, которые вам потом очень помогут. Честно-честно. :)
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

f_evgeny wrote:Пардон, если что не так понял.

:nono#: Боюсь что Char не обязан быть всегда равным 0..255
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

CTAC_P wrote:
f_evgeny wrote:Пардон, если что не так понял.

:nono#: Боюсь что Char не обязан быть всегда равным 0..255

Ну так просветите, а то я не понял, что Вы имеете в виду.

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