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 을 지울 수도 있더군요. 외부에 코드를 보낼 때 종종 활용하게 될 것 같네요.


이전 포스팅들에서도 소개한 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 했습니다.



저는 윈도우가 아니면 주로 우분투 리눅스를 사용하는데요~ 


우분투가 쉽고 편한 OS 라고는 하지만~ 그래도 공부는 필요하죠~


리눅스의 가장 큰 장점이 다양한 라이블러리의 사용인데, 그런 라이브러리들을 어떻게 사용하는건가 궁금하던차에 


아래 책이 있길래 요즘 즐겁게 보고 있습니다. 



책 소개나 목차 등은 아래 한빛 미디어 페이지를 참조하셨으면 하고요~ 


http://www.hanb.co.kr/book/look.html?isbn=978-89-7914-953-1




우분투 환경에서 C 언어로 배우는 리눅스 프로그래밍

저자
이이오 준 지음
출판사
한빛미디어 | 2012-09-01 출간
카테고리
컴퓨터/IT
책소개
C언어 학습자들을 위한 『우분투 환경에서 C 언어로 배우는 리눅...
가격비교




아무래도 컴퓨터 관련 책들은 예제가 있기 마련인데~ 이책에서 예제 코드는 어디서 받나 한참 찾았네요~ 알고 보니 작가 소개 페이지 아래쪽에 있었다는.... 


http://www.hanb.co.kr/exam/1953/



저 처럼 예제 코드 찾느라 고생하실 분들을 위해 올립니다.


linux_source_code.zip



Cygwin 을 깔면~ 윈도우에서 리눅스 관련 명령어들을 이용할 수 있습니다.

 

아예 Virtual box 등을 통해 윈도우 내에 리눅스를 깔아서 사용하는 방법도 있지만 간단한 작업을 할 때는 Cygwin 정도가 제격이라는 생각이 들더군요~

 

공식 홈페이지는 아래와 같구~

http://www.cygwin.com/

 

아래 페이지에서 setup.exe 를 클릭하면 설치 파일이 다운로드 됩니다.

http://cygwin.com/install.html

 

설치 파일을 실행해서~ 다음 다음~ 누르다 보면 설치가 진행되는데~

 

설치 과정중에 아래와 같이 packages를 설정하는 부분에서 아래와 같이 gcc 로 찾기하면 아래와 같이 나옵니다.

 

devel 폴더가 개발과 관련한 설치 파일들이 있는 폴더 입니다.

 

여기서 설치하고자 하는 package 들을 선택합니다. Skip 이라고 된 부분을 클릭하면 버전이 바뀝니다. 전 첨에 이 간단한 걸 몰라서 어디 클릭해야 하는 건가 한참 찾음 ㅡㅡ;

 

아래와 같이 gcc 관련 package 들을 선택해주고

 

아래 그림처럼~ editor 로 사용할 vi 관련 package 들을 선택해 줍니다.

 

 

그리고 다음 ~ 다음~ 을 눌러서 Cygwin 설치를 마무리 합니다. 설치에 시간이 좀 걸리니깐~ 느긋이 커피 한잔 하면서 기다리시면 됩니다.

 

이제~ Cygwin 환경에서 간단하게 C 코딩을 해 보죠~

 

Cygwin 을 실행 시키고 일단 현재 폴더가 어딘지를 보려면~

 

다음과 같이 pwd 명령을 치면 됩니다.

 

위 그림의 \home\Administrator 폴더는 사실 윈도우의 C:\cygwin\home\Administrator폴더를 의미합니다.

 

즉~ C:\cygwin\home\Administrator 폴더가 cygwin 에서는 \home\Administrator 폴더로 마운트 되었다는 의미입니다.

 

그리고 위 그림처럼 gcc –version 이라는 명령어를 쳐서 gcc 가 제대로 깔렸는지 확인합니다.

 

이제 C 코딩을 해보죠~

 

