ABAP, ActionScript, Ada, ADSO/IDSM, AMPLE, ant, Apex Trigger, Arduino Sketch, ASP, ASP.NET, Assembly, autohotkey, awk, blank, Bourne Again Shell, Bourne Shell, C, C shell, c#, C++, C/C++ Header, C:\Windows, CCS, choco, chocolatey, cloc, cloc-1.62.exe, cloc-1.62.pl, cloc.exe, Clojure, ClojureScript, cmake, COBOL, CODE, CoffeeScript, coldfusion, ColdFusion CFScript, COMMENT, css, CUDA, cython, d, Dal, dart, DOS Batch, dtd, ECPP, erlang, expect, F#, focus, fortran 77, Fortran 90, fortran 95, Go, Grails, Groovy, Haml, Handlebars, harbour, Haskell, HLSL, HTML, IDL, install, InstallShield, Java, javascript, JavaServer Faces, JCL, JSON, jsp, kermit, Korn Shell, Kotlin, less, LEX, LISP, Lisp/OpenCL, LiveLink OScript, LUA, M4, make, matlab, maven, Modula3, MSBuild script, mumps, Mustache, MXML, NAnt script, NASTRAN DMAP, Objective C, Objective C++, Ocaml, Oracle Forms, oracle reports, pascal, Pascal/Puppet, Path, Patran Command Language, perl, php, PHP/Pascal, Pig Latin, PL/I, PowerShell, python, QML, r, Racket, Razor, Rexx, RobotFramework, ruby, Ruby HTML, rust, SASS, Scala, sed, Skill, SKILL++, SMARTY, Softbridge Basic, sourceforge, SQL, SQL Data, SQL Stored Procedure, strip-comments, Swift, Tcl/Tk, Teamcenter met, Teamcenter mth, TypeScript, Unity-Prefab, Vala, Vala Header, Velocity Template Language, Verilog-SystemVerilog, VHDL, vim script, Visual Basic, Visualforce Component, Visualforce Page, Windows Message File, Windows Module Definition, Windows Resource File, WiX include, WiX source, WiX string localization, XAML, xBase, xBase Header, xml, xquery, xsd, XSLT, yacc, YAML, 라인수, 코드

이전 포스팅에서 powershell 을 사용한 코드 라인수 세기 방식에 대해 소개한 적이 있는데요~

 

http://iamaman.tistory.com/1577

 

검색을 해보니 역시나…… cloc 라는 프로그램이 있더군요.

 

cloc 의 홈 페이지는 아래와 같습니다.

 

http://cloc.sourceforge.net/

 

또는 이전에 소개했던 Chocolatey 을 사용하여 아래와 같이 설치 할 수 도 있더군요.

 

choco install cloc

 

다운로드 주소는 아래와 같습니다.

 

http://sourceforge.net/projects/cloc/files/cloc/


현재 최신 버전은 1.62 입니다.

 

 

현재 저는 윈도우 64비트를 사용 중이라 위 그림과 같은 페이지에서 cloc-1.62.exe 을 다운로드 받았습니다.


Perl 에 관심이 있는 분들은 cloc-1.62.pl 파일을 다운로드 받아서 소스를 살펴보는 것도 좋은 공부가 될 듯 하네요.

 

다운로드 받은 cloc-1.62.exe 파일을 cloc.exe 라는 이름의 심볼릭 링크로 해서 C:\Windows 와 같이 path 로 설정된 폴더에 넣거나 cloc.exe 로 파일명을 변경 한 후에 path 로 설정된 폴더에 넣습니다.

 

사용법은 굉장히 간단한데요~

 

CMD 창을 연 다음 아래 그림과 같이 cloc 파일명을 넣어 주고 엔터를 때리면~ 각 확장자 별로 code, blank, comment 줄 수 별로 카운트를 해서 목록으로 알려 줍니다.

 

 

