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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.