#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

//이 프로그램은  입력받은 년월일의
//1991.12.31(Tuesday,화요일)을 기준으로한 경과일수를 계산하여
//요일을 구하는 프로그램입니다
//1992.1.1=1,  1.2=2  ....  1993.1.1=367  ......

 

#include < stdio.h >  // printf, scanf 를 사용하기 위한 헤더 file

 

//함수 원형(prototype) 선언
int mdays (int y, int m);
int day_is(int y, int m, int d);

 

long int compute_days(int y, int m, int d)  // long,int 둘중 하나 필요없음
{
  long int ds;  // long,int 둘중 하나 필요없음
  int i;

  ds = (y - 1992) * 365 + mdays(y, m) + d;  // '|' 제거, 경과년*365+날자수
  for(i = 1992; i < y; i += 4)  // 1992(윤년)부터 4년마다
      if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0))) //윤년이면
   //1996,2000,2004는 윤년, 2100,2200,2300은 평년
      ++ds;  //하루 증가
  return (ds);
}

 

void print_day(int d)
{
/****** 아래 printf 문 하나로 대체
   switch (d) {
      case 1: printf("The day is Wednesday.\n");
              break;
      case 2: printf("The day is Thursday.\n");
              break;
      case 3: printf("The day is Friday.\n");
              break;
      case 4: printf("The day is Saturday\n");
              break;
      case 5: printf("The day is Sunday\n");
              break;
      case 6: printf("The day is Monday.\n");
              break;
      case 0: printf("The day is Tuesday.\n");
              break;
   }
*****/
 //1991.12.31(경과일수 0)은 "Tuesday"
 char *days[7]={"Tuesday", "Wednesday", "Thursday", "Friday", 
                   "Saturday", "Sunday", "Monday"};
    printf("The day is %s.\n", days[d]);

}

 

void main() 
{
  int year, mon, day;
  long int days;

  printf("Input Year -> ");
  scanf("%d",&year);
  printf("Input Month -> ");
  scanf("%d",&mon);
  printf("Input Day -> ");
  scanf("%d",&day);
  if (!day_is(year,mon,day))
    printf("Incorrect date!!\n");
  else {
    days = compute_days(year,mon,day);  //경과일수 계산
    print_day((int)(days % 7));
  }
}

 