위에 그림은 C++ 파일과 헤더 파일 MATLAB 파일의 Code, Blank, Comment 줄 수를 나타내 주는 것을 확인 할 수 있습니다. cloc 는 아래 주소에서 확인 할 수 있는 바와 같이 정말 다양한 언어에 대해 줄 수를 파악해 줍니다.

 

http://cloc.sourceforge.net/#Languages

 

ABAP, ActionScript, Ada, ADSO/IDSM, AMPLE, Ant, Apex Trigger, Arduino Sketch, ASP, ASP.Net, Assembly, AutoHotkey, awk, Bourne Again Shell, Bourne Shell, C, C Shell, C#, C++, C/C++ Header, CCS, Clojure, ClojureScript, CMake, COBOL, CoffeeScript, ColdFusion, ColdFusion CFScript, CSS, CUDA, Cython, D, DAL, Dart, DOS Batch, DTD, ECPP, Erlang, Expect, F#, Focus, Fortran 77, Fortran 90, Fortran 95, Go, Grails, Groovy, Haml, Handlebars, Harbour, Haskell, HLSL, HTML, IDL, InstallShield, Java, Javascript, JavaServer Faces, JCL, JSON, JSP, Kermit, Korn Shell, Kotlin, LESS, lex, Lisp, Lisp/OpenCL, LiveLink OScript, Lua, m4, make, MATLAB, Maven, Modula3, MSBuild script, MUMPS, Mustache, MXML, NAnt script, NASTRAN DMAP, Objective C, Objective C++, OCaml, Oracle Forms, Oracle Reports, Pascal, Pascal/Puppet, Patran Command Language, Perl, PHP, PHP/Pascal, Pig Latin, PL/I, PowerShell, Python, QML, R, Racket, Razor, Rexx, RobotFramework, Ruby, Ruby HTML, Rust, SASS, Scala, sed, SKILL, SKILL++, Smarty, Softbridge Basic, SQL, SQL Data, SQL Stored Procedure, Swift, Tcl/Tk, Teamcenter met, Teamcenter mth, TypeScript, Unity-Prefab, Vala, Vala Header, Velocity Template Language, Verilog-SystemVerilog, VHDL, vim script, Visual Basic, Visualforce Component, Visualforce Page, Windows Message File, Windows Module Definition, Windows Resource File, WiX include, WiX source, WiX string localization, XAML, xBase, xBase Header, XML, XQuery, XSD, XSLT, yacc, YAML

 

--strip-comments 같은 옵션을 사용하면 comment 을 지울 수도 있더군요. 외부에 코드를 보낼 때 종종 활용하게 될 것 같네요.


이전 포스팅에서 C++, MATLAB 을 사용하여 Cartesian Product 를 구하는 방법에 대해 알아본 적이 있습니다.



2013/08/18 - [programming language/MATLAB] - MATLAB 모든 경우의 수 뽑기 Cartesian Product


2014/03/01 - [programming language/C/C++] - C++ Cartesian Product


2013/08/18 - [programming language/powershell] - Powershell 경우의 수 조합 다 구하기(Cartesian Product)


 

이번에는 python 에서 Cartesian Product 를 구하는 방법에 대해 확인해 보니 이전의 방법들 보다 훨씬 더 쉽더군요.

 

아래 주소에 그 방법이 나와 있었습니다.

 

http://stackoverflow.com/questions/9101101/python-cartesian-product

 

itertools.product() 함수를 사용하는 방식이며 Document 는 아래 주소에서 확인 할 수 있습니다.

 

https://docs.python.org/2/library/itertools.html#itertools.product

 


다음과 같은 결과가 나옵니다.

 

bad

baf

bed

bef

cad

caf

ced

cef


프로그래밍을 하다 보면 파일 또는 폴더의 path 를 자주 다루게 됩니다.

 

아래 포스팅에서는 Autohotkey 에서 SplitPath 함수를 사용해서 file path 를 구분하는 방법에 대해 소개한 적이 있는데~

  

