天天看點

100個經典算法

C++語言: 臨時自用代碼 POJ 上做做 ACM 的題

語言的學習基礎 , 100 個經典的算法

C 語言的學習要從基礎開始,這裡是 100 個經典的算法-1 C 語言的學習要從基礎開始,這裡是 100 個經典的算法

題目:古典問題:有一對兔子,從出生後第 3 個月起每個月都生一對兔子,小兔

子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數

為多少?

__________________________________________________________________

程式分析:兔子的規律為數列 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21. ...

___________________________________________________________________

程式源代碼:

main()

{

long f1 , f2;

int i;

f1 = f2 = 1;

for( i = 1; i <= 20; i ++)

  { printf( "%12ld %12ld" , f1 , f2);

    if( i % 2 == 0) printf( " /n ");

    f1 = f1 + f2;

    f2 = f1 + f2;

  }

}

上題還可用一維數組處理, you try !

題目:判斷 101 - 200 之間有多少個素數,并輸出所有素數。

__________________________________________________________________

程式分析:判斷素數的方法:用一個數分别去除 2 到 sqrt( 這個數) ,如果能被整

除,則表明此數不是素數,反之是素數。

___________________________________________________________________

程式源代碼:

#include "math.h"

main()

{

  int m , i , k , h = 0 , leap = 1;

  printf( " /n ");

  for( m = 101; m <= 200; m ++)

   { k = sqrt( m + 1);

    for( i = 2; i <= k; i ++)

      if( m % i == 0)

       { leap = 0; break ;}

    if( leap) { printf( "%-4d" , m); h ++;

         if( h % 10 == 0)

         printf( " /n ");

        }

    leap = 1;

   }

  printf( " /n The total is %d" , h);

}

題目:列印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位

數字立方和等于該數本身。例如: 153 是一個“水仙花數”,因為 153 = 1 的三次方

+ 5 的三次方+ 3 的三次方。

__________________________________________________________________

程式分析:利用 for 循環控制 100 - 999 個數,每個數分解出個位,十位,百位。

___________________________________________________________________

程式源代碼:

main()

{

int i , j , k ,n;

printf( "'water flower'number is:");

  for(n = 100;n < 1000;n ++)

  {

   i =n / 100;

   j =n / 10 % 10;

   k =n % 10;

   if( i * 100 + j * 10 + k == i * i * i + j * j * j + k * k * k)

    {

    printf( "%-5d" ,n);

    }

  }

printf( " /n ");

}

題目:将一個正整數分解質因數。例如:輸入 90 , 列印出 90 = 2 * 3 * 3 * 5 。

__________________________________________________________________

程式分析:對n 進行分解質因數,應先找到一個最小的質數 k ,然後按下述步驟完

成:

( 1) 如果這個質數恰等于n ,則說明分解質因數的過程已經結束,列印出即可。

( 2) 如果n <> k ,但n 能被 k 整除,則應列印出 k 的值,并用n 除以 k 的商 , 作為新的正

整數你n , 重複執行第一步。

( 3) 如果n 不能被 k 整除,則用 k + 1 作為 k 的值 , 重複執行第一步。

___________________________________________________________________

程式源代碼:

main()

{

int n , i;

printf( " /n please input a number: /n ");

scanf( "%d" , &n);

printf( "%d=" ,n);

for( i = 2; i <=n; i ++)

  {

   while(n != i)

   {

    if(n % i == 0)

    { printf( "%d*" , i);

    n =n / i;

    }

    else

     break;

   }

}

printf( "%d" ,n);

}

題目:利用條件運算符的嵌套來完成此題:學習成績 >= 90 分的同學用 A 表示, 60

- 89 分之間的用B 表示, 60 分以下的用 C 表示。

__________________________________________________________________

程式分析:( a >b) ? a:b 這是條件運算符的基本例子。

___________________________________________________________________

程式源代碼:

main()

{

  int score;

  char grade;

  printf( "please input a score /n ");

  scanf( "%d" , & score);

  grade = score >= 90 ? 'A' score >= 60 ? 'B' : 'C');

  printf( "%d belongs to %c" , score , grade);

}

題目:輸入兩個正整數 m 和n ,求其最大公約數和最小公倍數。

__________________________________________________________________

程式分析:利用輾除法。

___________________________________________________________________

程式源代碼:

main()

