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

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?
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

CTAC_P wrote:До нас дошли новые веяния и мы долзны скоро начать тоже писать на C. Пока все на ассемблере. Так вот у нас char будет размером 16 бит - 0..65535.

В военное время, значение косинуса нуля может достигать 4-х (C) :nono#:
Кстати, посмотрите мой дисклаймер, я сообщил:
а) что Си я не помню;
b) что пишу на псевдоязыке;
с) что передаю только идею, а не реализацию;
Так что Вашу поправку могу смело посчитать неспровацированным наездом, скорее всего носящим личную подоплеку, и характеризующим Вас как весьма агрессивную, асоциальную личность. :D
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

A. Fig Lee wrote:Ето у Вас не С++. Ето С. С вкраплениями С++.

Как сказал один остроумный человек:
Это - не Си-плюс-плюс, это - приплюснутый Си.
Cheers
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

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

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.
katyaever
Уже с Приветом
Posts: 2190
Joined: 14 Jun 2004 15:18

Post by katyaever »

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. :oops: Now I read the task again and, of course, it says count occurences of every unique character, not every letter. What was I thinking? :pain1: :oops:
Anyway, thanks again!
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

katyaever wrote:Sabina! I love you!!!


:oops: :oops: :oops:

katyaever wrote:Thank you so much.


You are welcome :)

Sabina
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

Не пугайтесь 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;
}     
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

ig wrote:Не пугайтесь STL, с ней все намного проще

А теперь представьте что вы еще не учили templates и STL :) Жалко что тут нету emoticon, у которого волосы дыбом встают :)
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

theukrainian wrote:Жалко что тут нету emoticon, у которого волосы дыбом встают :)


Может вот эти подойдут на замену
Image и Image ?

STL учат на Computer Science II или даже III. А это судя по всему Introduction.

Сабина
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

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 хотите? :nono#:

Должно быть:

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 :P) В последнем if-е (в том, который "check if letter") должно быть ...(buff >= 'A' && buff <='Z'), а не так, как у Вас написано. :P

Ну и по мелочам (хотя это уже не обязательно, только ради эстетства):
- Вместо totalChars = totalChars + 1 лучше писать totalChars++
- В качестве признака конца строки более традиционно использовать 0, а не '\n'. Т.е. в условии цикла while, разумеется, оставляем '\n', а вот в идущем после него присваивании и в во всём дальнейшем коде - 0.
Last edited by SBolgov on 30 Jun 2004 03:19, edited 1 time in total.
Не гоните, и не гонимы будете...
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

theukrainian wrote:
ig wrote:Не пугайтесь STL, с ней все намного проще
А теперь представьте что вы еще не учили templates и STL :)

ППКС. ;)

Учебная задача должна быть решена так, как хочет преподаватель. :umnik1:

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

Post by Sabina »

SBolgov wrote:Я позволю себе опять попридираться: ;)


Оч. хорошо и похвально. Спасибо за придирки.

SBolgov wrote:Где проверка на длину строки? :?


Согласна. Только не мешало бы если в самой задаче получше определили что подразумевается под строкой. А то получается сама придумала условие про 80 char.

SBolgov wrote:Условие "главного" цикла лучше заменить на i < totalChars. Элемент с индексом totalChars равен '\n', и для него этот цикл вообще выполнять не нужно.


Точна :umnik1:

SBolgov wrote:Придирка №3: (specially for Sabina :P)


Да, опечатки конечно непростительны :oops:

Сабина
Last edited by Sabina on 30 Jun 2004 04:54, edited 1 time in total.
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Sabina wrote:Да, опечатки конечно непросительны :oops:

Да, безусловно. :P
Не гоните, и не гонимы будете...
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

SBolgov wrote:
Sabina wrote:Да, опечатки конечно непросительны :oops:

Да, безусловно. :P


Занудство тоже :P

Сабина
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Sabina wrote:Только не мешало бы если в самой задаче получше определили что подразумевается под строкой.