2013/11/14 - [programming language/Autohotkey] - Autohotkey SplitPath 를 이용하여 폴더, 파일명, 확장자, 드라이브 구분하기

 

오늘은 C++ 를 사용한 file path 구분 방법에 대해 소개하려 합니다.

 

코드는 굉장히 간단한데요~

 

위 코드와 같이 stringstream 과 getline 함수를 사용하고~

 

C:/Windows/System32/vbscript.dll 라는 path 를 '/' 에 따라 나눠보면~

 

다음과 같은 결과가 나옵니다. 다음 그림에서 보는 바와 같이 C:, Windows, System32, vbscript.dll 로 구분되는 것을 확인 할 수 있습니다.



이전 포스팅들에서도 소개한 Cartesian Product 를 C++ 를 사용하여 구성하는 방법에 대해 소개해 드리려 합니다.

  

2013/08/18 - [programming language/MATLAB] - MATLAB 모든 경우의 수 뽑기 Cartesian Product


2013/08/18 - [programming language/powershell] - Powershell 경우의 수 조합 다 구하기(Cartesian Product)

 

아래 주소를 보니 Cartesian Product 와 관련하여 좋은 예제들이 많이 있더군요.

 

http://stackoverflow.com/questions/5279051/how-can-i-create-cartesian-product-of-vector-of-vectors

 

그 중에서 저는 가장 간단해 보이는 anumi 라는 분의 코드를 가져다 사용했습니다.

 

물론 template 형태로 약간 수정만 했습니다.

 

코드를 보다 보니 vector 의 swap 함수를 사용했더군요. Swap 함수는 말 그대로 벡터간에 값을 교환하는 겁니다.

 

Vector 의 Swap 에 대한 설명은 아래 주소 참조바랍니다.

 

http://www.cplusplus.com/reference/vector/vector/swap/

 

요즘 C++ STL 은 정말 좋은 것 같습니다.

 

결과적으로 작성된 cartesian.h 파일은 아래와 같습니다. 

  

cartesian.h


#include <vector>

 

using namespace std;

 

template<typename T>

vector<vector<T>> cart_product (const vector<vector<T>>& v) {

vector<vector<T>> s = {{}};

for (auto& u : v) {

vector<vector<T>> r;

for (auto& x : s) {

for (auto y : u) {

r.push_back(x);

r.back().push_back(y);

}

}

s.swap(r);

}

return s;

}

 

테스트를 위한 main.cpp 파일은 아래와 같이 작성했습니다.

 

#include <iostream>

#include "cartesian.h"

 

using namespace std;

 

int main()

{

    vector<vector<int>> test{{1,2, 56 ,3}, {4,5,6}, {12,32,56}};

    vector<vector<int>> cartprodResult; // result

 

    cartprodResult=cart_product(test); // Cartesian Product

 

    int cnt=0;

 

    for (auto& x : cartprodResult)

    {

        ++cnt;

        cout << cnt << ": \t";

 

        for (auto y : x)

        {

            cout << y << "\t";

        }

        cout << endl;

    }

 

    return 0;

}

 

Cartesian product 를 수행해보면 아래와 같이 결과가 나오는 것을 확인 할 수 있습니다. 간단하죠~ 현재 컴파일러는 gcc (tdm64-2) 4.8.1 이고~ C++11 Compiler Flag를 On 했습니다.



오늘은 간단하게 사용할 수 있는 C++ xml parser 하나 소개해 드리려 합니다.

 

Xml parser 라이브러리의 이름은 pugixml 이고요~

 

아래 주소에서 다운로드 가능합니다.

 

https://code.google.com/p/pugixml/downloads/list

 

다음 그림과 같이 편하실데로~ zip 또는 tar.gz 파일을 다운로드 받으면 됩니다. 저는 현재 최신버전인 1.2 버전의 zip 파일 버전인 pugixml-1.2.zip 을 다운로드 받았습니다.

 

압축을 해제하면 src,scripts,docs,contrib 폴더로 구성되는데요~ 이 중에서 src 폴더가 라이브러리 소스 파일입니다.

 

