logo
0 anonymous
Views: 1269135 Challenges: 342
Users: 12684 Online: 0

Learning C++ – 4 Posts

  • 10/16/2024 13:00
    moose's Avatar moose 00
    Not SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot Specified
    Hi,

    I thought it's time to me to learn C++. To train, I've took a look at TopCoder and just found this exercise ( SRM 100 - Motorola Single Round Match 100 Round 1 - Division II, Level One, \"link\"Link):
    Problem Statement
        	A letter-string is composed of letters ('A'-'Z','a'-'z') and dashes ('-'). The length of a letter-string is the number of characters in it not including dashes (in other words, the number of letters in the string). Given a list of letter-strings you will return the sum of their lengths. 
    
    
    
    Create a class LetterStrings that contains the method sum, which takes a String[], s, and returns an int representing the sum of the lengths of the given letter-strings.
     
    Definition
        	
    Class:	LetterStrings
    Method:	sum
    Parameters:	String[]
    Returns:	int
    Method signature:	int sum(String[] s)
    (be sure your method is public)
        
     
    Constraints
    -	s will contain between 1 and 50 elements, inclusive.
    -	Each element of s will have length between 1 and 50, inclusive.
    -	Each element of s will contain only letters ('A'-'Z','a'-'z') and dashes ('-').
     
    Examples
    0)	
        	
    {\"-\"}
    Returns: 0
    1)	
        	
    {\"A\"}
    Returns: 1
    2)	
        	
    {\"-----Abc\"}
    Returns: 3
    3)	
        	
    {\"-A-B-C-D\", \"--------EFGHI\", \"JKLMNOPQR\", \"---STU-VW-XYZ\"}
    Returns: 26


    Now I've created this piece of code:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class LetterStrings {
        public:
            int sum(string s[]);
    };
    
    int LetterStrings::sum(string s[])
    {
        int summe = 0;
        for(int el=0; s[el] != \"0\"; el++){
            for(int i=0; i < s[el].length(); i++){
                if( isalpha(s[el][i]) ) {
                    summe += 1;
                }
            }
        }
      return summe;
    }
    
    int main()
    {
        LetterStrings a, b;
        string str[5] = {\"-A-B-C-D\", \"--------EFGHI\", \"JKLMNOPQR\", \"---STU-VW-XYZ\"};
        cout << a.sum(str) << endl;
    }


    It seems to work, but I'm not quite sure if it fits the requirements (Method signature: int sum(String[] s)?)

    What could be done better in this code?

    edit: Just found the \"link\"statistics with the top-solution:
    #include <string>
    #include <vector>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <cmath>
    #include <cctype>
    #include <cstdio>
    #include <utility>
    using namespace std;
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #define VI vector<int>
    #define VVI vector<vector<int> >
    #define VS vector<string>
    #define si size()
    #define len length()
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    class LetterStrings
    {
      public:
      int sum(vector <string> s)
      {
        int ret=0;
        for(int c=0;c<s.si;c++)
          for(int d=0;d<s[c].len;d++)
            if(isalpha(s[c][d]))
              ret++;
        return ret;
      }
    };
     
    // Powered by PopsEdit

    isalpha is obviously better then my check via ASCII-Table codes (I've edited my solution), but the top-solutions seems to include quite a lot which isn't needed.
  • 10/16/2024 13:00
    dloser's Avatar dloser 00
    Not SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot Specified
    Hi moose,

    \"Quote\"Quote from moose:
    I thought it's time to me to learn C++.

    Oh boy... \";)\"

    \"Quote\"Quote:

    It seems to work, but I'm not quite sure if it fits the requirements (Method signature: int sum(String[] s)?)

    I suspect the exercise was made with Java in mind. For C++ using vector is probably closest to String[], both being classes with similar methods.

    \"Quote\"Quote:

    What could be done better in this code?

    \"Quote\"Quote:

    class LetterStrings {
        public:
            int sum(string s[]);
    };
    


    The whole class thing is probably just because of Java, but in any case making the method sum static would be appropriate here, I think.

    \"Quote\"Quote:

        int summe = 0;
    


    Not sticking with English... \":P\" (Sorry.)

    \"Quote\"Quote:

        for(int el=0; s[el] != \"0\"; el++){
    


    Just using \"\" here would work as well. Nevertheless it shows that the whole string[] business makes things ugly. For example, an empty string in the input cuts the program short. Using just char*[] (or even string*[], ugh) at least allows you to end the array with NULL (which is distinct from \"\").

    \"Quote\"Quote:

        LetterStrings a, b;
    


    Nitpicking: unused b.

    \"Quote\"Quote:

    isalpha is obviously better then my check via ASCII-Table codes (I've edited my solution), but the top-solutions seems to include quite a lot which isn't needed.

    Yeah, I think that's just a bunch of standard stuff that author includes in every file.
  • 10/16/2024 13:00
    moose's Avatar moose 00
    Not SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot Specified
    Thanks.

    Now my next questions:
    As a python programmer I'm used to have integers which are always as big as I need them. In C++ the biggist \"standard int\" type seems to be \"unsigned long long\" which is in [0;9223372036854775807] which is [0;2^63-1].
    What do I do if I need longer integer types?

    How do I convert an unsigned long long to a string?
  • 10/16/2024 13:00
    dloser's Avatar dloser 00
    Not SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot SpecifiedNot Specified
    You'll probably want to use one of the available libraries for that (e.g. \"link\"GMP).