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

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. Тогда можно поменять константу только в одном месте, и будет понятно что она значит.

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