{

  int a ,b , num1 , num2 , temp;

  printf( "please input two numbers: /n ");

  scanf( "%d,%d" , & num1 , & num2);

  if( num1   { temp = num1;

   num1 = num2; 

   num2 = temp;

  }

a = num1;b = num2;

while(b != 0)

  {

   temp = a %b;

   a =b;

  b = temp;

  }

printf( "gongyueshu:%d /n " , a);

printf( "gongbeishu:%d /n " , num1 * num2 / a);

}

題目:輸入一行字元,分别統計出其中英文字母、空格、數字和其它字元的個數

__________________________________________________________________

程式分析:利用 while 語句 , 條件為輸入的字元不為 '/n' .

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{ char c;

  int letters = 0 , space = 0 , digit = 0 , others = 0;

  printf( "please input some characters /n ");

  while(( c = getchar()) != '/n')

  {

  if( c >= 'a' && c <= 'z'|| c >= 'A' && c <= 'Z')

   letters ++;

  else if( c == ' ')

   space ++;

    else if( c >= '0' && c <= '9')

        digit ++;

      else

        others ++;

}

printf( "all in all:char=%d space=%d digit=%d others=%

d /n ",letters,space,digit,others);

}

題目:求s = a + aa + aaa + aaaa + aa ... a 的值,其中 a 是一個數字。例如

2 + 22 + 222 + 2222 + 22222( 此時共有 5 個數相加) ,幾個數相加有鍵盤控制。

__________________________________________________________________

程式分析:關鍵是計算出每一項的值。

___________________________________________________________________

程式源代碼:

main()

{

  int a ,n , count = 1;

  long int sn = 0 , tn = 0;

  printf( "please input a and n /n ");

  scanf( "%d,%d" , & a , &n);

  printf( "a=%d,n=%d /n " , a ,n);

  while( count <=n)

  {

   tn = tn + a;

  sn =sn + tn;

   a = a * 10;

   ++ count;

  }

printf( "a+aa+...=%ld /n " ,sn);

}

題目:一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如 6 = 1 + 2

+ 3. 程式設計找出 1000 以内的所有完數。

___________________________________________________________________

程式源代碼:

main()

{

static int k [ 10 ];

int i , j ,n ,s;

for( j = 2; j < 1000; j ++)

  {

 n =- 1;

 s = j;

   for( i = 1; i    {

    if(( j % i) == 0)

    { n ++;

    s =s - i;

     k [n ] = i;

    }

   }

  if(s == 0)

  {

  printf( "%d is a wanshu" , j);

  for( i = 0; i   printf( "%d," , k);

  printf( "%d /n " , k [n ]);

  }

}

}

題目:一球從 100 米高度自由落下,每次落地後反跳回原高度的一半;再落下,

求它在第 10 次落地時,共經過多少米?第 10 次反彈多高?

___________________________________________________________________

程式源代碼:

main()

{

float sn = 100.0 , hn =sn / 2;

int n;

for(n = 2;n <= 10;n ++)

  {

  sn =sn + 2 * hn;

   hn = hn / 2;

  }

printf( "the total of road is %f /n " ,sn);

printf( "the tenth is %f meter /n " , hn);

}

題目:一隻猴子摘了N 個桃子第一天吃了一半又多吃了一個 , 第二天又吃了餘下的

一半又多吃了一個 , 到第十天的時候發現還有一個 .

___________________________________________________________________

程式源代碼:

main()

{

int i ,s ,n = 1;

for( i = 1; i < 10; i ++)

{

s =(n + 1) * 2

n =s;

}

printf( "第一天共摘了%d個桃 /n " ,s);

}

疊代法求方程根

___________________________________________________________________

#define Epsilon 1.0E-6

#include<math.h>

main()

{

float a , x0 , x1;

printf( "請輸入要求的數:");

scanf( "%f" , & a);

x0 = a / 2;

x1 =( x0 + a / x0) / 2;

while( fabs( x1 - x0) >= Epsilon)

   {

   x0 = x1;

   x1 =( x0 + a / x0) / 2;

   }

printf( "%f的平方根:%f.5 /n " , x1);

}

#define Epsilon 1.0E-6

#include <stdio.h>

#include <math.h>

main()

{

float num , pre , this;

do

   {

   scanf( "%f" , & num);

   } while( num < 0);

if ( num == 0)

   printf( "the root is 0");

else

   {

   this = 1;

   do

   {

     pre = this;

     this =( pre + num / pre) / 2;

     } while( fabs( pre - this) > Epsilon);

   }

printf( "the root is %f" , this);

}

用牛頓疊代法 求方程 2 * x * x * x - 4 * x * x + 3 * x - 6 的根

#define Epsilon 1.0E-6

#include<math.h>

main()

{

   float x1 , x0 = 1.5;

   x1 = x0 -( 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) /( 6 * x0 * x0 - 8 * x0 + 3);

   while( fabs( x1 - x0 >= Epsilon)

   {  

       x0 = x1;

       x1 = x0 -( 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) /( 6 * x0 * x0 - 8 * x0 + 3);

   }

   printf( "方程的根為%f /n " , x1);

}

用二分法求上題

#define Epsilon 1.0E-5

#include<math.h>

main()

{

   folat x1 , x2 , x0 , f1 , f2 , f0;

   x0 =( x1 + x2) / 2;

   f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;  

   while( fabs( f0) >= Epsilon)

   {

     if( f0 * f1 < 0)

     { x2 = x0;

f2 = 2 * x2 * x2 * x2 - 4 * x2 * x2 + 3 * x2 - 6;

     }

     if( f0 * f2 < 0)

     { x1 = x0;

f1 = 2 * x1 * x1 * x1 - 4 * x1 * x1 + 3 * x1 - 6;

     }

     x0 =( x1 + x2) / 2;

     f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;

   }

   printf( "用二分法求得方程的根:%f /n " , x0);

}

題目:列印出如下圖案(菱形)

*

***

******

********

******

***

*

___________________________________________________________________

程式分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利

用雙重 for 循環,第一層控制行,第二層控制列。

___________________________________________________________________

程式源代碼:

main()

{

int i , j , k;

for( i = 0; i <= 3; i ++)

  {

  for( j = 0; j <= 2 - i; j ++)

   printf( " ");

  for( k = 0; k <= 2 * i; k ++)

   printf( "*");

  printf( " /n ");

  }

for( i = 0; i <= 2; i ++)

  {

  for( j = 0; j <= i; j ++)

   printf( " ");

  for( k = 0; k <= 4 - 2 * i; k ++)

   printf( "*");

  printf( " /n ");

  }

}

題目:一個 5 位數,判斷它是不是回文數。即 12321 是回文數,個位與萬位相同,

十位與千位相同。

___________________________________________________________________

程式分析:同 29 例

___________________________________________________________________

程式源代碼:

main( )

{

long ge , shi , qian , wan , x;

scanf( "%ld" , & x);

wan = x / 10000;

qian = x % 10000 / 1000;

shi = x % 100 / 10;

ge = x % 10;

if ( ge == wan && shi == qian)

  printf( "this number is a huiwen /n ");

else

  printf( "this number is not a huiwen /n ");

}

題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,

則繼續判斷第二個字母。

___________________________________________________________________

程式分析:用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或 if 語

句判斷第二個字母。

___________________________________________________________________

程式源代碼:

#include <stdio.h>

void main()

{

char letter;

printf( "please input the first letter of someday /n ");

while (( letter = getch()) != 'Y')

{ switch ( letter)

{ case 'S' : printf( "please input second letter /n ");

      if(( letter = getch()) == 'a')

       printf( "saturday /n ");

      else if (( letter = getch()) == 'u')

          printf( "sunday /n ");

        else printf( "data error /n ");

      break;

case 'F' : printf( "friday /n "); break;

case 'M' : printf( "monday /n "); break;

case 'T' : printf( "please input second letter /n ");

      if(( letter = getch()) == 'u')

       printf( "tuesday /n ");

      else if (( letter = getch()) == 'h')

          printf( "thursday /n ");

        else printf( "data error /n ");

      break;

case 'W' : printf( "wednesday /n "); break;

default : printf( "data error /n ");

   }

  }

}

題目: Press any key to change color , do you want to try it . Please

hurry up !

___________________________________________________________________

程式源代碼:

#include <conio.h>

void main( void)

{

int color;

for ( color = 0; color < 8; color ++)

  {

  textbackground( color);

  cprintf( "This is color %d /r/n " , color);

  cprintf( "ress any key to continue /r/n ");

  getch();

  }

}

題目:學習 gotoxy() 與 clrscr() 函數

___________________________________________________________________

程式源代碼:

#include <conio.h>

void main( void)

{

clrscr();

textbackground( 2);

gotoxy( 1 , 5);

cprintf( "Output at row 5 column 1 /n ");

textbackground( 3);

gotoxy( 20 , 10);

cprintf( "Output at row 10 column 20 /n ");

}

題目:練習函數調用

___________________________________________________________________

程式源代碼:

#include <stdio.h>

void hello_world( void)

{

printf( "Hello, world! /n ");

}

void three_hellos( void)

{

int counter;

for ( counter = 1; counter <= 3; counter ++)

hello_world();

}

void main( void)

{

three_hellos();

}

題目:文本顔色設定

___________________________________________________________________

程式源代碼:

#include <conio.h>

void main( void)

{

int color;

for ( color = 1; color < 16; color ++)

  {

  textcolor( color);

  cprintf( "This is color %d /r/n " , color);

  }

textcolor( 128 + 15);

cprintf( "This is blinking /r/n ");

}

題目:求 100 之内的素數

___________________________________________________________________

程式源代碼:

#include <stdio.h>

#include "math.h"

#define N 101

main()

{

int i , j , line , a [N ];

for( i = 2; i <N; i ++) a = i;

for( i = 2; i < sqrt(N); i ++)

  for( j = i + 1; j <N; j ++)

  {

   if( a != 0 && a [ j ] != 0)

   if( a [ j ] % a == 0)

   a [ j ] = 0 ;}

printf( " /n ");

for( i = 2 , line = 0; i <N; i ++)

{

  if( a != 0)

  { printf( "%5d" , a);

  line ++ ;}

  if( line == 10)

  { printf( " /n ");

line = 0 ;}

}

}

題目:對 10 個數進行排序

___________________________________________________________________

程式分析:可以利用選擇法,即從後 9 個比較過程中,選擇一個最小的與第一個

元素交換,下次類推,即用第二個元素與後 8 個進行比較,并進行交換。    

   

程式源代碼:

#define N 10

main()

{ int i , j , min , tem , a [N ];

printf( "please input ten num: /n ");

for( i = 0; i <N; i ++)

{

printf( "a[%d]=" , i);

scanf( "%d" , & a );}

printf( " /n ");

for( i = 0; i <N; i ++)

printf( "%5d" , a);

printf( " /n ");

for( i = 0; i <N - 1; i ++)

{ min = i;

for( j = i + 1; j <N; j ++)

if( a [ min ] > a [ j ]) min = j;

tem = a;

a = a [ min ];

a [ min ] = tem;

}

printf( "After sorted /n ");

for( i = 0; i <N; i ++)

printf( "%5d" , a);

}

題目:求一個 3 * 3 矩陣對角線元素之和

___________________________________________________________________

程式分析:利用雙重 for 循環控制輸入二維數組,再将 a 累加後輸出。

___________________________________________________________________

程式源代碼:

main()

{

float a [ 3 ][ 3 ], sum = 0;

int i , j;

printf( "please input rectangle element: /n ");

for( i = 0; i < 3; i ++)

  for( j = 0; j < 3; j ++)

  scanf( "%f" , & a [ j ]);

for( i = 0; i < 3; i ++)

  sum = sum + a;

printf( "duijiaoxian he is %6.2f" , sum);

}

題目:有一個已經排好序的數組。現輸入一個數,要求按原來的規律将它插入數

組中。

___________________________________________________________________

程式分析:首先判斷此數是否大于最後一個數,然後再考慮插入中間的數的情況

,插入後此元素之後的數,依次後移一個位置。

___________________________________________________________________

程式源代碼:

main()

{

int a [ 11 ] = { 1 , 4 , 6 , 9 , 13 , 16 , 19 , 28 , 40 , 100 };

int temp1 , temp2 , number , end , i , j;

printf( "original array is: /n ");

for( i = 0; i < 10; i ++)

  printf( "%5d" , a);

printf( " /n ");

printf( "insert a new number:");

scanf( "%d" , & number);

end = a [ 9 ];

if( number > end)

  a [ 10 ] = number;

else

  { for( i = 0; i < 10; i ++)

   { if( a > number)

    { temp1 = a;

     a = number;

    for( j = i + 1; j < 11; j ++)

    { temp2 = a [ j ];

     a [ j ] = temp1;

     temp1 = temp2;

    }

    break;

    }

   }

}

for( i = 0; i < 11; i ++)

  printf( "%6d" , a);

}

題目:将一個數組逆序輸出。

___________________________________________________________________

程式分析:用第一個與最後一個交換。

___________________________________________________________________

程式源代碼:

#define N 5

main()

{ int a [N ] = { 9 , 6 , 5 , 4 , 1 }, i , temp;

  printf( " /n original array: /n ");

  for( i = 0; i <N; i ++)

  printf( "%4d" , a);

  for( i = 0; i <N / 2; i ++)

  { temp = a;

   a = a [N - i - 1 ];

   a [N - i - 1 ] = temp;

  }

printf( " /n sorted array: /n ");

for( i = 0; i <N; i ++)

  printf( "%4d" , a);

}

題目:學習 static 定義靜态變量的用法

___________________________________________________________________

程式源代碼:

#include "stdio.h"

varfunc()

{

int var = 0;

static int static_var = 0;

printf( " /40 :var equal %d /n " , var);

printf( " /40 :static var equal %d /n " , static_var);

printf( " /n ");

var ++;

static_var ++;

}

void main()

{ int i;

  for( i = 0; i < 3; i ++)

   varfunc();

}

題目:學習使用 auto 定義變量的用法

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{ int i , num;

num = 2;

  for ( i = 0; i < 3; i ++)

  { printf( " /40 : The num equal %d /n " , num);

   num ++;

   {

   auto int num = 1;

   printf( " /40 : The internal block num equal %d /n " , num);

   num ++;

   }

  }

}

C 語言的學基礎, 100 個經典的算法-2

程式源代碼:

#include "stdio.h"

main()

{

int i , num;

num = 2;

for( i = 0; i < 3; i ++)

{

printf( " /40 : The num equal %d /n " , num);

num ++;

{

static int num = 1;

printf( " /40 :The internal block num equal %d /n " , num);

num ++;

}

}

}

題目:學習使用 external 的用法。

___________________________________________________________________

程式源代碼:

#include "stdio.h"

int a ,b , c;

void add()

{ int a;

a = 3;

c = a +b;

}

void main()

{ a =b = 4;

add();

printf( "The value of c is equal to %d /n " , c);

}

題目:學習使用 register 定義變量的方法。

___________________________________________________________________

程式源代碼:

void main()

{

register int i;

int tmp = 0;

for( i = 1; i <= 100; i ++)

tmp += i;

printf( "The sum is %d /n " , tmp);

}

題目:宏# define 指令練習( 1)

___________________________________________________________________

程式源代碼:

#include "stdio.h"

#define TRUE 1

#define FALSE 0

#define SQ(x) (x)*(x)

void main()

{

int num;

int again = 1;

printf( " /40 : Program will stop if input value less than 50. /n ");

while( again)

{

printf( " /40 lease input number==>");

scanf( "%d" , & num);

printf( " /40 :The square for this number is %d /n " , SQ( num));

if( num >= 50)

  again = TRUE;

else

  again = FALSE;

}

}

題目:宏# define 指令練習( 2)

___________________________________________________________________

程式源代碼:

#include "stdio.h"

#define exchange(a,b)

{ /

  int t; /

  t = a; /

  a =b; /

 b = t; /

}

void main( void)

{

int x = 10;

int y = 20;

printf( "x=%d; y=%d /n " , x , y);

exchange( x , y);

printf( "x=%d; y=%d /n " , x , y);

}

題目:宏# define 指令練習( 3)

___________________________________________________________________

程式源代碼:

#define LAG >

#define SMA <

#define EQ ==

#include "stdio.h"

void main()

{ int i = 10;

int j = 20;

if( i LAG j)

printf( " /40 : %d larger than %d /n " , i , j);

else if( i EQ j)

printf( " /40 : %d equal to %d /n " , i , j);

else if( i SMA j)

printf( " /40 :%d smaller than %d /n " , i , j);

else

printf( " /40 : No such value. /n ");

}

題目:# if # ifdef 和# ifndef 的綜合應用。

___________________________________________________________________

程式源代碼:

#include "stdio.h"

#define MAX

#define MAXIMUM(x,y) (x>y)?x:y

#define MINIMUM(x,y) (x>y)?y:x

void main()

{ int a = 10 ,b = 20;

#ifdef MAX

printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));

#else

printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));

#endif

#ifndef MIN

printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));

