Профил
Loading...
+ Нов въпрос
itonev avatar itonev 22 Точки

Код по първа задача

Здравейте,

Кодът ми работи за текстове на латиница.

Например за ATb3  ще покаже две главни букви една малка и един друг символ. Тоест тройката

При кирилица не отчита малки главни, всичко го брои като други символи

При вас как е кирилицата ?

#include <iostream>
#include <map>
#include <string>
#include <ctype.h>

int main()
{
    std::string UserInput = "";

    std::cout << "Please, input string >>";
    std::getline(std::cin,UserInput);
    std::cout << "You Enter:" << UserInput;

    std::map<std::string,unsigned int> Counters;

    Counters["upper"] = 0;
    Counters["lower"] = 0;
    Counters["other"] = 0;

    unsigned int len = UserInput.length();

    for(unsigned int i=0;i<len;i++)
    {
      if ( islower(UserInput[i]) )
      {
         Counters["lower"]++;
      }
      else if ( isupper(UserInput[i]) )
      {
         Counters["upper"]++;
      }
      else
      {
          Counters["other"]++;
      }
    }

    std::cout << std::endl << "Uppers: " << Counters["upper"] << std::endl;
    std::cout << std::endl << "Lowers: " << Counters["lower"] << std::endl;
    std::cout << std::endl << "Other:" << Counters["other"] << std::endl;

    return 0;

}


 

1
C++ Programming
Lirik avatar Lirik 22 Точки

Да и аз не съм имплементирал кирилица в кода си, най-вече защото вече съм решавал проблем от такъв характер.

Ето и кратко резюме на едно възможно решение.

https://www.youtube.com/watch?v=HAn3Tr40OSY

Не съм убеден че това е единствено възможно решение, но е работещо?

 

Да имате шаблон за това как се тества само клас, примерно решаващ тази задача с:

https://github.com/onqtam/doctest

0
04/06/2016 14:58:10
itonev avatar itonev 22 Точки

Не знам. Не съм ползвал такива библиотеки.

Благодаря, ще погледна видеото.

0
itonev avatar itonev 22 Точки

Аз съм под Линукс. Това решение си е май за уиндоус.
Нямам проблем с печатането и четенето на кирилица, но функциите за проверка на малки/главни букви не работи с кирилица...

Иначе ми беше интересно да видя каk се прави за  Win.

0
Lirik avatar Lirik 22 Точки

За стрингове с кирилица компилирах за GNU C+11 и извежда правилния отговор 3.

Ето го и примера:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string s = "ЖорЖИ";
    int cntUpper = 0 ;
    for (int k=0; k<=s.length(); k++)
        if ((s[k]>='А' && s[k]<='Я') || ((s[k]>='A' && s[k]<='Z')))
            ++cntUpper ;
    cout <<cntUpper ;
    return 0;
}

 

0
04/06/2016 19:23:26
itonev avatar itonev 22 Точки

Изкарва 0 при мен.

GCC 4.8.6 LInux 64 bit

0
Lirik avatar Lirik 22 Точки

GCC 4.9.2 64 bit, -std GNU C++11

Win 10, 64 bit

Работи OK.

 

Запазил ли си source с encoding допукащ кирилица?

 

 

0
itonev avatar itonev 22 Точки

Qt Creator UTF-8  ползвам.

Очевадно за да изкарва нула не влиза в  if-a

По-късно ще пробвам и под  win

0
Lirik avatar Lirik 22 Точки

Така ремонтиран кодът правилно брои кирилица под Win 10x64, GNU GCC 4.9.2 64 bit Release, ISO C++11

 

#include <iostream>
#include <map>
#include <string>
#include <ctype.h>
#include <locale>
#include <windows.h>
using namespace std;
string fromDos (string dosString)
{
    char buf[1000000] ;
    OemToCharA(dosString.c_str(), buf) ; // windows.h
    return buf ;
}

int main()
{
    setlocale (LC_ALL, "bulgarian") ;
    std::string UserInput = "";

    std::cout << "Please, input string >>";
    std::getline(std::cin,UserInput);
    UserInput = fromDos(UserInput) ;
    std::cout << "You Enter:" << UserInput;

    std::map<std::string,unsigned int> Counters;

    Counters["upper"] = 0;
    Counters["lower"] = 0;
    Counters["other"] = 0;

    unsigned int len = UserInput.length();

    for(unsigned int i=0;i<len;i++)
    {
      if ( islower(UserInput[i]) )
      {
         Counters["lower"]++;
      }
      else if ( isupper(UserInput[i]) )
      {
         Counters["upper"]++;
      }
      else
      {
          Counters["other"]++;
      }
    }

    std::cout << std::endl << "Uppers: " << Counters["upper"] << std::endl;
    std::cout << std::endl << "Lowers: " << Counters["lower"] << std::endl;
    std::cout << std::endl << "Other:" << Counters["other"] << std::endl;

    return 0;

}
 

0
itonev avatar itonev 22 Точки

Неочаквано ми се скапа виртуалката.

Ще тествам след преинсталация.

0
itonev avatar itonev 22 Точки

Изход програма:

cprog@CPROG-PC C:\Users\cprog\.CLion2016.1\system\cmake\generated\CountCharsCyr-
754308f3\754308f3\Debug                                                         
> CountCharsCyr.exe                                                             
Please, input string >>Тонев                                                    
You Enter:?????                                                                 
Uppers: 0                                                                       
                                                                                
Lowers: 0                                                                       
                                                                                
Other:5                                                                         
                                                                                

Версия компилатор:

> gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/5.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-5.1.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 5.1.0 (tdm64-1)

На windows 7 64 бита

Просто функциите  islower  isupper  не работят с кирлица

Те трябва да се променят или да са други, че дастане

0
Lirik avatar Lirik 22 Точки

Win10x64, TDM-GCC-4.9.2 64 bit Release ISO C++11

 

1
PeterIvanovJivkov avatar PeterIvanovJivkov 0 Точки

Можеш да добавиш проверка за празно място, защото ще ти го сметне за символ иначе. 

0
05/06/2016 18:37:51
itonev avatar itonev 22 Точки

Принципно си прав. Такава проверка даже е лесно да се добави. Все пак в конкретния случай мисля да уважава интервала като символ, пък макар и невидим. :) Но принципно ако изрично кажат, да , ще трябва.

0