Xml 을 사용하고자 하는 폴더에 src 폴더의 pugixml.hpp, pugixml.cpp, pugiconfig.hpp 파일들을 추가한 후에 사용하시면 되겠습니다.

 

pugixml-1.2\docs\samples 에는 다양한 예제들이 있는데요~ 저는 xml 파일에 대한 load 부분만 필요해서 load_file.cpp 파일을 사용했습니다.

 

프로젝트에 pugixml.hpp, pugixml.cpp, pugiconfig.hpp, load_file.cpp파일을 추가하고 load_file.cpp 에서 사용하는 tree.xml 파일도 추가 해 줍니다.

 

다음으로 빌드를 하고 실행해 보면~ 다음과 tree.xml파일의 mesh 노드의 name attribute 의 내용인 mesh_root 를 선택적으로 읽어 올 수 있는 것을 확인 할 수 있습니다.

 

라이브러리가 파일만 추가하면 되서 사용하기 쉽고 사용법도 매우 편하네요~

 

속도 등에 대한 테스트는 안 해 봤지만 간단한 용도로 사용하는 제 입장에서는 대 만족이네요.

 

위에 예제로 사용한 codeblock 프로젝트 파일도 추가 합니다.

 


xmltest.zip



  1. Ok Man 2014.06.25 23:58 신고

    컴퓨터 언어 공부는 어렵지 않나요? 저도 공부해보고싶긴한데..

    • 남성 2014.06.26 00:39 신고

      하고 싶은데 어려울까봐 안하시는 건가요? 두려워 말고 시작해 보세요~ 꼭 프로그래머가 되려고 하는게 아니더라도 컴퓨터 언어 공부는 어느정도 필요하다고 봅니다. 요즘은 컴퓨터 교육이 아이들 교과과정에도 포함되고있는 추세죠~ 어차피 컴퓨터는 죽을때 까지 사용하잖아요. 간단한 스크립트 언어부터 시작해 보세요. 삶이 달라지실 거에여~ 블로그 운영에도 도움 되실 거에여~ 윈도우만 사용하신 다면 제 블로그에서도 소개하고 있는 Autohotkey 강추 드립니다.

  2. Ok Man 2014.06.26 02:16 신고

    아 그래요? 블로그 자주 들릴게요 기초적인것부터 차근차근 많이 알려주세요 ^^ 저도 예전부터 컴퓨터 언어에 대해서
    잠시나마 비쥬얼베이직은 배운적이 있지만 제대로 배워본적은 없어서 ㅎㅎ 자주 들릴게요 좋은정보 감사해요!!

    • 남성 2014.06.26 02:41 신고

      실제 그냥 윈도우 사용하는데는 비쥬얼 베이직은 그리 실용적이진 않은데~ Autohotkey 는 정말 실용적이거든요

프로그래밍을 배우면서 아마도 가장 처음 접하게 되는 알고리즘이 바로 정렬 알고리즘이 아닌가 생각되네요.

 

C++ 에서는 algorithm 헤더에 sort, stable_sort, partial_sort 와 같은 함수들이 정의되어 있습니다.

 

C++ STL 이 참 좋긴 하더군요. ㅋㅋㅋㅋ

 

partial_sort 는 말 그대로 일부를 정렬하겠다는 거로 이해하시면 될 것 같고

 

저는 처음에 sort 와 stable_sort 가 좀 헷갈리더군요. 무슨 차이일까… 하고요.

 

차이는 간단한데요. 동일한 값이 있을 경우 stable_sort 의 경우에는 정렬 하기 전의 순서가 정렬후에도 유지된다고 하더군요.

 

위 함수들의 사용법 등에 대해서는 아래 주소의 예제들을 참조하시면 쉽게 이해하실 겁니다.

 

http://www.cplusplus.com/reference/algorithm/sort/

http://www.cplusplus.com/reference/algorithm/stable_sort/