#else

printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));

#endif

#undef MAX

#ifdef MAX

printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));

#else

printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));

#endif

#define MIN

#ifndef MIN

printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));

#else

printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));

#endif

}

題目:# include 的應用練習

___________________________________________________________________

程式源代碼:

test . h 檔案如下:

#define LAG >

#define SMA <

#define EQ ==

#include "test.h"

#include "stdio.h"

void main()

{ int i = 10;

int j = 20;

if( i LAG j)

printf( " /40 : %d larger than %d /n " , i , j);

else if( i EQ j)

printf( " /40 : %d equal to %d /n " , i , j);

else if( i SMA j)

printf( " /40 :%d smaller than %d /n " , i , j);

else

printf( " /40 : No such value. /n ");

}

題目:學習使用按位與 & 。   

___________________________________________________________________

程式分析: 0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{

int a ,b;

a = 077;

b = a & 3;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

b &= 7;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

}

題目:學習使用按位或 | 。

___________________________________________________________________

程式分析: 0| 0 = 0; 0| 1 = 1; 1| 0 = 1; 1| 1 = 1            

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{

int a ,b;

a = 077;

b = a| 3;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

b |= 7;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

}

題目:學習使用按位異或 ^ 。   

___________________________________________________________________

程式分析: 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{

int a ,b;

a = 077;

b = a ^ 3;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

b ^= 7;

printf( " /40 : The a & b(decimal) is %d /n " ,b);

}