Согласен. Действительно, неплохо бы уточнить. Но в любом случае, какой бы ни была длина буфера (80 или 20 или 100 или ...) - проверять выход за границы всё равно надо.

Sabina wrote:А то получается сама придумала условие про 80 char.

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

Post by theukrainian »

SBolgov wrote:Я позволю себе опять попридираться: ;

Позвольте уж тогда и мне :)

Code: Select all

   while ((charsOfString[totalChars] = cin.get()) != '\n')

Где проверка на длину строки? :? Access violation хотите? :nono#:

Должно быть:

Code: Select all

   while ((totalChars < 79) && (charsOfString[totalChars] = cin.get()) != '\n')
   {
      totalChars =  totalChars + 1;
   }
   charsOfString[totalChars] = '\n';

(totalChars < 79) должно быть sizeof charsOfString. Тогда можно поменять константу только в одном месте, и будет понятно что она значит.
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

Sabina wrote:Согласна. Только не мешало бы если в самой задаче получше определили что подразумевается под строкой. А то получается сама придумала условие про 80 char

Я же уже писал выше, что незачем придумывать себе всякие ограничения :) Если вы последуете моему совету про bin counting, то вы сможете все сделать без ограничений на длину строки, и в процессе одного loop-a (ну, и еще один чтобы распечатать)
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Чем мне нравятся приветовские мужчины (я не шучу :umnik1: ), так это тем, что покритиковать они завсегда готовы.

Стало быть для того, чтобы вытянуть у них ценную информацию, надо сделать как можешь и на что времени хватает, и тут же получишь полный набор советов :lol:

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

Post by theukrainian »

Sabina wrote:Чем мне нравятся приветовские мужчины (я не шучу :umnik1: ), так это тем, что покритиковать они завсегда готовы.

Стало быть для того, чтобы вытянуть у них ценную информацию, надо сделать как можешь и на что времени хватает, и тут же получишь полный набор советов :lol:

Нет :) То есть, если нравятся то это конечно хорошо... Но. Это стандартная практика в comp.lang.c and comp.lang.c++ (которые я настоятельно рекомендую). Обычно дается 2 аргумента:
1. Если студент не хочет потратить свое время на решение задачи, то почему его должны тратить люди, ему помогающие (я не совсем согласен).
2. Тут я полностью согласен, и приводил этот аргумент выше: если все написать за студента, студент нихера не усвоит. Если студент потыкается, то он хорошо запомнит материал, будет привыкать самостоятельно искать ответы, и, наконец, получит причину разобраться в программе.

Есть еще одна причина: по отношению к остальным ученикам, полностью написать за студента программу было бы нечестно....
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

theukrainian wrote:1. Если студент не хочет потратить свое время на решение задачи, то почему его должны тратить люди, ему помогающие (я не совсем согласен).


Потому что это им тоже может пригодится? Я иногда в Вопросы IT лезу чисто для разминки мозгов. Обычно чему-нибудь да научишься. Особенно тем, кто не работает полезно (как я).

theukrainian wrote:2. Тут я полностью согласен, и приводил этот аргумент выше: если все написать за студента, студент нихера не усвоит.


Это уже дело студента. Данный конкретный студент собирался от отчаяния компьютер из окна выкинуть, а я не могу позволить такое жестокое разбазаривание hardware :umnik1:

theukrainian wrote:Есть еще одна причина: по отношению к остальным ученикам, полностью написать за студента программу было бы нечестно....


Ой, да что в этой жизни честно ....

Сабина
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

Дайте тоже позанудствовать!
Занудка #1. В моей железяке только 400 байт памяти, поэтому промежуточный буфер для строки просто непозволительная роскошь.
Занудка #2. Буквы, они не только A..Z i a..z. В военное время, когда значение косинуса достигает 4 еще и А..Я, а..я. Лучше всех об этом знает isalpha() ;)
[/quote]

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