http://www.cplusplus.com/reference/algorithm/partial_sort/

 

저는 오늘 MATLAB 의 sort() 결과와 마찬가지로 정렬 결과 뿐만 아니라 인덱스도 정렬되어 나올 수 있도록 구성해 보도록 하겠습니다.

 

C++ 에서는 이런 경우 인덱스와 값을 pair 로 묶은 후에 정렬하는 방법이 있더군요.

 

예제는 다음과 같습니다. 아래 예제처럼 comparator 만 오름 차순 내림 차순에 따라 잘 설정하면 되더군요.

 

#include <iostream>

#include <vector>

#include <algorithm>

#include <random>

#include <ctime>

 

 

using namespace std;

 

 

#define N_SIZE (10)

 

 

typedef std::pair<int,int> int_int_pair;

 

bool comparator ( const int_int_pair& l, const int_int_pair& r) // 첫번째 값을 기준으로 내림차순 비교하는 comparator

{

return l.first > r.first;

}

 

 

 

int main()

{

vector<int_int_pair> A; // vector setting

 

srand( unsigned(time (NULL)));

 

for (int i=0; i<N_SIZE ; i++)

{

A.push_back(int_int_pair(i,i)); // (value, index) setting

}

 

random_shuffle(A.begin(), A.end()); // 마구 마구 섞기

 

 

cout << "정렬전\nValue\tIndex\n" ;

 

for (int i=0; i<N_SIZE ; i++) // 섞인거 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

cout << "\n\n" ;

 

 

stable_sort(A.begin(),A.end(), comparator); // 정렬 하기

 

cout << "정렬후\nValue\tIndex\n" ;

for (int i=0; i<N_SIZE ; i++) // 정렬됐나 확인하기

{

cout << A[i].first << "\t" << A[i].second << endl;

}

 

return 0;

}

 

위 코드에 따라 다음과 같이 내림 차순 정렬 되게 됩니다.





  1. 종이눈 2018.04.25 12:40

    감사합니다^^ 인덱스 정렬에 내림차순까지 제가 필요했던게 전부 들어있네요

    • 남성 2018.04.25 19:12 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

C/C++ 프로그래밍에 대한 기존의 제 선입견은 코드량이 많다 입니다.

실행 속도가 다른 언어들 보다 훨씬 빠르지만~

하나하나 짜려면 그 라인 수가 너무 많아서 생산성이 그리 좋지 못하다는 선입견이죠.

그런데 요즘 C++ 의 변화를 보고 있으면 그 변화가 눈부시다는 생각이 들더군요.

C++ 코딩을 하면서 종종 참조하는 사이트인데~ 들어가면 각종 라이브러리나 함수에 대한 정의 및 예제, C++ Tutorial, C++ 역사 등등 C++ 과 관련한 정말 다양한 정보를 얻을 수 있는 사이트 입니다.

 

http://www.cplusplus.com

 

그런데 위 사이트에서 돌아다니다 보면 C++11 이라는 것들이 눈에 띄더군요.

뭔가 해서 보니 2011 년 9월에 만들어진 C++ 표준이라서 C++11 이라고 한다네요.

아래 주소에는 Alex Allain 이라는분이 C++11 에 대해 소개한 내용입니다.

 

http://www.cprogramming.com/c++11/what-is-c++0x.html

 

auto 라는 대단히 편리한 키워드가 눈에 띄더군요. 또한 기존에 nested 형태로 STL 들을 정의 할 때 아래 코드의 빨간색 부분처럼 닫는 Angle Brackets 을 띄어 써야 했었는데 ~~ 아마도 right shift 와 구분이 잘 안돼서 그랬던 듯 ~

 

vector<vector<int> > vector_of_int_vectors;

 

C++11 에서는 이러한 불편함도 수정되서 아래 예처럼 그냥 붙여 쓸 수 있습니다.

 

vector<vector<int>> vector_of_int_vectors;

 