題目:取一個整數 a 從右端開始的 4 ~ 7 位。

___________________________________________________________________

  程式分析:可以這樣考慮:

( 1) 先使 a 右移 4 位。

( 2) 設定一個低 4 位全為 1 , 其餘全為 0 的數。可用 ~( ~ 0 << 4)

( 3) 将上面二者進行 & 運算。

___________________________________________________________________

程式源代碼:

main()

{

unsigned a ,b , c , d;

scanf( "%o" , & a);

b = a >> 4;

c =~( ~ 0 << 4);

d =b & c;

printf( "%o /n %o /n " , a , d);

}

題目:學習使用按位取反 ~ 。   

___________________________________________________________________

程式分析: ~ 0 = 1; ~ 1 = 0;

___________________________________________________________________

程式源代碼:

#include "stdio.h"

main()

{

int a ,b;

a = 234;

b =~ a;

printf( " /40 : The a's 1 complement(decimal) is %d /n " ,b);

a =~ a;

printf( " /40 : The a's 1 complement(hexidecimal) is %x /n " , a);

}

題目:畫圖,學用 circle 畫圓形。

___________________________________________________________________

程式源代碼:

#include "graphics.h"

main()

{

int driver , mode , i;

float j = 1 , k = 1;

driver = VGA; mode = VGAHI;

initgraph( & driver , & mode , "");

setbkcolor( YELLOW);

for( i = 0; i <= 25; i ++)

   {

   setcolor( 8);

   circle( 310 , 250 , k);

   k = k + j;

   j = j + 0.3;

   }

}