//입력 년월일이 정확하면 1(true), 잘못됬으면 0(false) 을 반환하는 함수 
//int형 함수의 경우 함수형을  생략해도 되지만 
//명시하는 것이 코딩의 일관성 유지(day_is 앞의 int)
int day_is(int y, int m, int d) 
{
  int e = 0;

  if (y < 1992 || m < 1 || m > 12 || d < 1 || d > 31)
    return (0);

  //d가 m월 날수 이내인지 검사
  switch (m) {
    //윤년 검사문 case 2 로 이동
    case 2: if ((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
               e = 1;
      if (d <= 28 + e)
               return (1);
            else
               return (0);
       break;        // break 문이 없으면 다음 문장도 실행
    case 4:
    case 6:
    case 9:
    case 11: if (d <= 30)
               return (1);
             else
               return (0);
    break;
 default : return (1); // 위조건이 아닌 경우(1,3,5,7,8,10,12) 날수 31
                    // d가 31 이내인지는 함수 처음에 검사했음
  }
}

 

// 2004.5.6 경우 2004년 1.1 부터 4.30 까지 날수 계산하는 함수
int mdays (int y, int m) 
{
  int e = 0;

  if((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
       e = 1;
/***  아래 if문과  비교
  switch (m) {
     case 1: return (0);
     case 2: return (31);
     case 3: return (59 + e);
     case 4: return (90 + e);
     case 5: return (120 + e);
     case 6: return (151 + e);
     case 7: return (181 + e);
     case 8: return (212 + e);
     case 9: return (243 + e);
     case 10: return (273 + e);
     case 11: return (304 + e);
     case 12: return (334 + e);
  }
*****/
  int dates[12]={0,31,59,90,120,151,181,212,243,273,304,334};
  if (m <= 2)
   return dates[m-1];
  else
      return dates[m-1]+e;
}

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

재귀함수사용한 덧셈  (0) 2016.11.30
c언어 별찍기, 피라미드  (0) 2016.11.30
#undef , 전처리문  (0) 2016.11.30
짝수 합 홀수 합 구하기  (0) 2016.11.30
C언어 루트값 구하기  (0) 2016.11.30

#undef

#undef는 #define의 반대되는 동작을 하는 전처리문이다. #define이 매크로를 정의하는데 비해 #undef는 정의되어 있는 매크로를 삭제한다. 전처리기는 이 명령을 만나면 지정한 매크로의 정의를 취소하고 이후부터 이 명칭에 대해서는 치환을 중지한다. #undef 다음에 취소하고 싶은 매크로의 이름만 적어주면 된다.

일반적으로 매크로는 한 번 정의되면 프로젝트 전체에 걸쳐 일관된 값으로 사용되므로 이미 정의되어 있는 매크로를 취소할 경우란 그리 흔하지 않다. #undef가 꼭 필요한 경우는 사용중인 매크로를 다른 값으로 재정의하고 싶을 때이다. 존재하는 매크로를 #define으로 다시 정의할 경우 재정의할 수 없다는 경고 메시지(컴파일러에 따라서는 에러 메시지)가 출력되므로 매크로를 먼저 지운 후 다시 정의해야 한다. 다음이 그 예이다.

 

  : undef

#include <Turboc.h>

 

void main()

{

#define SIZE 10

     printf("SIZE=%d\n",SIZE);

#undef SIZE

#define SIZE 20

     printf("SIZE=%d\n",SIZE);

}

 

SIZE 매크로 상수를 최초 10으로 정의해 놓고 사용했다. 어떤 이유로 이 매크로를 다른 값으로 바꾸고 싶다면 #undef로 SIZE 매크로를 삭제한 후 #define으로 다시 정의해야 한다. 실행 결과는 다음과 같다.

 

SIZE=10

SIZE=20

 

위 예제는 #undef의 동작을 설명하기 위해 의도적으로 작성한 것이므로 다소 부자연스러운 면이 있다. 존재하는 매크로를 재정의하기보다는 두 개의 다른 매크로를 만들어 쓰면 훨씬 더 쉽게 해결될 수 있을 것이다. 실전에서는 어쩔 수 없이 매크로를 재정의해야 하는 경우도 있는데 예를 들자면 외부에서 가져온 헤더 파일의 매크로가 충돌될 때를 들 수 있다. ext1.h, ext2.h 두 헤더 파일이 모두 TIME이라는 매크로를 사용하는데 이 값이 서로 달라야 한다면 다음과 같이 헤더 파일을 포함하기 전에 매크로를 재정의하면 된다.

 

#define TIME 800

#include <ext1.h>

#undef TIME

#define TIME 1400

#include <ext2.h>

 

이렇게 하면 ext1.h를 컴파일할 때 TIME은 800이 되고 ext2.h를 컴파일할 때 TIME은 1400이 된다. 일정한 범위 내에서만 매크로의 의미를 잠시 바꾸고 싶을 때 매크로 재정의 기법이 가끔 필요하다. 또한 자신이 사용하는 매크로를 외부에서 정의하고 있더라도 자신만의 매크로를 꼭 정의하고 싶다면 조건부 컴파일 지시자와 함께 사용할 수도 있다.

 

#ifdef MACRO

#undef MACRO

#endif

#define MACRO 내가 원하는 값

 

만약 MACRO가 이미 정의되어 있다면 취소해 버리고 원하는 값으로 다시 정의하는 것이다. #define은 중복 정의를 허용하지 않는 반면 #undef는 존재하지 않는 매크로이더라도 에러로 처리되지 않는 특성이 있다. 그래서 위 코드에서 조건부 컴파일 지시자가 꼭 필요한 것은 아니다.

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

c언어 별찍기, 피라미드  (0) 2016.11.30
c 윤달 구하기, 윤달계산  (0) 2016.11.30
짝수 합 홀수 합 구하기  (0) 2016.11.30
C언어 루트값 구하기  (0) 2016.11.30
C 완전수 구하기  (0) 2016.11.30

+ Recent posts