Python에서 보았던 Tuple 이나 Lambda Functions 등도 지원을 하더군요.

 

http://www.cprogramming.com/c++11/c++11-lambda-closures.html

 

C++ 의 다양한 변화에 탄복하다가 Numerics library 의 Pseudo-random number generation 이라는 부분에 눈길이 가더군요.

기존에 C/C++ 에서는 rand() 라는 uniform random number generator 만 제공을 해 줬었죠.


다른 분포 특성들은 이 rand() 함수를 이용해서 알고리즘을 다 이해한 후 하나 하나 작성해야 했습니다.

아래 포스팅에 썼던 것처럼 말이죠. 


2012/01/02 - [컴퓨터일반] - Gaussian Random Variable generation C code


 

 

그런데 C++11 의 Pseudo-random number generation 이 생긴 이후로는 그럴 필요가 없어졌습니다.

 

http://www.cplusplus.com/reference/std/random/


 

위 주소를 보면 아래와 같이 다양한 분포 특성에 대한 생성 함수를 제공해 준다는 것을 알 수 있습니다.

 

우리가 흔히 정규분포라고 얘기하는 Normal(Gaussian) 분포에서부터~ Uniform discrete, Uniform real, Bernoulli, Binomial, Geometric, Negative binomial, Poisson, Exponential, Gamma, Weibull, Extreme Value, Lognormal, Chi-squared, Cauchy, Fisher F, Student T, Discrete, Piecewise constant, Piecewise linear 까지~~ 간단하게 생성 할 수 있습니다.

 

무지하게 편리하겠죠~

 

C++11 너무 써보고 싶어서 간단하게 Gaussian generation 을 해 봤습니다. 아래 주소의 예제 참조 했구요~ 약간 수정했습니다.

 

http://www.cplusplus.com/reference/std/random/normal_distribution/

 

C++11 은 최신의 표준이니 만큼 최신의 컴파일러를 설치해야 되더군요. 저는 GCC 4.7.1 버전을 설치 했습니다. 아래 주소에서 다운로드 받았구요~

 

http://nuwen.net/mingw.html

 

Stephan T. Lavavej 라는 분의 개인 홈피인데~ 마이크로 소프트에서 일한다는 군요 ㅋㅋㅋ Thank you~~~

 

어쨌든 GCC 최신 버전을 설치하고 평균이 5 이고 표준 편차가 4 인 Gaussian random number 를 생성해 봤습니다.

 

코드는 다음과 같습니다.

 

#include <iostream>

#include <iomanip>

#include <string>

#include <map>

#include <random>

#include <cmath>

 

using namespace std;

 

int main()

{

    default_random_engine generator;            // generator 생성

    normal_distribution<double> distribution(5.0,4.0);

 

    map<int, int> hist;            // hostogram 을 그리기 위한 버퍼

    for(int n=0; n<5000000; ++n) {

        ++hist[std::round(distribution(generator))];            // histogram buffering

    }

 

    for(auto p : hist) {                        // * 로 나타내기

        std::cout << std::fixed << std::setprecision(1) << std::setw(2)

            << p.first << ' ' << std::string(p.second/25000, '*') << '\n';

    }

    getchar();                // 결과 창이 없어지지 않게 하기 위함

    return 0;

}

 

위 코드를 돌려 보면~ 아래와 같이 나오더군요~ 많이 본~~ 정규 분포를 세워 놓은 모양이죠? 위에 보시는 바와 같이 코드량이 정말 짧더군요.




 

C++11 강추입니다.


MATLAB 을 사용해본 분들은 아시겠지만, MATLAB 의 배열 인덱스는 1부터 시작 합니다.

 

그런데 C 나 그 밖의 컴퓨터 언어들의 배열 인덱스는 보통 0에서부터 시작을 하죠.

 

모듈로 같은 연산을 할 때는 0 부터 시작하는게 편하지만 그 밖의 몇가지 수학적인 연산에 이용되는 배열의 경우 1 에서부터 시작하는 게 편리 할 때도 있는데요.

 