題目:畫圖,學用 line 畫直線。

___________________________________________________________________

     

程式源代碼:

#include "graphics.h"

main()

{

int driver , mode , i;

float x0 , y0 , y1 , x1;

float j = 12 , k;

driver = VGA; mode = VGAHI;

initgraph( & driver , & mode , "");

setbkcolor( GREEN);

x0 = 263; y0 = 263; y1 = 275; x1 = 275;

for( i = 0; i <= 18; i ++)

   {

   setcolor( 5);

   line( x0 , y0 , x0 , y1);

   x0 = x0 - 5;

   y0 = y0 - 5;

   x1 = x1 + 5;

   y1 = y1 + 5;

   j = j + 10;

   }

x0 = 263; y1 = 275; y0 = 263;

for( i = 0; i <= 20; i ++)

   {

   setcolor( 5);

   line( x0 , y0 , x0 , y1);

   x0 = x0 + 5;

   y0 = y0 + 5;

   y1 = y1 - 5;

   }

}

題目:畫圖,學用 rectangle 畫方形。   

___________________________________________________________________

 

程式分析:利用 for 循環控制 100 - 999 個數,每個數分解出個位,十位,百位。

___________________________________________________________________

 

程式源代碼:

#include "graphics.h"

main()

{

int x0 , y0 , y1 , x1 , driver , mode , i;

driver = VGA; mode = VGAHI;

initgraph( & driver , & mode , "");

setbkcolor( YELLOW);

x0 = 263; y0 = 263; y1 = 275; x1 = 275;

for( i = 0; i <= 18; i ++)

   {

   setcolor( 1);

   rectangle( x0 , y0 , x1 , y1);

   x0 = x0 - 5;

   y0 = y0 - 5;

   x1 = x1 + 5;

   y1 = y1 + 5;

   }

settextstyle( DEFAULT_FONT , HORIZ_DIR , 2);

outtextxy( 150 , 40 , "How beautiful it is!");

line( 130 , 60 , 480 , 60);

setcolor( 2);

circle( 269 , 269 , 137);

}

繼續閱讀