아래 그림처럼 vim hello.c 라는 명령을 쳐서~ 다음과 같이 코딩합니다. ㅋㅋ 맞습니다. hello world입니다. ㅋㅋ

 

#include <stdio.h>

int main(void) {

printf("Hello world!!\n");

return 0;

}

 

아!! Vim 사용방법을 모르시는 분들은 그냥 메모장에다 위 코드 써서 C:\cygwin\home\Administrator\hello.c 로 저장해도 됩니다.

 

이제 다음과 같이 ~~

 

gcc 로 빌드해서 hello.exe 라는 실행 파일을 만들어주고~

 

gcc hello.c -o hello

 

아래 명령어로 실행을 시키면~

 

./hello.exe

 

Hellow world!! 가 실행 됩니다~

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 코딩을 처음 할 때 complex 연산을 어떻게 해야 하나 고민을 많이 했었던 기억이 납니다.

 

C89 시절에 C 코딩을 배우던 터라 아래 주소의 문서에서 확인 할 수 있는 바와 같이

 

http://rosettacode.org/wiki/Arithmetic/Complex#C

 

typedef 을 이용해서 Complex 형을 만들고, complex 연산 하나하나를 함수로 만들어서 이용했던 기억이 나네요.

 

이런 complex 라이브러리야 각자 한번만 만들어 놓으면 두고 두고 쓸 수 있을 테니깐~~

 

이렇게 손수 타입을 작성하는 것이 그리 문제는 안됩니다.

 





그런데 최근에 또 다른 C 책을 좀 읽다 보니 C99 에서 complex.h 가 정의 되었더군요.

 

물론 컴파일러 마다 complex.h를 정상적으로 지원하지 않는 경우도 있는 것 같습니다.

 

complex.h 헤더를 추가하면 복소수를 단순히 영문 I 를 붙여서 정의 할 수 있습니다.

 

아래 예제 코드를 보죠.

 

아래 예제 코드는 MINGW + CodeBlocks 환경입니다.

 

 

실행 결과는 다음과 같습니다.

 

 

단순히 complex.h 헤더를 이용하여 곱셈 연산복소수 각 을 계산하는 예제지만

 

C89 에서 complex 형과 함수들을 일일이 정의하지 않아도 되니깐 편리하다는 생각이 드는군요.


C, geany, IDE

윈도우에서 Visual studio 를 이용하여 c 코딩 하다가~~

 

간단한 거 할 때도 이렇게 비싸고 무거운 프로그램을 써야 하는 생각에 gcc 관련 유틸들을 찾아보게 되었다.

 

gcc 는 리눅스에야 기본으로 깔리는 거지만, 윈도우에서 이용할라면 Cygwin 이나 MinGW를 설치해야 한다.

 

설치하면 공부 좀 해서 쓰면 되긴 하겠지만, 나 같이 윈도만 주로 이용했던 인간들은 위에 말한 툴들에 적응하는게 그리 쉽지는 않다.

 

그러던 중 찾은 게 오늘 소개 하고자 하는 geany 이다.

 

이렇게 심플하고 좋은 프로그램이 GNU GPL 라이선스니~ 맘대로 다운 받아 써도 된다.

 

홈페이지는 요기다. 

http://www.geany.org/



위 홈피에 가서 아래 페이지에서 각자 운영체제에 맞는 버전을 설치하면 땡~~~

 
http://www.geany.org/Download/Releases

 

생긴 건 아래 그림처럼 깔끔하게 생겼다. gcc 도 포함되 있고 가볍고 굉장히 좋다.

 

 

설치 기념으로 간단하게 1 ~ 1000 까지의 합을 구해 봤다. ㅋㅋ

 

F8 눌러서 컴파일 하고

 

F9 눌러서 제작하고

 

F5 눌러서 실행하면 된다.

 

아래는 실행 결과~~ ㅋㅋ 좋다 ~~~

 


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진수 정수를 표현합니다.

+ Recent posts