이런 경우에 C/C++ 에서 동적 할당을 이용하여 배열을 만드는 방법에 대해 설명 드리려 합니다.

 

지난 포스팅에서 다차원 배열을 할당 할 때 calloc() 을 사용하여 배열을 할당했는데요.

 

 

2011/10/05 - [컴퓨터일반] - C 언어 이차원 동적 배열


 

다음과 같이 할당한 포인터에 -1 만큼 옵셋을 주면 배열의 인덱스를 1부터 n 까지로 이용 할 수 있습니다.

 

int n;

Int * Arr; // 배열에 대한 포인터 선언

Arr=(int *)calloc(n , sizeof(int));     // calloc() 함수 이용 동적 배열 선언, n은 배열의 크기

--Arr;             // 포인터에 -1만큼 옵셋을 줘서 Arr[1], Arr[2]… Arr[n] 등으로 각 인자의 값에 접근

 

free(Arr+1);         // -1 만큼 옵셋을 줬으므로 +1 을 해서 동적 배열을 해제 해 준다.



argc, argv, C, C++

C / C++ 의 함수 사용시 Argument 를 적절히 사용하는 것은 너무나 당연합니다.

 

그런데 저는 C/C++ 코딩을 한지는 한 5년이 넘은 것 같은데

 

main 함수의 Argument는 제대로 사용을 하지 않았다는 것을 최근에 책을 보다 알았습니다.

 

어떻게 보면 너무 기본적인 부분이라 그냥 아무 생각 없이 넘어 가곤 했던 것 같습니다.

 

main 함수의 정의는 보통 다음과 같이 합니다.

 

int main(int argc, char **argv)
{

      return 0;
}

 

위 코드에서 argc 는 argument의 수를 의미 합니다. argv 는 argument 가 char 형으로 저장이 되는 변수 입니다.

 

argv[0]실행 파일명이 저장 됩니다.

 

argv[1], argv[2] … 에는 순서대로 사용자가 입력한 argument 가 저장 됩니다.

 

다음 코드는 argument 들의 합을 구하는 코드 입니다. 빌드를 해서 실행 파일을 만들었고 실행파일명은 Aargc.exe 입니다.

 

 

 

다음과 같이 cmd 창에서 실행 시키고 결과를 확인하면

 

 

argument 로서 43 이라는 입력을 줬을 때

 

argc 값은 3 이고 각 인자 값들이 argv[1], argv[2] 에 들어가는 것을 확인 할 수 있습니다.

 

두 수의 합이 정상적으로 7 이 나오는 것을 확인 할 수 있습니다.

 

위 예와 같은 main() 함수의 argument는 여러 가지 파라 미터에 따른 시뮬레이션을 해야 할 경우에 대단히 유용하게 이용이 될 수 있을 것으로 판단됩니다.


  1. guest 2012.11.11 16:17

    필요했던 부분인데 잘보고 갑니다 ^^

    • 남성 2012.11.11 19:19 신고

      도움 되었다니 다행이군요. 방문해 주셔서 감사합니다. ^^

  2. 행인 2013.01.14 09:50

    정리가 깔끔하게 되어있네요 정보 감사합니다^^

C, C++ 코딩시 printf(), scanf() 함수는 숫자 또는 문자를 표현하기 위하여 몇 가지 특수 문자를 제공한다.

 

매번 쓰는 것들이라 그냥 넘어가기 쉽지만, 가끔은 완전 잊어 버리게 되는 경우도 있어서 여기 정리한다.

 

특수 문자

내용

c

문자 출력

d

10진수 정수 출력

o

8 진수 출력

u

unsigned 출력

x

16진수 소문자 출력

X

16진수 대문자 출력

e

exponential 숫자 출력, e 를 소문자로

E

exponential 숫자 출력, E를 대문자로

f

floating number 출력

s

문자열 출력

 




 

