2015-03-24 3 views
1

Хорошо, поэтому я смотрел, хотя Google и на форумах часами, и не может понять, как решить эту проблему.Чтение цифр из int и подсчет их

Мне нужно написать программу, которая сначала определяет, является ли введенный пользователем номер базовым 5 (другими словами, число, которое содержит только 0, 1, 2, 3 и 4). Затем я должен подсчитать, сколько 0s, 1s, 2s и т. Д. Указано в номере и отобразить его пользователю.

Я видел, как люди говорили, что я должен преобразовать int в string, а затем используя cin.get(). Я заметил, что не могу использовать cin.get() на string, это должно быть char.

Я могу использовать только петлю while для этого задания, а не while... do.

Любая помощь приветствуется!

Вот то, что я до сих пор, очевидно, со всеми своими ошибками в нем:

//---------------------------------------------- 
// Assignment 3 
// Question 1 
// File name: q1.cpp 
// Written by: Shawn Rousseau (ID: 7518455) 
// For COMP 218 Section EC/Winter 2015 
// Concordia University, Montreal, QC 
//----------------------------------------------- 

// The purpose of this program is to check if the 
// number entered by the user is a base of 5 
#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    // Declaring variables 
    int number; 
    int zeros; 
    int ones; 
    int twos; 
    int threes; 
    int fours; 
    bool base5; 

    // Get data and calculate 

    cin >> number; 
    string numberString = to_string(number); 

    // Determine if the number is a base 5 number 
    while (cin.get(numberString) == 0 || cin.get(numberString) == 1 || 
    cin.get(numberString) == 2 || cin.get(numberString) == 3 || 
    cin.get(numberString) == 4) 
    base5 = true; 


    // Determine the number of each digits 
    zeros = 0; 
    ones = 0; 
    twos = 0; 
    threes = 0; 
    fours = 0; 

    return 0; 
} 
+0

Кстати, как вы можете видеть, я новичок. Это C++ –

ответ

0

Несколько вещей, которые нужно остерегаться:

Один способ получить определенный символ из std::string является []. например

std::string myString{"abcdefg"}; 
char myChar = myString[4]; // myChar == 'e' 

cin.get(aString) не пытается получить данные из aString. Он продолжает получать данные из stdin и хранить в aString. После того, как вы получите данные и поместите их в строку, вы можете просто манипулировать самой строкой.

короткий фрагмент кода, который будет подсчитывать количество гласных в строке. Если вы это понимаете, не должно быть никаких проблем с вашей работой. (Не составлены, возможно, некоторые опечатки)

std::string inputString; 
std::cin >> inputString; 

// you said you need a while loop. 
// although it is easier to with for loop and iterator... 
int i = 0; 
int noOfVowels = 0; 
while (i < inputString.length()) { 
    if (inputString[i] == 'a' 
      || inputString[i] == 'e' 
      || inputString[i] == 'i' 
      || inputString[i] == 'o' 
      || inputString[i] == 'u') { 
     ++noOfVowels; 
    } 

    ++i; 
} 
std::cout << "number of vowels : " << noOfVowels << std::endl; 
0

Ну, вы можете попробовать этот подход. Это решит ваши потребности, я думаю.

#include <iostream> 
#include <string> 
#include <sstream> 
#include <conio.h> 
using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int number=0; 
    int zeros=0; 
    int ones=0; 
    int twos=0; 
    int threes=0; 
    int fours=0; 
    bool valid=true;; 
    int counter = 0; 



    cout<<"Enter the number: "; 
    cin >> number; 
    stringstream out; 
    out << number; //int to string 
    string numberString = out.str(); 
    cout<<"\n\nNumber after string conversion : "<<numberString; 
    cout<<"\nPrinting this just to show that the conversion was successful\n\n\n"; 




    while (counter < numberString.length()) 
    { 
     if (numberString[counter] == '0') 
      zeros++; 
     else if(numberString[counter] == '1') 
      ones++; 
     else if(numberString[counter] == '2') 
      twos++; 
     else if(numberString[counter] == '3') 
      threes++; 
     else if(numberString[counter] == '4') 
      fours++; 
     else 
      valid=false; 
     counter++; 
    } 

     if(valid==true) 
     { 
      cout<<"\nZeros : "<<zeros; 
      cout<<"\nOnes : "<<ones; 
      cout<<"\nTwos : "<<twos; 
      cout<<"\nThrees : "<<threes; 
      cout<<"\nFours : "<<fours; 
     } 
     else 
      cout<<"\n\nInvalid data...base of 5 rule violated"; 


    _getch(); 
    return 0; 
} 
0

Если вы не хотите использовать std :: string, то используйте символы, первый цикл над входом от пользователя до нажатия ENTER.

char ch = 0; 
while ((ch = cin.get()) != '\n') 
{ 
... 
} 

Для каждого символа чтения, проверьте, если это цифра (станд :: isdigit), и если он находится в диапазоне 0..4, если не бросить курить и дать какое-то сообщение не быть базой 5

есть массив целых чисел, чтобы следить за частотой разрядов

int freq[5] = {0,0,0,0,0}; 

после того, как вы проверили, что символ является действительным вычесть значение ASCII из цифр и использовать его в качестве индекса в массиве, приращения, что :

freq[ch - '0']++; 

, например.

char ch; 
int freq[5] = {0}; 
while ((ch = cin.get()) != '\n') 
{ 
    cout << ch; 
    freq[ch-'0']++; 
} 
for (int i = 0; i < sizeof(freq)/sizeof(freq[0]); ++i) 
{ 
    cout << static_cast<char>(48+i) << ":" << freq[i] << endl; 
} 
0

Вот полезная функция, которая подсчитывает цифры:

// D returns the number of times 'd' appears as a digit of n. 
// May not work for n = INT_MIN. 
int D(int n, int d) { 
    // Special case if we're counting zeros of 0. 
    if (n == 0 && d == 0) return 1; 
    if (n < 0) n = -n; 
    int r = 0; 
    while (n) { 
     if (n % 10 == d) r++; 
     n /= 10; 
    } 
    return r; 
} 

В своем коде вы можете использовать это наивно, чтобы решить эту проблему без каких-либо дополнительных петель.

if (D(n, 5) + D(n, 6) + D(n, 7) + D(n, 8) + D(n, 9) != 0) { 
    cout << "the number doesn't consist only of the digits 0..4." 
} 
cout << "0s: " << D(n, 0) << "\n"; 
cout << "1s: " << D(n, 1) << "\n"; 
cout << "2s: " << D(n, 2) << "\n"; 
cout << "3s: " << D(n, 3) << "\n"; 
cout << "4s: " << D(n, 4) << "\n"; 

Вы также можете (или должны также) использовать контуры для уменьшения избыточности.

+0

Я, кажется, решил все свои проблемы, кроме как получить LNK2019 (неразрешенный внешний символ) и LNK1120. Мне не хватает библиотеки для использования функции D (базовая 5)? –

+0

Я не уверен, что вы спрашиваете: код для ответа D находится в ответе. –

Смежные вопросы