C++ Программа домашнее задание
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
Если я правильно помню: char - это всегда 1 byte. Но byte не в том смысле что там 8 bits (может быть и больше - CHAR_BIT, в теории), а в том смысле что sizeof (char) всегда 1. Тоесть, по идее, array должен быть размером с CHAR_MAX (C'шный эквивалент numeric_limits, поддерживаемый в С++ ?)
С другой стороны, известно, что ASCII characters 0 - 256, так что если предположение что input - ASCII, то все путем. Я думаю что такие мерзкие детали не обсуждаются в начальных классах по програмированию.
С другой стороны, известно, что ASCII characters 0 - 256, так что если предположение что input - ASCII, то все путем. Я думаю что такие мерзкие детали не обсуждаются в начальных классах по програмированию.
-
- Уже с Приветом
- Posts: 550
- Joined: 31 Mar 2000 10:01
- Location: Moscow --> Baltimore, MD
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
f_evgeny wrote:CTAC_P wrote:f_evgeny wrote:Пардон, если что не так понял.
Боюсь что Char не обязан быть всегда равным 0..255
Ну так просветите, а то я не понял, что Вы имеете в виду.
До нас дошли новые веяния и мы долзны скоро начать тоже писать на C. Пока все на ассемблере. Так вот у нас char будет размером 16 бит - 0..65535.
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK
CTAC_P wrote:До нас дошли новые веяния и мы долзны скоро начать тоже писать на C. Пока все на ассемблере. Так вот у нас char будет размером 16 бит - 0..65535.
В военное время, значение косинуса нуля может достигать 4-х (C)
Кстати, посмотрите мой дисклаймер, я сообщил:
а) что Си я не помню;
b) что пишу на псевдоязыке;
с) что передаю только идею, а не реализацию;
Так что Вашу поправку могу смело посчитать неспровацированным наездом, скорее всего носящим личную подоплеку, и характеризующим Вас как весьма агрессивную, асоциальную личность.
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Вот это у меня работает. Правда печатает дубликаты по числу букв, но это уже косметика
Сабина
Code: Select all
/* 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()
{
char charsOfString[80]; //array to hold chars of string (80 chars per line -max line length?)
int totalChars = 0; //total chars in line
int charOccurs = 0; //occurences of the char
int numOfLetters = 0; //num of letters in line
char buff; //buffer to hold char to compare in loop
cout << "Please enter your data. When the input is complete, please hit enter." << endl;
while ((charsOfString[totalChars] = cin.get()) != '\n')
{
totalChars = totalChars + 1;
}
//loop by chars trough the string
for (int i = 0; i <= totalChars; i++)
{
buff= charsOfString[i]; //buffer to hold current char
//loop to count ocuurences of each char
for (int j = 0; j <= totalChars; j++)
{
if (buff==charsOfString[j])
charOccurs = charOccurs +1;
}
if (buff !='\n')
cout << "Character " << buff << " has " << charOccurs << " occurences in the line." << endl;
charOccurs = 0;
//check if letter
if ((buff >= 'a' && buff <='z') || (buff >= 'Z' && buff <='Z'))
{
numOfLetters = numOfLetters + 1;
}
}
cout << "Total number of letters in string " << numOfLetters << endl;
cout << "I hope you are happy now?" << endl;
return 0;
}
Сабина
Last edited by Sabina on 29 Jun 2004 23:04, edited 1 time in total.
-
- Уже с Приветом
- Posts: 2190
- Joined: 14 Jun 2004 15:18
Sabina! I love you!!!
Thank you so much.
I came up with something like that but I kept putting the "occurences" loop under the "if letter" condition and it kept screwing everything up. Now I read the task again and, of course, it says count occurences of every unique character, not every letter. What was I thinking?
Anyway, thanks again!
Thank you so much.
I came up with something like that but I kept putting the "occurences" loop under the "if letter" condition and it kept screwing everything up. Now I read the task again and, of course, it says count occurences of every unique character, not every letter. What was I thinking?
Anyway, thanks again!
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 491
- Joined: 09 Apr 2000 09:01
- Location: Tigard, OR
Не пугайтесь STL, с ней все намного проще!
Code: Select all
#include <iostream>
#include <string>
#include <map>
int main() {
std::string s;
std::cout << "Enter your data: ";
std::cin >> s;
int counter = 0;
std:: map<int,int> letters;
for (std::string::size_type i = 0; i != s.size(); i++) {
if (isalpha(s[i])) {
counter++;
++letters[s[i]];
}
}
std::cout << "Entered " << s.size() << " characters with "
<< counter << (counter == 1 ? " letter" : " letters")
<< std::endl;
for (std::map<int, int>::const_iterator i = letters.begin();
i != letters.end(); i++) {
std::cout << "letter " << (char)i->first << " occurs " << i->second
<< " times" << std::endl;
}
return 0;
}
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 14006
- Joined: 17 Jun 2003 04:41
Sabina wrote:Вот это у меня работает.
Я позволю себе опять попридираться:
Придирка №1:
Code: Select all
...
char charsOfString[80]; //array to hold chars of string (80 chars per line -max line length?)
int totalChars = 0; //total chars in line
...
while ((charsOfString[totalChars] = cin.get()) != '\n')
Где проверка на длину строки? Access violation хотите?
Должно быть:
Code: Select all
while ((totalChars < 79) && (charsOfString[totalChars] = cin.get()) != '\n')
{
totalChars = totalChars + 1;
}
charsOfString[totalChars] = '\n';
Придирка №2:
Условие "главного" цикла лучше заменить на i < totalChars. Элемент с индексом totalChars равен '\n', и для него этот цикл вообще выполнять не нужно.
А все предыдущие элементы не равны '\n'. Поэтому if (buff !='\n') внутри цикла можно выкинуть.
Таким образом, "главный" цикл выглядит следующим образом:
Code: Select all
//loop by chars trough the string
for (int i = 0; i < totalChars; i++)
{
buff = charsOfString[i]; //buffer to hold current char
//loop to count ocuurences of each char
charOccurs = 0;
for (int j = 0; j <= totalChars; j++)
{
if (buff == charsOfString[j])
charOccurs = charOccurs +1;
}
cout << "Character " << buff << " has " << charOccurs << " occurences in the line." << endl;
//check if letter
if ((buff >= 'a' && buff <='z') || (buff >= 'A' && buff <='Z'))
{
numOfLetters = numOfLetters + 1;
}
}
Придирка №3: (specially for Sabina ) В последнем if-е (в том, который "check if letter") должно быть ...(buff >= 'A' && buff <='Z'), а не так, как у Вас написано.
Ну и по мелочам (хотя это уже не обязательно, только ради эстетства):
- Вместо totalChars = totalChars + 1 лучше писать totalChars++
- В качестве признака конца строки более традиционно использовать 0, а не '\n'. Т.е. в условии цикла while, разумеется, оставляем '\n', а вот в идущем после него присваивании и в во всём дальнейшем коде - 0.
Last edited by SBolgov on 30 Jun 2004 03:19, edited 1 time in total.
Не гоните, и не гонимы будете...
-
- Уже с Приветом
- Posts: 14006
- Joined: 17 Jun 2003 04:41
theukrainian wrote:А теперь представьте что вы еще не учили templates и STLig wrote:Не пугайтесь STL, с ней все намного проще
ППКС.
Учебная задача должна быть решена так, как хочет преподаватель.
В данном случае у меня сложилось впечатление, что преподаватель хочет именно "приплюснутый С", а не красивые удобные библиотеки.
Не гоните, и не гонимы будете...
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
SBolgov wrote:Я позволю себе опять попридираться:
Оч. хорошо и похвально. Спасибо за придирки.
SBolgov wrote:Где проверка на длину строки?
Согласна. Только не мешало бы если в самой задаче получше определили что подразумевается под строкой. А то получается сама придумала условие про 80 char.
SBolgov wrote:Условие "главного" цикла лучше заменить на i < totalChars. Элемент с индексом totalChars равен '\n', и для него этот цикл вообще выполнять не нужно.
Точна
SBolgov wrote:Придирка №3: (specially for Sabina )
Да, опечатки конечно непростительны
Сабина
Last edited by Sabina on 30 Jun 2004 04:54, edited 1 time in total.
-
- Уже с Приветом
- Posts: 14006
- Joined: 17 Jun 2003 04:41
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 14006
- Joined: 17 Jun 2003 04:41
Sabina wrote:Только не мешало бы если в самой задаче получше определили что подразумевается под строкой.
Согласен. Действительно, неплохо бы уточнить. Но в любом случае, какой бы ни была длина буфера (80 или 20 или 100 или ...) - проверять выход за границы всё равно надо.
Sabina wrote:А то получается сама придумала условие про 80 char.
В самом первом варианте программы стояло 256. Правда, непонятно, было ли это число в условии задачи, или же взято "с потолка".
Не гоните, и не гонимы будете...
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
SBolgov wrote:Я позволю себе опять попридираться: ;
Позвольте уж тогда и мне
Code: Select all
while ((charsOfString[totalChars] = cin.get()) != '\n')
Где проверка на длину строки? Access violation хотите?
Должно быть:Code: Select all
while ((totalChars < 79) && (charsOfString[totalChars] = cin.get()) != '\n')
{
totalChars = totalChars + 1;
}
charsOfString[totalChars] = '\n';
(totalChars < 79) должно быть sizeof charsOfString. Тогда можно поменять константу только в одном месте, и будет понятно что она значит.
-
- Уже с Приветом
- Posts: 2506
- Joined: 13 Jan 2003 22:34
- Location: Kiev :: Los Angeles, CA
Sabina wrote:Согласна. Только не мешало бы если в самой задаче получше определили что подразумевается под строкой. А то получается сама придумала условие про 80 char
Я же уже писал выше, что незачем придумывать себе всякие ограничения Если вы последуете моему совету про bin counting, то вы сможете все сделать без ограничений на длину строки, и в процессе одного loop-a (ну, и еще один чтобы распечатать)
-
- Уже с Приветом
- 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
Sabina wrote:Чем мне нравятся приветовские мужчины (я не шучу ), так это тем, что покритиковать они завсегда готовы.
Стало быть для того, чтобы вытянуть у них ценную информацию, надо сделать как можешь и на что времени хватает, и тут же получишь полный набор советов
Нет То есть, если нравятся то это конечно хорошо... Но. Это стандартная практика в comp.lang.c and comp.lang.c++ (которые я настоятельно рекомендую). Обычно дается 2 аргумента:
1. Если студент не хочет потратить свое время на решение задачи, то почему его должны тратить люди, ему помогающие (я не совсем согласен).
2. Тут я полностью согласен, и приводил этот аргумент выше: если все написать за студента, студент нихера не усвоит. Если студент потыкается, то он хорошо запомнит материал, будет привыкать самостоятельно искать ответы, и, наконец, получит причину разобраться в программе.
Есть еще одна причина: по отношению к остальным ученикам, полностью написать за студента программу было бы нечестно....
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
theukrainian wrote:1. Если студент не хочет потратить свое время на решение задачи, то почему его должны тратить люди, ему помогающие (я не совсем согласен).
Потому что это им тоже может пригодится? Я иногда в Вопросы IT лезу чисто для разминки мозгов. Обычно чему-нибудь да научишься. Особенно тем, кто не работает полезно (как я).
theukrainian wrote:2. Тут я полностью согласен, и приводил этот аргумент выше: если все написать за студента, студент нихера не усвоит.
Это уже дело студента. Данный конкретный студент собирался от отчаяния компьютер из окна выкинуть, а я не могу позволить такое жестокое разбазаривание hardware
theukrainian wrote:Есть еще одна причина: по отношению к остальным ученикам, полностью написать за студента программу было бы нечестно....
Ой, да что в этой жизни честно ....
Сабина
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
Дайте тоже позанудствовать!
Занудка #1. В моей железяке только 400 байт памяти, поэтому промежуточный буфер для строки просто непозволительная роскошь.
Занудка #2. Буквы, они не только A..Z i a..z. В военное время, когда значение косинуса достигает 4 еще и А..Я, а..я. Лучше всех об этом знает isalpha()
[/quote]
Занудка #1. В моей железяке только 400 байт памяти, поэтому промежуточный буфер для строки просто непозволительная роскошь.
Занудка #2. Буквы, они не только A..Z i a..z. В военное время, когда значение косинуса достигает 4 еще и А..Я, а..я. Лучше всех об этом знает isalpha()
[/quote]