위에서 몇 가지 문자들을 이용하여 -10 을 표현해 보자.

 

 

 

위 코드의 실행 결과는 다음과 같다.

 

 

 
 

-10을 %d 로 표현한 경우는 정상적으로 -10 이 표현되는 것을 확인 할 수 있다.

 

Unsigned, 8 진수, 16진수로 표현했을 경우는 어떻게 저런 결과가 나오는지 확인 해 보자.

  




 

C 코딩 시 integer 는 4바이트 즉 32 비트 숫자로 표현하며 2의 보수 체계를 이용한다.

 

-10을 2의 보수로 표현 할 때는 다음과 같은 과정을 거친다.

 

  1. 일단 10을 2진수로 표현하자

 

그럼 당연히

 

00000000000000000000000000001010

 

로 표현 될 것이다.

 

  1. 위 결과에 대해 1의 보수를 취하면

 

11111111111111111111111111110101

 

로 표현된다.

 

  1. 위 결과에 +1을 한다.

 

111111111111111111111111111110110

 

그럼 위와 같은 값이 된다. 위 결과가 바로 -10을 2의 보수로 표현한 결과이다.

  




 

111111111111111111111111111110110 을 그대로 숫자로 표현하면 unsigned 값인 4294967286 이 되는 것이며

 

111111111111111111111111111110110 뒤에서부터 3개씩 끊어서 8진수로 표현하면 37777777766 이 되고

 

111111111111111111111111111110110 뒤에서부터 4개씩 끊어서 16진수로 표현하면 fffffff6 이 된다.


  1. 2011.09.29 21:46

    비밀댓글입니다

  2. 남성 2011.09.30 06:40 신고

    %d 대신에 %i를 써도 됩니다. 똑같이 10진수 정수를 표현합니다.

C++ 프로그래밍을 하다 보면 변수의 type 에 따라 함수를 여러 개 작성해야 되는 경우가 많이 있다.

다음과 같이 x3 을 계산을 하는 myfunc() 함수를 가정 해 보자.

위 식에서 x 라는 변수가 int, double 인 경우에 대해 함수를 작성 하면 아래와 같이 될 것이다.

 

  • x 가 integer 인 경우

int myfunc(int x)

{

int t0;

t0 = x*x*x;

return t0;

}

 

  • x 가 double 인 경우

double myfunc(double x)

{

double t0;

t0 = x*x*x;

return t0;

}

 

함수는 오버로딩이 되므로 위와 같이 두 개의 함수를 지정해 놓으면 x 가 int 인 경우나 double 인 경우는 함수가 정상적으로 call 이 되고 동작을 하게 될 것이다.

그런데 저런 똑 같은 함수를 float 와 같은 다른 형태의 변수에 대해서도 써야 할 때가 있다.

이런 경우는 물론 그냥 float 형태로 또 써주면 되긴 할 것이다.

하지만 이러한 코딩 방식은 너무나 비생산 적이다.

이런 경우 template 을 알고 있으면 굉장히 편리 하다.

 

다음과 같이 template 의 형태로 함수를 작성해 보자.

template<typename T>

T myfunc(T x)

{

T t0;

t0 = x*x*x;

return t0;

}

 

위 코드에서 double , int 등으로 작성되었던 부분을 T 라는 타입으로 설정 해주고, 그 위에 T 라는 type 을 갖는 template 이다 라고 선언해 준 것 뿐이다.

이렇게 헤더 파일에 작성을 하면

그 myfunc() 라는 함수는 x 의 타입에 상관없이 이용할 수 있는 함수가 되는 것이다.

template 을 이용하면서 주의 할 점은 꼭 헤더 파일에 놓여야 한다는 것이다.

template 으로 작성된 함수는 컴파일시에 코드가 만들어 진다. 따라서 컴파일 속도가 약간 느려질 수는 있지만 그 영향은 거의 미미하다.

 

template 을 사용하여 지루하기만 했던 C++ 코딩에 날개를 달아보자.

 


+ Recent posts