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

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

Ну так просветите, а то я не понял, что Вы имеете в виду.
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

Если я правильно помню: char - это всегда 1 byte. Но byte не в том смысле что там 8 bits (может быть и больше - CHAR_BIT, в теории), а в том смысле что sizeof (char) всегда 1. Тоесть, по идее, array должен быть размером с CHAR_MAX (C'шный эквивалент numeric_limits, поддерживаемый в С++ ?)
С другой стороны, известно, что ASCII characters 0 - 256, так что если предположение что input - ASCII, то все путем. Я думаю что такие мерзкие детали не обсуждаются в начальных классах по програмированию.
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

theukrainian wrote:... ASCII characters 0 - 256...

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

Post by theukrainian »

Niky wrote:
theukrainian wrote:... ASCII characters 0 - 256...

255 8)
ой :radio%:
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

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

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

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

До нас дошли новые веяния и мы долзны скоро начать тоже писать на C. Пока все на ассемблере. Так вот у нас char будет размером 16 бит - 0..65535.
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

CTAC_P wrote:Так вот у нас char будет размером 16 бит - 0..65535.
А что за architecture?

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