C++ Программа домашнее задание
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
C++ Программа домашнее задание
Привет, всем. Помогите, пожалуйста. Недавно начала изучать C++. Задали программу написать, где user вводит дата, а программа считает сколько там characters, сколько букв и потом сколько раз каждая буква встречается. Вот я и застряла на последнем етапе. Никак не могу написать loop, такой чтобы и каждая буква вылезала, а рядом с ней сколько раз она встречается.
Помогите люди добрые, а то скоро я уже компьютер за окно выброшу!!!
Помогите люди добрые, а то скоро я уже компьютер за окно выброшу!!!
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Re: C++ Программа домашнее задание
katyaever wrote:Привет, всем. Помогите, пожалуйста. Недавно начала изучать C++. Задали программу написать, где user вводит дата, а программа считает сколько там characters, сколько букв и потом сколько раз каждая буква встречается. Вот я и застряла на последнем етапе. Никак не могу написать loop, такой чтобы и каждая буква вылезала, а рядом с ней сколько раз она встречается.
Помогите люди добрые, а то скоро я уже компьютер за окно выброшу!!!
Конкретные условия в студию ну и плюс то, что вы уже написали
Я тоже сегодня начинаю курс Data Structures на С++ и тоже надо кучу всего вспоминать. Вот и вспомним на пару
Сабина
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
Вот пока что написала, но 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;
}
/* 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;
}
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
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 по символам строки.
(продолжение следует), если кто другой к тому времени не поможет, конечно.
Сабина
-
- Posts: 1
- Joined: 18 Jun 2004 03:57
- Location: Russia, Omsk
Можно так:
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]));
}
}
-
- Уже с Приветом
- Posts: 14006
- Joined: 17 Jun 2003 04:41
Начнём с мелкой придирки.
Леди, НЕ НАДО вот так писать:
Человеку, который будет это читать, придётся напрягаться , соображая, что означают магические цифры 91, 64, 96 и 123.
Напишите понятнее:
А для подсчёта букв Вам нужно завести массив целых чисел. Каждой букве соответствует своё собственное число. В начале все числа - нули. Затем, встречая букву, Вы увеличиваете "её" число на 1. В конце программы печатаете те буквы, количество которых > 0.
Поскольку Вас интересуют только латинские буквы, достаточно взять массив из 128 чисел.
Итого получаем:
P.S. Разумеется, это далеко не единственное решение.
Леди, НЕ НАДО вот так писать:
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. Разумеется, это далеко не единственное решение.
Не гоните, и не гонимы будете...
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
Девушки, начните с алгоритма. Из того что уже написано, он должен быть предельно ясным, нет? также, не устанавливайте всякие лимиты - типа 256 символов в строке, и так далее. Насколько я помню, метод который вам бы тут очень подошел называется [bin counting], или что-то в этом роде. Например, есть куча бумажек - каждая бумажка принадлежит одному из 5 видов. Как бы вы их посчитали, в жизни - разрожили бы на 5 стопок, а потом пересчитали бы каждую. Здесь то же самое. Почему не прочитать символ за символом (а не всю строку за один раз), и не расфасовать по "кучкам"? А потом не пройтись по кучкам, и все не напечатать?
Попробуйте такое написать, а потом результаты покажите. Исправим.
Попробуйте такое написать, а потом результаты покажите. Исправим.
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
Ето у Вас не С++. Ето С. С вкраплениями С++.
Если СТЛ не проходили, то ладно, иначе используйте
std::string, string::find string::replace
Прочитали строку, потом смотрим первую букву и сколько таких всего, печатаем результат, ети буквы удаляем, смотрим опьять какая первая буква и сколько таких и т.д. пока буквы есть.
Если СТЛ не проходили, то ладно, иначе используйте
std::string, string::find string::replace
Прочитали строку, потом смотрим первую букву и сколько таких всего, печатаем результат, ети буквы удаляем, смотрим опьять какая первая буква и сколько таких и т.д. пока буквы есть.
Верить нельзя никому - даже себе. Мне - можно!
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
Вот что я здесь напридумывала... Я сделала копию етого 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?
P.S. А что такое массив?
/* 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;
}
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?
P.S. А что такое массив?
/* 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;
}
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
A. Fig Lee wrote:Ето у Вас не С++. Ето С. С вкраплениями С++.
Если СТЛ не проходили, то ладно, иначе используйте
std::string, string::find string::replace
Старая русская поговорка: "use the right tools for the job" подходит сюда как нельзя больше... Хоть string и удобная фишка, find() и replace() в данной задаче совершенно не к месту!
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
Катя,
Массив == 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".
Массив == 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.
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK
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?
P.S. А что такое массив?
Массив, это 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 буквы, содержит
// количество этих букв в строке.
Пардон, если что не так понял.
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
katyaever wrote:Я увиделаЕсли СТЛ не проходили, то ладно
И вспомнила песенку, ето мы не проходили, ето нам не задавали... парам-пам-пам
Насколько я помню, это не очень хорошо закончилось
Тогда, используйте другой метод.. Куски этого метода Евгений вам написал. Только не списывайте, а разберитесь сначала. Честное слово, хоть это и звучит глупо, но если вы сами будете так лезть "через" проблемы, то методом тыка выработаются навыки, которые вам потом очень помогут. Честно-честно.
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK