#include <iostream>

//1.
/* new , delete
#include <malloc.h>

using namespace std;

void main()
{
int *p3 = new int;

int *p1 = (int *)malloc(sizeof(int)*10); 
int *p2 = new int[10];
delete p3;
delete [] p2;
free(p1);
int *p1 = (int *)malloc(sizeof(int)*10); //일반화 프로그래밍 !! ->void *  
free(p1);
}*/


//2.
/*

//참조 변수(REF)   & 참조형 변수
//변수에 대한 또다른이름 --> 별명--> 알리아스
using namespace std;
//call by value
void SWAP(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
//c언어 call by ref
void SWAP(int *x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
// 레퍼런스를 이용한 call by ref
void SWAP(int & x, int & y)
{
int temp = x;
x = y;
y = temp;
}

void main()
{
int x = 10;
int y = 20;
cout << x << "  " << y << endl;
SWAP(&x,&y);
cout << x << "  " << y << endl;
cout << x << "  " << y << endl;
SWAP(x,y);
cout << x << "  " << y << endl;

cout << x << "  " << y << endl;
SWAP(x,y);
cout << x << "  " << y << endl;

int LEE_TAE_WON = 100;
//참조형 변수는 선언과 동시에 참조가 되어야 한다.
int & p = LEE_TAE_WON;
cout << LEE_TAE_WON << endl;
cout <<  p << endl;

}
*/
/*
//3.함수 오버로딩 ( 다중정의 )
//정의 : 같은 이름의 함수가 매개변수의 갯수와 타입에 따라서 
//   서로 다른 함수로 인식 하는 것

using namespace std;
//함수 원형 선언
void print();
void print(int);
void print(int , int);

void main()
{
print();
}

void print()
{
cout << "printf()" << endl;
}
void print(int x)
{
cout <<"printf(int x)" << endl;
}
void print(int x, int y)
{
cout <<"printf(int x,int y)" << endl;
}
*/

/*
//4,디폴트 파라미터 

using namespace std;

void foo(int Snum = 100, int age =20, char *name = "홍길동") 
{
cout <<"학번은"<<Snum<< "나이는" << age<< "살"<< " 이름은 "<<  name << "입니다."<< endl;
}

void main()
{
foo();
}
*/
/*
//함수 오버로딩은 같은 로직의 함수가 매개변수의 타입에 따라 구현될경우사용
//
int plus(int x = 0, int y = 0)
{
return x+y;
}
double plus(float x = 0, float y = 0)
{
return double(x+y);
}
using namespace std;

void main()
{
cout << plus() << endl;
}
*/
/*
#include <malloc.h>
 //c++ 동적 메모리 사용!!
using namespace std;

void main()
{

int *p = (int *)malloc(sizeof(int)*10);

//재할당
p = (int *)realloc(p , _msize(p)*2);
cout <<  _msize(p) << endl;
free(p);

int *p2 = new int[10];
// int *p3 = &(*p2);
p2 = new int[_msize(p2)/sizeof(int)*2];
// memcpy(p3,p2,_msize(p2));
// p3 * 2;

cout << _msize(p2) << endl;
delete [] p2;
}
*/

using namespace std;

int *dong(int size_t=1, bool check_zero=0,int *q=0)
{
int *temp = new int[size_t];
if(check_zero)
{
memset(temp,0,_msize(temp));
}
if(q)
{
memcpy(temp,q,sizeof(int)*size_t);
delete [] q;
}
return temp;
}
void main()
{
int *p = new int[10];
p[0] = 5;
p[2] = 3;
p = dong(3,1,p);
cout << p[1] << endl;
cout << _msize(p) << endl;
}


#include <iostream>
//using namespace std;
//using namespace A;

int x=200;
namespace B
{
//using std::cout;
//using std::endl;
using namespace std;

inline void foo() //함수를 호출하는 곳에서 바로 실행하게 해줌. 메모리 할당 X,메모리 절약 실행속도 업
// 단점 함수에잇는 내용이 많아지면 
{
/*cout.operator << (10);
cout <<"1" << endl;
cout << 10 << 29 << "aa"<<'X'<<3.14<< endl;

int x;
cin >> x;
cout << x<< endl;
*/
//int x=100;
//cout << ::x << endl;
/*
float f = 3.14;
int x = int(f);

cout << x << endl;
*/
cout<<"XXXXXXXX"<<endl;
cout<<"XXXXXXXX"<<endl;
cout<<"XXXXXXXX"<<endl;
}
}
//태그가 타입으로 승격
//구조체 태그로부터 변수를 바로 선언할수 있다.

struct BOOK
{
int price;
int page;
};

void main()
{
//B::foo();
BOOK *p1 = (BOOK *)malloc(sizeof(BOOK)*10);

free(p1);
}

//함수 오버로딩
//구조체


#include <stdio.h>

#include <stdio.h>

#include <windows.h>

void main()

{

            

             int mainarray[100000] ;

             //루틴의속도측정을위해사용

             LARGE_INTEGER liCounter1, liCounter2, liFrequency;

    QueryPerformanceFrequency(&liFrequency);

    QueryPerformanceCounter(&liCounter1);

 

             //10000000000 번의for 루프

 

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

             {                                      

                           mainarray[i] =0;

             }

              QueryPerformanceCounter(&liCounter2);

 

              //측정결과

    printf("c 언어수행시간= %f \n", (double)(liCounter2.QuadPart - liCounter1.QuadPart) / (double)liFrequency.QuadPart);

 

 

             //어셈블리루틴속도측정을위해사용

    QueryPerformanceFrequency(&liFrequency);

    QueryPerformanceCounter(&liCounter1);

 

             //어셈루틴번의루프         

             register int k;

             int mainarray2[100000] ;

             _asm{                              

                           mov         dword ptr [k],0

                           mov         eax,dword ptr [k]

                           mov         dword ptr mainarray2[eax*4],0

L1 : cmp         eax,99999

                           je loop_end

                            add         eax,1

                            mov         dword ptr [k],eax

                            mov         eax,dword ptr [k]

              mov         dword ptr mainarray2[eax*4],0

                            jmp L1

loop_end:

             }

    QueryPerformanceCounter(&liCounter2);

 

             //결과

    printf("어셈수행시간= %f \n", (double)(liCounter2.QuadPart - liCounter1.QuadPart) / (double)liFrequency.QuadPart);

}


우호호호 이렇게 중간에 뭔가 해줘야 어셈이 빠르시군요


'Programing > C' 카테고리의 다른 글

C언어 ,c++ 어셈블리 변환  (0) 2016.11.30
어셈블리와 c언어 속도 비교  (0) 2016.11.30
띄어쓰기까지 입력가능한 scanf  (0) 2016.11.30
데이터형  (0) 2016.11.30
반복문  (0) 2016.11.30

#include <stdio.h>

#include <stdio.h>

#include <windows.h>

void main()

{

            

             //루틴의속도측정을위해사용

             LARGE_INTEGER liCounter1, liCounter2, liFrequency;

    QueryPerformanceFrequency(&liFrequency);

    QueryPerformanceCounter(&liCounter1);

 

             //10000000000 번의for 루프

             for(int i=1000000000; i > 0; i--)

             {                                      

             }

              QueryPerformanceCounter(&liCounter2);

 

              //측정결과

    printf("c 언어수행시간= %f \n", (double)(liCounter2.QuadPart - liCounter1.QuadPart) / (double)liFrequency.QuadPart);

 

}


위의 코드를 어셈블리 언어로 변환하는 간단한 방법~



위와 같이 명령 프롬프트에 프로젝트 폴더로 이동하여 cl main.cpp /FAs 라는 명령어를 통해 어셈블리 언어로 변환이 가능하다.




명령어를 수행하면 위와같이 성공적으로 됬단다 라는 말이 나오는데 에러가 있는 부분은 어디어디 에러있으니 고치세요~ 라고 나온다




변환후 폴더에 들어가보면 main.exe, main.asm 이라는 2개의 파일과 object 파일이 생성되는데 뭐 exe파일은 실행이고 asm 파일이 우리가 원하는

어셈블리로 변환된 파일이 되겠다~




변환된 모습~아오 하나도모르겟다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

빠염~


'Programing > C' 카테고리의 다른 글

어셈블리 c언어 속도측정결과  (0) 2016.11.30
어셈블리와 c언어 속도 비교  (0) 2016.11.30
띄어쓰기까지 입력가능한 scanf  (0) 2016.11.30
데이터형  (0) 2016.11.30
반복문  (0) 2016.11.30

#include <stdio.h>

#include <stdio.h>

#include <windows.h>


void main()

{

             //루틴의속도측정을위해사용

             LARGE_INTEGER liCounter1, liCounter2, liFrequency;

    QueryPerformanceFrequency(&liFrequency);

    QueryPerformanceCounter(&liCounter1);

 

             //10000000000 번의for 루프

             for(int i=10000000000; i > 0; i--)

             {                                      

             }

              QueryPerformanceCounter(&liCounter2);

 

              //측정결과

    printf("c 언어수행시간= %f \n", (double)(liCounter2.QuadPart - liCounter1.QuadPart) / (double)liFrequency.QuadPart);

 

 

             //어셈블리루틴속도측정을위해사용

    QueryPerformanceFrequency(&liFrequency);

    QueryPerformanceCounter(&liCounter1);

 

             //어셈루틴번의루프

      register int r1=0;

             _asm{                 

                           mov  r1, 10000000000;

                           L1 : cmp r1,0                     // r1 값을0과비교

                           je loop_end; // r1 0 일경우loop_end

                           dec r1; // 1을감소시키고다시저장

                           jmp L1;

loop_end:

             }           

    QueryPerformanceCounter(&liCounter2);

 

             //결과

    printf("어셈수행시간= %f \n", (double)(liCounter2.QuadPart - liCounter1.QuadPart) / (double)liFrequency.QuadPart);

}



'Programing > C' 카테고리의 다른 글

어셈블리 c언어 속도측정결과  (0) 2016.11.30
C언어 ,c++ 어셈블리 변환  (0) 2016.11.30
띄어쓰기까지 입력가능한 scanf  (0) 2016.11.30
데이터형  (0) 2016.11.30
반복문  (0) 2016.11.30
scanf 에서 띄어쓰기를 입력하세 해줍니다~

scanf("%[^\n]") 
여기서 ^는 여집합 입니다.
[] 전체 집합 입니다.

여기서 [^\n] 은 \n(개행)의 여집합 즉, 개행을 제외한 모든 집합을 뜻합니다. 
이말은 개행이 들어가기 전까지 입력을 받는다는 뜻입니다. 


#include <stdio.h>
void main()
{
char arr[40]={0,};
scanf("%[^\n]",arr);
int i=0;
for(i=0;i<40;i++){
printf("%c",arr[i]);
}
}




'Programing > C' 카테고리의 다른 글

C언어 ,c++ 어셈블리 변환  (0) 2016.11.30
어셈블리와 c언어 속도 비교  (0) 2016.11.30
데이터형  (0) 2016.11.30
반복문  (0) 2016.11.30
재귀함수사용한 덧셈  (0) 2016.11.30


'Programing > C' 카테고리의 다른 글

어셈블리와 c언어 속도 비교  (0) 2016.11.30
띄어쓰기까지 입력가능한 scanf  (0) 2016.11.30
반복문  (0) 2016.11.30
재귀함수사용한 덧셈  (0) 2016.11.30
c언어 별찍기, 피라미드  (0) 2016.11.30




1번
#include <stdio.h>
void main()
{
int i,j,num=1;
for(i = 0; i < 10 ; i++){
for(j = 0; j <5; j++){
printf("%2d ",num++);
}
printf("\n");
}
}


2번

#include <stdio.h>
void main()
{
int num1,num2,num3;
int i,j,k;
printf("가로를 입력하세요 : ");
scanf("%d",&num1);
printf("세로를 입력하세요 : ");
scanf("%d",&num2);
printf("개수를 입력하세요 : ");
scanf("%d",&num3);

for(i = 0; i < num2; i++){
for(j=0; j < num3; j++){
for(k =0; k < num1 ; k++){
printf("*");
}
printf("  ");
}
printf("\n");
}
}


'Programing > C' 카테고리의 다른 글

띄어쓰기까지 입력가능한 scanf  (0) 2016.11.30
데이터형  (0) 2016.11.30
재귀함수사용한 덧셈  (0) 2016.11.30
c언어 별찍기, 피라미드  (0) 2016.11.30
c 윤달 구하기, 윤달계산  (0) 2016.11.30
#include <stdio.h>
int sum(int num,int number)
{
int re=0;
if(number-1 != num-1){
printf("%d + ",number);
re = sum(num,number+1);
}
return re+=number;
}

void main()
{
int number,i=1;
int result=0;
printf("Enter a natural number : ");
scanf("%d",&number);
result =sum(number,1);
printf("%d = %d\n",number,result);

}


'Programing > C' 카테고리의 다른 글

데이터형  (0) 2016.11.30
반복문  (0) 2016.11.30
c언어 별찍기, 피라미드  (0) 2016.11.30
c 윤달 구하기, 윤달계산  (0) 2016.11.30
#undef , 전처리문  (0) 2016.11.30

다중 for문을 이용. 탑의 높이(n)을 받아서 받은만큼의 탑모양을 별(*)로 찍기.

 

ex )

 

n=3  n=5  n=10


 

 

방법 1)

i가 1~n까지 반복한다고 했을 때,for(i=1; i<=n; i++)

각 줄의 공백( )의 개수는 n-i개이고 for(j=1; j<=n-i; j++)

공백이 찍힌 뒤에 찍히는 별의 개수는i*2-1개 for(j=1; j<=i*2-1; j++)
 인 점을 이용.

:맨 처음 문제를 봤을 때 가장 먼저 떠오른 방법입니다.

 

#include

void main(){
 int i,j,n;
 cout << "N = ";
 cin >> n;
 for(i=1; i<=n; i++){
  for(j=1; j<=n-i; j++)
   cout << " ";
  for(j=1; j<=i*2-1; j++)
   cout << "*";
  cout << "\n";
 }
}

 

 

 

 

방법 2)

i가 2*n-1 까지 2만큼 증가하면서 반복. for(i=1; i<=2*n-1; i+=2) --> 2 만큼 증가하기 때문에 n만큼의 줄을 만들 수 있다.

위 방법으로 반복한다고 할 때,

공백( )의 개수는 2*n-i를 2로 나눈 몫만큼for(j=1; j<=(2*n-i)/2; j++),

별(*)의 개수는 항상 i의 값만큼(2*n-1)인 것을 이용.for(j=1; j<=i; j++)

 

#include

void main(){
 int i,j,n;
 cout << "N = ";
 cin >> n;
 for(i=1; i<=2*n-1; i+=2){
  for(j=1; j<=(2*n-i)/2; j++)
  cout << " ";
  
  for(j=1; j<=i; j++)
   cout << "*";
  cout << "\n";
 }
}

 

 

 

방법 3)for문 안에 if문 사용.

i가 n부터 1씩 줄어들면서 1에 도달할 때까지 반복 --> 반복 횟수는 위의 방법들과 같음.for(i=n; i>=1; i--)

각 줄에서 모든 출력이 끝나는 점이 2*n-i인 점을 이용해서 반복문을 한번 더 써줌. for(j=1; j<=2*n-i; j++)

i가 n부터 1씩 줄어들면서 1에 도달할 때까지 반복할 때, 공백( )은 항상j가 i보다 작을 때 찍힘.if(j

j가 i보다 크거나 같을 때(공백을 다 찍은 후) *을 찍음.   --> 모든 출력이 끝나는 점이 2*n-i인 점을 고려해서 반복문을 한번 더 써줬기 때문에 공백을 찍고 남은 부분 모두 *을 찍으면 원하는 *의 갯수가 나온다. else cout << "*"

 

#include

void main(){
 int i,j,n;
 cout << "N = ";
 cin >> n;
 for(i=n; i>=1; i--){
  for(j=1; j<=2*n-i; j++){
   if(j
   else cout << "*";
  }
  cout << "\n";
 }
}

 

 

 

참고 - <역삼각형 만들기>

 

ex)

n=3 n=5  n=10




i가 n에서 1씩 감소하면서 1까지 갈 때까지 반복한다고 할때, for(i=n; i>=1; i--)
공백( )의 개수는 (n-i)개 for(j=1; j<=n-i; j++)
*의 개수는 (2*i-1)개 for(j=1; j<=2*i-1; j++)

인 규칙을 이용.

 

#include

void main(){
 int i,j,n;
 cout<<"N = ";
 cin>>n;
 for(i=n; i>=1; i--){
  for(j=1; j<=n-i; j++)
   cout << " ";
  for(j=1; j<=2*i-1; j++)
   cout << "*";
  cout << "\n";
 }
}

 

 


'Programing > C' 카테고리의 다른 글

반복문  (0) 2016.11.30
재귀함수사용한 덧셈  (0) 2016.11.30
c 윤달 구하기, 윤달계산  (0) 2016.11.30
#undef , 전처리문  (0) 2016.11.30
짝수 합 홀수 합 구하기  (0) 2016.11.30

+ Recent posts