long在C语言中是非法字符吗,C程序设计实践——实验指导
一、課程的總體目標和具體要求
總體目標:
利用C語言和程序設計方法編制程序,借助計算機解決問題的基本能力。(支撐畢業能力要求1)獨立解決文本處理、數學上的一些問題,編寫較規范化的代碼。(支撐畢業能力要求3)綜合運用數學和程序設計方法,設計有實用背景和一定規模的應用問題的解決方案,可在較短計劃時間內實現核心代碼,撰寫實驗報告。(支撐畢業能力要求3)選擇、運用工具構建實驗、項目并熟練進行程序編輯、調試、運行得到結果。(支撐畢業能力要求4)
具體要求: 1.了解和使用Turbo C和Visual C++6.0的集成開發環境 2.理解C語言的程序結構 3.熟練掌握輸入輸出等交互方式 4.體會將待處理的問題轉換為算法描述,學會發現規律,并編程實現 5.體會用計算機進行數學計算的特點 6.熟練掌握選擇結構流程控制 7.熟練掌握不同的條件控制語句,體會其應用方法 8.熟練掌握循環結構流程控制 9.熟練掌握選擇結構與循環結構的嵌套 10.掌握一維數組和二維數組的定義、賦值和輸入輸出方法 11.掌握主要的數組有關的算法 12.學會進行矩陣運算 13.字符處理及字符數組的使用 14.掌握函數的定義與使用 15.理解函數的參數傳遞方式,掌握函數傳值及傳址方法 16.掌握指針的概念和使用方法 17.比較指針操作與數組操作的一致性 18.體會指針在字符串操作中的應用 19.學習C語言中復雜數據類型的定義和使用方法 20.學習應用位運算 21.學會測試程序,發現非語法方面的錯誤 22.學習考慮邊界條件,學習從用戶角度思考問題 23.查找資料,自學圖形設計相關內容 24.完成有實用背景的應用程序的設計、編程、調試全過程并撰寫實驗報告
二、實驗環境
計算機的硬件環境: 目前各實驗室使用的PC兼容機或品牌機,均能滿足該課的實驗要求。 計算機的軟件環境: 在Windows 操作系統環境下,使用Turbo C或Visual C++6.0可視化程序語言。 Turbo C是一個常用的、最基本的C語言工具,一般簡稱TC。它為C語言開發提供了操作便利的集成環境。源程序的輸入、修改、調試及運行都可以在TC集成環境下完成,非常方便有效。TC系統非常小巧,但功能齊全。它主要支持DOS環境,因此在操作中無法使用鼠標,更多的需要通過鍵盤操縱菜單或快捷鍵完成。 C++是一個面向對象的程序設計(OOP)語言,是C語言的進一步發展,已成為當今最流行的一種程序設計語言。Visual C++6.0是Windows環境下最主要的應用開發系統之一,它是C++語言的集成開發環境,也可以很好地進行C語言應用程序的開發。
三、實驗內容及主要設計思路、算法原理
第一部分 基本程序
1. 第一天內容
講解內容: 選擇結構:if語句、switch語句; 循環結構:while語句、do_while語句、for語句; 函數:函數的定義、函數說明、函數的調用。 重點講解函數的設計思路。 練習內容:
1.1
編寫一個函數fun,然后設計主函數調用函數fun。函數fun的功能是:求兩數平方根之和,作為函數值返回。例如:輸入12和20,輸出結果為: y = 7.936238。
#include
#include
double fun(int m,int n)
{
double s;
s=sqrt(m)+sqrt(n);
return s;
}
void main()
{
int a,b;
printf("請輸入兩個要求平方根的數:");
scanf("%d%d",&a,&b);
printf("%lf",fun(a,b));
}
1.2
編寫一個函數fun,然后設計主函數調用函數fun。函數fun的功能是:計算正整數num的各位上的數字之積。例如,若輸入:252,則輸出應該是:20。若輸入:202,則輸出應該是:0。
#include
int fun(int x)
{
int a=1;
while(x)
{
a *= (x % 10);
x /= 10;
}
return a;
}
void main()
{
int p;
printf("請輸入一個整數:");
scanf("%d",&p);
printf("%d\n",fun(p));
}
1.3
編寫一個函數fun,然后設計主函數調用函數fun。函數fun的功能是:通過某種方式實現兩個變量值的交換。例如變量a中的值原為5,b中的值原為3,程序運行后a中的值為3,b中的值為5。
#include
void fun(int *a,int *b)
{
int p;
p=*a;
*a=*b;
*b=p;
}
void main()
{
int x,y;
printf("請輸入要交換的兩個數:");
scanf("%d %d",&x,&y);
printf("交換前:");
printf("%d %d\n",x,y);
fun(&x,&y);
printf("交換后:");
printf("%d %d\n",x,y);
}
1.4
編寫一個函數fun,然后設計主函數調用函數fun。函數fun的功能是:求出兩個非零正整數的最大公約數(考慮遞歸和非遞歸兩種方法,任選一種實現),并作為函數值返回。再設計一個函數,函數的功能是計算兩個非零正整數的最小公倍數。
#include
int fun(int u,int v)
{
int y,t,s;
s=u*v;
if(u
{
t=u;
u=v;
v=t;
}
while(v)
{
y=u%v;
u=v;
v=y;
}
return u;
}
int fun_(int x,int y)
{
return x*y/fun(x,y);
}
void main()
{
int x,y;
printf("請輸入兩個數:");//求最大公因數與最小公倍數//
scanf("%d %d",&x,&y);
printf("最大公因數:");
printf("MAX:%d\n",fun(x,y));
printf("最小公倍數:");
printf("min:%d\n",fun_(x,y));
}
5. 用下述公式求π的近似值,直到最后一項的絕對值小于指定的數(參數num)為止:
Π/4≈1-1/3 + 1/5- 1/7+…… 例如,若輸入值為0.0001,則程序的輸出3.1414。
#include
#include
float fun(float num)
{
int s;
float n,t,pi;
t=1; pi=0; n=1; s=1;
while(fabs(t)>=num)
{
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
} pi=pi*4;
return pi;
}
void main()
{
float n1,n2;
/*? ? clrscr ();*/
printf("Enter a float number:");
scanf("%f",&n1);
n2=fun(n1);
printf("%6.4f\n",n2);
}
2. 第二天內容
講解內容:進制轉換的基本設計思想,循環結構程序設計的一般規律,用程序實現數學表達的方法。 練習內容:
2.1
請編寫函數float fun(float x, int m),它的功能是:將浮點數x保留m位小數(m不大于6),第m+1位四舍五入。例如,輸入123.456,保留2位小數應輸出123.46(或123.459999)。
#include
#include
double fun(double m,int n)
{
m*=pow(10,n);
if(m-(int)(m)>=0.5)
m++;
else
m=m-(m-(int)(m));
m=(int)m/(double)pow(10,n);
return m;
}
void main()
{
double m;
int n;
scanf("%lf",&m);
scanf("%d",&n);
printf("%lf",fun(m,n));
}
2.2
請編寫一個函數unsigned fun ( unsigned w ), w是一個大于10的無符號整數,若w是n (n≥2)位的整數,函數求出w的后n-1位的數作為函數值返回。
#include
#include
unsigned fun(unsigned w)
{
int n=0,t;
int m=w;
while(w)
{
n++;
t=w;
w/=10;
}
w=m-(t*pow(10,n-1));
return w;
}
void main()
{
unsigned w;
scanf("%d",&w);
fun(w);
printf("%d",w);
}
2.3
編寫一個函數fun,函數fun的功能是:從低位開始取出長整型變量s中偶數位上的數,依次構成一個新數放在t中。例如,當s中的數為:7654321時,t中的數為:642.
#include
#include
long fun(long s)
{
long n=0,t1;
long t;
while(s)
{
s/=10;
t1=s%10;
s/=10;
t+=t1*pow(10,n);
n++;
}
return t;
}
void main()
{
long s;
scanf("%ld",&s);
printf("%ld",fun(s));
}
2.4
將十進制正整數轉換成k進制(2<=k<=9)數的數字輸出。例如,若輸入8和2,則應輸出1000(即十進制數8轉換成二進制表示1000)。
#include
int main()
{
int a,b,c=0,d=1;
scanf("%d",&a);
scanf("%d",&b);
for(;a!=0;)
{
c=c+a%b*d;
a=a/b;
d=d*10;
}
printf("%d",c);
return 0;
}
2.5
求出1!、3!、5!、…、k!(k是小于9的奇數)。例如:若k=7,則應輸出: 1.00000 6.00000 120.00000 5040.00000。
#include
void main()
{
double k,d,s=1;
printf("k是小于9的奇數:");
scanf("%lf",&k);
while(k>0)
{
d=k;
s=1;
while(d)
{
s*=d;
d--;
}
printf("%lf\n",s);
k-=2;
}
}
2.6
求 (此處a和n的值在1至9之間, 表示由n個a組成的整數) 例如,a=2,n=6,則以上表達式為: s=222222-22222-2222-222-22-2 其和值是:197532。
#include
void main()
{
int i,j,s=0,t;
int a,n;
scanf("%d %d",&a,&n);
for(i=0;i
{
s+=a;
a=a*10;
}
t=s;
while(t)
{
t/=10;
s-=t;
}
printf("%d",s);
}
2.7
編寫一個函數float fun(float eps),它的功能是: 根據如下公式計算e的值:1+1/1!+1/2!+1/3!+…+1/n!+… 其中的eps是指定的精度。
#include
float fun(float eps)
{
float e=1;
float i,j,s=1;
for(i=1;1/i>eps;i++)
{
i=j;
while(j)
{
s*=j;
j--;
}
e+=1/s;
}
return e;
}
void main(){
float h;
scanf("%f",&h);
printf("%f",fun(h));}
2.8
編寫一個函數fun,然后設計主函數調用函數fun。 函數fun的功能是:統計不超過一個整數m(包括m且m>=3)的素數個數(不包括1和2)。
#include
int fun(int s)
{
int i,j,k;
k=0;
for(i=3;i<=s;i++)
{
for(j=2;j
{
if(i%j==0)
break;
if(j==i-1)
k++;
}
}
return k;
}
void main()
{
int m;
scanf("%d",&m);
printf("%d",fun(m));
}
3. 第三天內容
講解內容:指針的概念與運算、指針作函數的參數、一維數組的定義和引用、一維數組和指針的關系、字符數組作字符串變量、指向字符串常量的指針變量、字符串操作函數。重點講解指針操作數組的思路。 練習內容:
3.1
編寫一個函數len,其功能是計算出一個字符串中含有的所有字符個數(不使用庫函數strlen)。
#include
int len(char *s)
{
int n=0;
while(*s)
{
n++;
s++;
}
return n;
}
void main()
{
char s[100];
gets(s);
printf("%d\n",len(s));
}
3.2
編寫函數fun,函數的功能是:計算一個字符串s中的所含有的指定字符的個數,返回此值。 例如,輸入字符串"Thisisastring",被查找字符為’i’,則應輸出3。
#include
int fun(char *s,char k)
{
int n;
n=0;
while(*s)
{
if(*s==k)
n++;
s++;
}
return n;
}
void main()
{
int s;
char a[100],k;
gets(a);
scanf("%c",&k);
s=fun(a,k);
printf("%d",s);
}
3.3
編寫程序,讀入一個英文文本行,將其中每個單詞的第一個字母改成大寫,然后輸出此文本行(這里的“單詞”是指由空格隔開的字符串)。
#include
#include
void main()
{
char a[100];
int k,i;
while(gets(a))
{
k=strlen(a);
a[0]-=32;
for(i=0;i
{
if(a[i]==' ')
a[i+1]-=32;
printf("%c",a[i]);
}
printf("\n");}}
3.4
編寫函數fun,其功能是刪除一個字符串中的所有空格。 例如,輸入字符串"This is a string",則應輸出"Thisisastring"。
#include
void fun(char *s)
{
char *p;
while(*s)
{
if(*s==' ')
{
p=s;
while(*p)
{
*p=*(p+1);
p++;
}
}
else
s++;
}}
void main()
{
char a[100];
gets(a);
fun(a);
puts(a);
}
3.5
編寫函數fun,函數fun 的功能是:將字符串a中的所有字符復制到字符串b中,要求每復制三個字符之后插入一個空格。
#include
void fun(char *a,char *b)
{
int i;
while(*a)
{
for(i=0;i<3;i++)
{
*b=*a;
if(*a='\0')
break;
a++;
b++;
}
while(*a!='\0')
{
*b=' ';
b++;
break;
}}}
void main()
{
char a[100],b[100];
gets(a);
fun(a,b);
puts(b);
}
3.6
編寫函數,函數fun的功能是:在字符串str中找出ASCII碼值最大的字符,將其放在第一個位置上,并將該字符前的原字符向后順序移動。
#include
void fun(char *p)
{
char max;
int i=0,q;
max=p[0];
while(p[i])
{
if(max
{
max=p[i];
q=i;
}
i++;
}
while(q)
{
p[q]=p[q-1];
q--;
}
p[0]=max;
}
void main(){
char str[80];
gets(str);
fun(str);
printf("移動后:");
puts(str);
}
3.7
編寫函數,函數fun 的功能是:首先把b所指字符串中的字符按逆序存放,然后將a所指字符串中的字符和b所指字符串中的字符,按排列的順序交叉合并到c所指數組中,過長的剩余字符接在c所指數組的尾部。 例如,當a所指字符串中的內容為“abcdefg”,b所指字符串中的內容為“1234”時,c所指數組中的內容應該為“a4b3c2d1efg”;而當a所指字符串中的內容為“1234”,b所指字符串中的內容為“abcdefg”時,c所指數組中的內容應該為“1g2f3e4dcba”。
#include
#include
void fun(char *a,char *b,char *c)
{
int i,j,n,k;
int p;
char t;
k=0;
j=strlen(b)-1;
for(i=0;i
{
t=b[i];
b[i]=b[j];
b[j]=t;
j--;
}
j=0;p=0;
n=strlen(a)+strlen(b);
for(i=0;i<=n;i++)
{
if(i%2==0)
{
if(a[j]!='\0')
{
c[k]=a[j];
k++;
j++;
}
if(a[j]=='\0')
{
c[k]=b[p];
k++;
p++;
}
}
if(i%2==1)
{
if(b[p]!='\0')
{
c[k]=b[p];
k++;
p++;
}
if(b[p]=='\0')
{
c[k]=a[j];
j++;
k++;
}}}}
void main()
{
char a[100],b[100],c[100];
gets(a);
gets(b);
fun(a,b,c);
puts(c);
}
4. 第四天內容
講解內容:選擇排序法、冒泡排序法、簡單插入排序法和查找與替換方法。引導學生考慮設計高效的算法。 練習內容:
4.1
用選擇排序法對數組a的元素從小到大排序。例如,輸入2 5 4 1 6 2 7 3 2 9 4,則應輸出1 2 2 2 3 4 5 6 7 9。 選擇排序法采取如下思想對數組a的元素從小到大排序: 將數組a的元素處理n-1次,第k次處理時僅處理前n-k個元素,方法是選擇出這k個元素中的最大元素,并將其與這些元素中的最后一個交換。當然,也可以按每次選擇最小元素的辦法進行選擇排序。
# include
void sort(int *a,int n)
{
int i,j,t,m;
for (i = 0; i < n - 1; i++){
m = i;
for (j = i + 1; j < n; j++)
if ( *(a+j)
m = j;
if(i!=m)
{
t=*(a+i);
*(a+i)=*(a+m);
*(a+m)=t;}}}
void main()
{
int i,n,a[100];
printf("請輸入數組個數n:");
scanf("%d",&n);
printf("請輸入%d個元素:",n);
for(i=0;i
scanf("%d",&a[i]);
sort(a,n);
for(i=0;i
printf("%-7d",a[i]);
}
4.2
下述程序中,函數fun的功能是:用冒泡法對6個字符串按由小到大的順序進行排序。 冒泡排序基本思路:所謂“冒泡排序”,也稱“起泡排序”或者“氣泡排序”,是指這樣的一種簡單排序方法,若被排序的數組元素個數為N,可以對此數組做N-1次處理。 在第k次(k=0, 1, …, N-1)處理時,需比較前N-k個元素,方法是:連續從前到后比較相鄰的兩個元素,如果后面的元素小于前面的元素,則將二者交換,否則不變。 可見,每經過一次處理,至少此次被處理的N-k個元素中的最大元素被移到了本次處理的最后位置,而N-1次處理后就使所有的元素被排序。
#include
#include
#include
int maopao(int *a,int size)
{
int i,j,t;
if(size <= 0) return -1;
if(a == NULL ) return -1;
for(i=0;i
{
for(j=0;j
{
if(a[j] > a[j+1])
{
t = a[j] ;
a[j] = a[j+1];
a[j+1] = t;}}}
return 0;
}
int main(int argc, const char *argv[])
{
int i ,ret,b[10]={0};
printf("從終端輸入10個數:");
for(i=0;i<10;i++)
{
scanf("%d",&b[i]);
}
printf("數組的內容:");
for(i=0;i<10;i++)
{
printf("%4d",b[i]);
}
printf("\n");
printf("數組升序排列后:");
ret = maopao(b,10);
if(ret < 0 )
{
printf("maopao is error\n");
exit(-1);
}
for(i=0;i<10;i++)
{
printf("%4d",b[i]);
}
printf("\n");
return 0;
}
4.3
編寫函數fun,函數fun的功能是:利用插入排序法對字符串中的字符按從小到大的順序進行排序。 插入法的基本算法思路是:先對字符串中的頭兩個元素進行排序。然后把第三個字符插入到前兩個字符中,插入后前三個字符依然有序;再把第四個字符插入到前三個字符中,……。待排序的字符串已在主函數中賦值。
#include
#include
#define N 80
void fun(char *a)
{
int i,j,n;
char ch;
n=strlen(a);
for(i=1;i
{
ch=a[i];
j=i-1;
while((j>=0)&&(ch
{
a[j+1]=a[j];
j--;
}
a[j+1]=ch;
}}
void main()
{
char a[N];
gets(a);
fun(a);
puts(a);
}
4.4
編寫一個函數,其功能是統計一個子字符串在另一個字符串中出現的次數。例如,假定輸入的字符串為"this is a string",子字符串為"is",則應輸出2。 設計思路:
⑴分析參數與返回值。
本例中函數fun的參數的含義為:母字符串str和子字符串sub。該函數需要統計子字符串出現的個數,返回值是int類型,必然是統計后所得的出現次數值,觀察main函數中的輸出也能肯定這一點。
⑵整理編程思路。
編寫該函數需要使用一個循環,循環中可以考慮通過一個字符類型的指針在str中由前到后移動,每次移動一個字符位,且將目前指針位置開始的m個字符與sub所包含的全部m個字符比較(假定sub的長度是m),若二者相同則說明子字符串在母字符串中出現一次,進行累計,否則不累計。無論如何,將指針再移到下一個字符位,進行下一次循環比較。
⑶細節考慮。
首先,為了實現兩組m個字符的比較,一個可行的辦法是寫一個函數來實現,但程序不允許再編寫其它函數,只能使用庫函數或自己構成循環。能夠使用的庫函數是定義在string.h中的strstr,其函數原型如下: char* strstr(char* str, char* sub)
#include
int fun(char *a,char *b)
{
char *p;
int n=0;
while(*a)
{
p=b;
if(*a==*p)
{
while(*a==*p)
{
a++;
p++;
if(*p=='\0')
{
n++;
}}}
else
{
a++;
}}
return n;
}
void main()
{
char a[100],b[20];
gets(a);
gets(b);
printf("%d\n",fun(a,b));
}
4.5
N個有序整數數列已放在一堆數組中。下述程序中的函數fun的功能是:利用折半查找算法查找整數m在數組中的位置。若找到返回其下標值;反之,返回-1 折半查找設計思想:折半查找也稱為二分查找或二分檢索,其基本思想是,在一個數組中查找某個值m是否存在時,每次查找前先確定數組中待查的范圍:low和hitgh (low high,查找結束。
#include
int fun(int *s,int m)
{
int low=0,high,mid;
high=sizeof(s)/2;
mid=(low+high)/2;
while(1)
if(m>s[mid])
{
low=mid+1;
mid=(low+high)/2;}
else
if(m
{
high=mid-1;
mid=(low+high)/2;}
else
{
return mid;}
return -1;
}
void main()
{
int a[100];
int b,i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
scanf("%d",&b);
printf("%d",fun(a,b));? ? ?}
4.6
請編寫函數int* fun(char* st),其中st是僅由字符a、b和c組成的字符串。 函數的功能是:統計字符串st中’a’、’b’和’c’的個數并分別存入不同的內存區,帶回內存區的首地址。
#include
int* fun(char *st,int a[3])
{
while(*st)
{
if(*st=='a')
{
a[0]++;
}
if(*st=='b')
{
a[1]++;
}
if(*st=='c')
{
a[2]++;
}
st++;
}
return a;}
void main()
{
char a[100];
int b[3]={0,0,0};
int i;
int *p;
gets(a);
p=fun(a,b);
for(i=0;i<3;i++)
printf("%d,",*p++);
}
5. 第五天內容
講解內容:二維數組的定義、引用與初始化、二維數組與指針的關系(二維數組的一維表示、對二維數組的約定、指向一維數組的指針變量、二維數組作函數的參數和用二維數組操作字符串)。 練習內容:
5.1
將數組x的元素倒置輸出。例如,若輸入1 2 3 4 5,則應輸出5 4 3 2 1。
#include
void main()
{
int i,n,a[10];
printf("請輸入數組個數:");
scanf("%d",&n);
printf("請輸入數組:");
for(i=0;i
scanf("%d",&a[i]);
for(i=n-1;i>=0;i--)
printf("%2d",a[i]);
}
5.2
請編寫函數void fun ( int aa[ ], int x, int *n ),它的功能是:刪除數組aa中所有與x相等的元素,數組元素個數由n傳入。
#include
void fun(int aa[],int x,int *n)
{
int i,j;
for(i=0;i
{
if(aa[i]==x)
{
for(j=i;j
aa[j]=aa[j+1];
(*n)--;
i--;}}}
void main()
{
int a[100],x;
int n,i;
printf("請輸入數組元素個數:");
scanf("%d",&n);
printf("請輸入數組:");
for(i=0;i
scanf("%d",&a[i]);
printf("請輸入刪除的元素:");
scanf("%d",&x);
fun(a,x,&n);
for(i=0;i
printf("%2d",a[i]);
}
5.3
請編函數void fun(int *a, int *b),它的功能是:求出1到100之內被7或11整除的所有整數放在數組a中,通過n返回這些數的個數。
#include
void fun(int *a, int *b)
{
int i;
for (i = 1; i <=100; i++)
if (i%7==0 || i%11==0)
{
*a=i;
a++;
(*b)++;}}
int main()
{
int i,n=0;
int m[100];
fun(m,&n);
printf("%d\n",n);
for(i=0;i
printf("%d",m[i]);
return 0;
}
5.4
編寫函數int fun (int lim, int aa[MAX] ),該函數的功能是求出小于lim的所有素數并放在aa數組中,該函數返回所求出素數的個數。然后編寫主函數調用它。
#include
int fun(int lim,int aa[100])
{
int i,MAX=0,j;
for(i=0;i<=lim;i++)
{
for(j=2;j
{
if(i%j==0)
break;
if(i==j+1)
{
aa[MAX]=i;
MAX++;
}}}
return MAX;
}
void main()
{
int lim,aa[100];
scanf("%d",&lim);
printf("%d",fun(lim,aa));
}
5.5
輸入一個3行3列矩陣的所有元素,然后輸出對角線元素之和。
#include
void main()
{
int a[3][3];
int i,j,s=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
for(i=0;i<3;i++)
{
s+=a[i][i];
}
printf("%d",s);
}
5.6
編寫函數,其功能是:實現矩陣(3行3列)的轉置(即行列互換)。
#include
void main()
{
int a[3][3],i,j;
for(i=0;i<9;i++)
scanf("%d",&a[0][0]+i);
printf("原矩陣:\n");
for(i=0;i<9;i++)
{? ? printf("%2d",a[0][0]+i);
if(i%3==2)
printf("\n");
}
printf("轉置后矩陣:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{? ? printf("%2d",a[j][i]);
if(j==2)
printf("\n");
}}}
6. 第六天內容
講解內容:遞歸函數、動態內存管理、結構體類型的定義、結構體變量的定義、結構體變量的成員、整體引用結構體、結構體數據在函數間傳遞、結構體變量的初始化、結構體數組、結構體指針、單鏈表。重點講解鏈表。 練習內容:
6.1
請編寫函數int fun(double a[ ], int k, int m, double x),它的功能是:用遞歸方法在數組a中查找x是否出現,其中數組a的元素已按由大到小的次序排序,k和m是數組的最小和最大下標,函數采用二分查找算法,若找到則返回1,否則返回0。
#include
#include
typedef struct node
{
int data;
struct node *next;
}NODE;
#define LEN sizeof(NODE)
NODE *setup( )
{
NODE *head =NULL, *p1,*p2;
int n =0;
p2 =(NODE *)malloc(LEN);
p1 =p2;
scanf("%d",&p1->data);
while(p1->data)
{
n++;
if(n==1)
{
head =p1;
}
else
{
p2->next =p1;
p2 = p1;
}
p1 =(NODE *)malloc(LEN);
scanf("%d",&p1->data);
}
p2->next =NULL;
return head;
}
int main()
{
NODE *p;
p = setup();
while (p)
{
printf("%d,", p->data);
p = p->next;}}
6.2
用遞歸法將一個整數n轉換成字符串。例如,輸入整數483,應輸出字符串“483”。
#include
void fun(int n)
{
if(n/10==0)
{
putchar('0'+n%10);
}
else
{
fun(n/10);
putchar('0'+n%10);
}}
void main()
{
int m;
scanf("%d",&m);
fun(m);
}
6.3
編寫一個函數,函數fun的功能是:輸入一個整數x,計算x的平方和立方。 例如,輸入10,則應輸出a=10 a2=100 a3=1000。
#include
void fun(int s)
{
int i,a[2];
a[0]=s*s;
a[1]=s*s*s;
for(i=0;i<2;i++)
printf("%d\n",a[i]);
}
void main()
{
int s;
scanf("%d",&s);
fun(s);
}
6.4
學生的記錄由學號和成績組成,N名學生的數據已在主函數中放入結構體數組s中,請編寫函數fun,它的功能是:把分數最低的學生數據放在h所指的數組中, 注意:分數最低的學生可能不止一個,函數返回分數最低的學生的人數。
#include
#define N 3
typedef struct Stu
{
char xuehao[10];
int score;
} Stu;
int fun (Stu *s, Stu * h)
{
Stu min;
min = s[0];
int i,c=0;
for (i = 0; i < N; i++)
{
if (min.score > s[i].score)
min = s[i];
}
for (i = 0; i < N; i++)
{
if (s[i].score == min.score)
{
*(h + c) = s[i];
c++;}}
return c;
}
int main ()
{
Stu s[N] = { {"181203101", 97}, {"181203102", 96}, {"181203103", 98} };
Stu h[N];
int num,i;
num= fun (s, h);
printf ("The number is: %d\n", num);
for(i=0;i
{
printf("%s? %4d\n",h[i].xuehao,h[i].score);
}}
6.5
建立一個單向鏈表,鏈表中的每個結點有一個int類型的數據域,輸入0時標志鏈表建立過程結束。 例如,輸入1 2 3 4 0,則應輸出1,2,3,4,。
#include
#include
typedef struct node
{
int data;
struct node *next;
}NODE;
#define LEN sizeof(NODE)
NODE *setup( )
{
NODE *head =NULL, *p1,*p2;
int n =0;
p2 =(NODE *)malloc(LEN);
p1 =p2;
scanf("%d",&p1->data);
while(p1->data)
{
n++;
if(n==1)
{
head =p1;
}
else
{
p2->next =p1;
p2 = p1;
}
p1 =(NODE *)malloc(LEN);
scanf("%d",&p1->data);
}
p2->next =NULL;
return head;
}
int main()
{
NODE *p;
p = setup();
while (p)
{
printf("%d,", p->data);
p = p->next;}}
第二部分 實用程序設計
講解內容:采用c語言進行圖形設計的方法和思路。 本部分包含了圖形應用程序,Turbo C中提供了對圖形支持,在c++環境中,通過安裝插件實現對標準c圖形設計方式的支持,采用c++環境的同學查找相應插件并完成安裝,之后采用Turbo C同樣的方式完成應用程序設計。 圖形系統的有關信息和函數原型都定義于graphics.h中。 1、 初始設置 為了使屏幕能夠顯示圖形,首先要調用initgraph()函數進行初始化,該函數有三個參數,分別對應顯示器模式、分辨率、驅動程序路徑。 例如:#include /圖形函數/ …… int GraphDriver = DETECT,GraphMode=0; /* DETECT表示自動檢測顯示器*/ initgraph(&GraphDriver,&GraphMode,"") ; /空串表示在當前路徑下查找驅動程序/ …… closegraph(); 結束圖形程序時應調用closegraph()函數,釋放為圖形系統分配的資源,回到字符模式。 可以調用視口函數setviewport,在屏幕上開辟一塊區域建立一個新的視口。 2、 顏色與填充 前景色設置函數setcolor(int color); 背景色設置函數setbkcolor(int color); 區域填充函數setfillstyle(int pattern,int color); 例如:setbkcolor(WHITE); setcolor(BLUE); setfillstyle(SOLID_FILL, RED); 3、 基本繪圖函數 畫直線函數line(); 畫圓函數circle(); 畫弧函數arc(); 畫矩形函數rectangle(); 畫多邊形函數drawpoly()以及fillpoly(),后者為帶填充的多邊形。 設置線寬函數setlinestyle(); 4、 在圖形模式下輸出文本 文本輸出模式設置函數settextstyle(); 文本輸出函數outtext(); 在指定位置輸出文本outtextxy();? 要求所有同學通過自學查找和掌握完成任務所需函數用法。 實驗內容(下述內容任選其一):
1.時鐘模擬程序設計
設計目標:設計一個時鐘表盤,能及時讀取系統的時間,并根據當前時間計算并繪制出在時鐘表盤上時鐘時針、分針和秒針的具體位置,形成時鐘運轉動畫。 設計思路參考: (1)以圓形、橢圓或矩形等繪制時鐘邊框,設計時鐘指針圖形(如采用不同寬度、顏色和長度的直線分別代表時針、分針、秒針)。 (2)讀取系統時間,轉換為時鐘時針、分針、秒針當前位置,在屏幕上畫出時鐘指針,分別計算時針、分針、秒針移動一次所轉動的角度,并據此分別計算下一個位置的坐標,按各自的時間間隔刷新時鐘指針位置。 (3)以圖形或文本方式完成時鐘表盤數字繪制,并添加自己設計的個性化元素美化實現效果。
#include "pch.h"
#include
#include
#include
#define PI 3.141592654
void Draw_Dial();
void Draw_Hand(int hour, int minute, int secend);
int main()
{
initgraph(640, 480);
Draw_Dial();
setwritemode(R2_XORPEN);
SYSTEMTIME time;
while (!_kbhit())
{
GetLocalTime(&time);
Draw_Hand(time.wHour, time.wMinute, time.wSecond);
Sleep(1000);
Draw_Hand(time.wHour, time.wMinute, time.wSecond);
}
closegraph();
return 0;
}
void Draw_Dial()
{
setcolor(GREEN);
circle(320, 240, 160);
circle(320, 240, 60)
circle(320, 240, 2);
setcolor(WHITE);
int x, y;
for (int i = 0; i < 60; i++)
{
x = 320 + int(145 * sin(PI * 2 * i / 60));
y = 240 + int(145 * cos(PI * 2 * i / 60));
if (i % 15 == 0)
bar(x - 5, y - 5, x + 5, y + 5);
else if (i % 5 == 0)
circle(x, y, 3);
else
putpixel(x, y, WHITE);}}
void Draw_Hand(int hour, int minute, int second)
{
double h_hour, h_minute, h_second;
int x_hour, y_hour, x_minute, y_minute, x_second, y_second;
h_second = second * 2 * PI / 60;
h_minute = minute * 2 * PI / 60 + h_second / 60;
h_hour = hour * 2 * PI / 12 + h_minute / 12;
x_second = int(120 * sin(h_second)); y_second = int(120 * cos(h_second));
x_minute = int(100 * sin(h_minute)); y_minute = int(100 * cos(h_minute));
x_hour = int(70 * sin(h_hour)); y_hour = int(70 * cos(h_hour));
setlinestyle(PS_SOLID, 2);
setcolor(RED);
line(320 + x_second, 240 - y_second, 320 - x_second / 3, 240 + y_second / 3);
setlinestyle(PS_SOLID, 6);
setcolor(YELLOW);
line(320 + x_minute, 240 - y_minute, 320 - x_minute / 5, 240 + y_minute / 5);
setlinestyle(PS_SOLID, 7);
setcolor(GREEN);
line(320 + x_hour, 240 - y_hour, 320 - x_hour / 5, 240 + y_hour / 5);
}
2. 五子棋對戰游戲設計
設計目標:實現利用計算機評判兩個人五子棋比賽游戲、用C語言提供的圖形庫函數實現繪制五子棋棋盤,實現五子棋規則評判算法。 設計思路參考:
(A)五子棋對戰游戲規則:
(1)對局雙方各執一色棋子。 (2)空棋盤開局。 (3)黑先、白后,交替下子,每次只能下一子。 (4)棋子下在棋盤的空白點上,棋子下定后,不得向其它點移動,不得從棋盤上拿或拿起另落別處。 (5)黑方的第一枚棋子可下在棋盤任意交叉點上。 (6)當有一方先在行、列、或者斜線上連續下出連續5個棋子可以判定為勝局。
(B)游戲的基本流程為:
啟動游戲,顯示游戲參數設置界面,用戶輸入參數后進入游戲界面,顯示棋盤及雙方博弈過程,游戲過程中可選擇退出游戲。判定一方獲勝后結束本局游戲,可選擇繼續下一局或者退出游戲。
(C)設計實現思路及步驟
(1)游戲參數設置。定義游戲各項參數,如博弈雙方用戶名,背景色,先手方。 (2)棋盤繪制 棋盤設計為19×19矩形網格,設置背景顏色,設置棋盤網格線顏色,光標的初始位置在棋盤中間。游戲界面顯示博弈雙方名稱和執子顏色,顯示當前執子方。 (3)棋子繪制 設計黑白兩色圓形棋子,做顏色填充,可以設計棋子大小。采用二維數組W[L][R]存儲,數組的每個元素對應一個網格交叉點。每個數據元素的取值范圍可定義為3個數值分別代表3種狀態:空白、落黑子、落白子。 (4)落子 兩色棋子輪流落子。用戶單擊鼠標(或按鍵)將光標移至空白的網格交叉點后再次單擊(或按鍵)同一位置落子,落子后切換當前執子方。限制光標位置位于棋盤網格內。除了鼠標外落子方式也可選用按鍵操作,如:棋手1用Up、Down、Left、Right控制光標移動,回車鍵表示落子。棋手2用W、S、A、D控制光標移動,空格鍵表示落子。一旦接收到回車鍵或空格鍵,說明棋手落子,先判斷是否是有效位置,也就是說已經有棋子的位置不能重疊落子 (5)輸贏判定 落子成功后,馬上判斷以該位置為中心的八個方向:上、下、左、右、左上、左下、右上、右下是否有相同顏色的棋子連成五子,如果連成五子,則游戲結束,輸出相應的信息。如果想退出游戲,可以按Esc鍵。
#include
#include
#include
#include
#define MAXIMUS 15? ? ? ?//定義棋盤大小
int p[MAXIMUS][MAXIMUS];? ? ? ?//存儲對局信息
char buff[MAXIMUS*2+1][MAXIMUS*4+3];? ? ? ?//輸出緩沖器
int Cx,Cy;? ? ? ? ?//當前光標位置
int Now;? ? ? ?//當前走子的玩家,1代表黑,2代表白
int wl,wp;? ? ? //當前寫入緩沖器的列數和行數位置
char* showText;? ? ?//在棋盤中央顯示的文字信息
int count;//回合數
char* Copy(char* strDest,const char* strSrc)? ? ?//修改過的字符串復制函數,會忽略末端的\0
{
char* strDestCopy = strDest;
while (*strSrc!='\0')
{
*strDest++=*strSrc++;
}
return strDestCopy;
}
void Initialize()? ? ? ?//初始化一個對局函數
{
int i,j;? ? ? ?//循環變量
showText="";? ? ? ? //重置顯示信息
count=0;? ? ? ? ? //回合數歸零
for(i=0;i
{
for(j=0;j
{
p[i][j]=0;}}
Cx=Cy=MAXIMUS/2;? ? ? ? ?//重置光標到中央
Now=1;? ? ? ?//重置當前為黑方
}
char* getStyle(int i,int j)? ? ? ?//獲得棋盤中指定坐標交點位置的字符,通過制表符拼成棋盤
{
if(p[i][j]==1)? ? ?//1為黑子
return "●";
else if(p[i][j]==2)? ? ? //2為白子
return "○";
else if(i==0&&j==0)? ? ? ?//以下為邊緣棋盤樣式
return "┏";
else if(i==MAXIMUS-1&&j==0)
return "┓";
else if(i==MAXIMUS-1&&j==MAXIMUS-1)
return "┛";
else if(i==0&&j==MAXIMUS-1)
return "┗";
else if(i==0)
return "┠";
else if(i==MAXIMUS-1)
return "┨";
else if(j==0)
return "┯";
else if(j==MAXIMUS-1)
return "┷";
return "┼";? ? ? ?//中間的空位
}
char* getCurse(int i,int j){? ? ? ?//獲得指定坐標交點位置左上格的樣式,通過制表符來模擬光標的顯示
if(i==Cx){
if(j==Cy)
return "┏";
else if (j==Cy+1)
return "┗";
}
else if(i==Cx+1)
{
if(j==Cy)
return "┓";
else if (j==Cy+1)
return "┛";
}
return " ";? ? ? ? ? //如果不在光標附近則為空
}
void write(char* c)? ? ? ? ? //向緩沖器寫入字符串
{
Copy(buff[wl]+wp,c);
wp+=strlen(c);
}
void ln()? ? ? ? ? ? //緩沖器寫入位置提行
{
wl+=1;
wp=0;
}
void Display()? ? ? ? ? ? ?//將緩沖器內容輸出到屏幕
{
int i,l=strlen(showText);? ? ? ? ? ? ?//循環變量,中間文字信息的長度
int Offset=MAXIMUS*2+2-l/2;? ? ? ? ? ?//算出中間文字信息居中顯示所在的橫坐標位置
if(Offset%2==1)? ? ? ? ? ? //如果位置為奇數,則移動到偶數,避免混亂
{
Offset--;
}
Copy(buff[MAXIMUS]+Offset,showText);? ? ? ? ? ?//講中間文字信息復制到緩沖器
if(l%2==1)? ? ? ? ? ? //如果中間文字長度為半角奇數,則補上空格,避免混亂
{
*(buff[MAXIMUS]+Offset+l)=0x20;
}
system("cls");? ? ? ? ? ?//清理屏幕,準備寫入
for(i=0;i
printf("%s",buff[i]);
if(i
printf("\n");
}}
void Print()? ? ? ? ? ? //將整個棋盤算出并儲存到緩沖器,然后調用Display函數顯示出來
{
int i,j;? ? ? ? ? ?//循環變量
wl=0;
wp=0;
for(j=0;j<=MAXIMUS;j++)? ? ? ? ? ? ?//寫入出交點左上角的字符,因為需要打印棋盤右下角,所以很以橫縱各多一次循環
{
for(i=0;i<=MAXIMUS;i++)
{
write(getCurse(i,j));? ? ? ? ? //寫入左上角字符
if(j==0||j==MAXIMUS)? ? ? ? ?//如果是棋上下盤邊緣則沒有連接的豎線,用空格填充位置
{
if(i!=MAXIMUS)
write(" ");
}
else? ? ? ? ? ? //如果在棋盤中間則用豎線承接上下
{
if(i==0||i==MAXIMUS-1)? ? ? ? ? ? ? //左右邊緣的豎線更粗
write("┃");
else if(i!=MAXIMUS)? ? ? ? ? ? //中間的豎線
write("│");
}}
if(j==MAXIMUS)? ? ? ? ?//如果是最后一次循環,則只需要處理邊側字符,交點要少一排
{
break;
}
ln();? ? ? ? ? ? //提行開始打印交點內容
write(" ");? ? ? ? ? ?//用空位補齊位置
for(i=0;i
{
write(getStyle(i,j));? ? ? ? ? ?//寫入交點字符
if(i!=MAXIMUS-1)? ? ? ? ? ? ? //如果不在最右側則補充一個橫線承接左右
{
if(j==0||j==MAXIMUS-1)
{
write("━");? ? ? ? ? ? //上下邊緣的橫線更粗
}
else
{
write("—");? ? ? ? ? ? ? ?//中間的橫線
}}}
ln();? ? ? ? ? ? ? //寫完一行后提行
}
Display();? ? ? ? ? ?//將緩沖器內容輸出到屏幕
}
int Put(){? ? ? ? ? ? ?//在當前光標位置走子,如果非空,則返回0表示失敗
if(p[Cx][Cy]==0)
{
p[Cx][Cy]=Now;? ? ? ? ? ? ? //改變該位置數據
return 1;? ? ? ? ? ? ?//返回1表示成功
}
else
{
return 0;}}
int Check()? ? ? ? ? ? //勝負檢查,即判斷當前走子位置有沒有造成五連珠的情況
{
int w=1,x=1,y=1,z=1,i;? ? ? ? ? ?//累計橫豎正斜反邪四個方向的連續相同棋子數目
for(i=1;i<5;i++)if(Cy+i
for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;? ? ? ? ? ?//向上檢查
if(w>=5)return Now;? ? ? ? ? ? ?//若果達到5個則判斷當前走子玩家為贏家
for(i=1;i<5;i++)if(Cx+i
for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;? ? ? ? ? ? ? ?//向左檢查
if(x>=5)return Now;? ? ? ? ? ? ? ? ? ? ? //若果達到5個則判斷當前走子玩家為贏家
for(i=1;i<5;i++)if(Cx+i
for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;//向左上檢查
if(y>=5)return Now;? ? ? ? ? ? ?//若果達到5個則判斷當前走子玩家為贏家
for(i=1;i<5;i++)if(Cx+i0&&p[Cx+i][Cy-i]==Now)z++;else break;? ? ? ?//向右上檢查
for(i=1;i<5;i++)if(Cx-i>0&&Cy+i
if(z>=5)return Now;? ? ? ? ? ? ? //若果達到5個則判斷當前走子玩家為贏家
return 0;? ? ? ? ? ? ? ?//若沒有檢查到五連珠,則返回0表示還沒有玩家達成勝利
}
int RunGame()? ? ? ? ? ? ? ? ?//進行整個對局,返回贏家信息(雖然有用上)
{
int input;? ? ? ? ? //輸入變量
int victor;? ? ? ? ? ?//贏家信息
Initialize();? ? ? ? ?//初始化對局
while(1){? ? ? ? ? ? //開始無限回合的死循環,直到出現勝利跳出
Print();? ? ? ? ? ? //打印棋盤
input=getch();? ? ? ? ? ?//等待鍵盤按下一個字符
if(input==27)? ? ? ? ? ?//如果是ESC則退出程序
{
exit(0);
}
else if(input==0x20)? ? ? ? ? //如果是空格則開始走子
{
if(Put())? ? ? ? ? ?//如果走子成功則判斷勝負
{
victor=Check();
Now=3-Now;? ? ? ? ? //輪換當前走子玩家
count++;
if(victor==1)? ? ? ? ? //如果黑方達到勝利,顯示提示文字并等待一次按鍵,返回勝利信息
{
showText="黑方獲得了勝利!";
Print();
if(getch()==0xE0)
{
getch();
}
return Now;
}
else if(victor==2)? ? ? //如果白方達到勝利,顯示提示文字并等待一次按鍵,返回勝利信息
{
showText="白方獲得了勝利!";
Display();
if(getch()==0xE0)
{
getch();
}
return Now;
}else if(count==MAXIMUS*MAXIMUS)? ? ? ? ? ? ? ? ? ? ? ?//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果回合數達到了棋盤總量,即棋盤充滿,即為平局
{
showText="平局!";
Display();
if(getch()==0xE0)
{
getch();
}
return 0;}}}
else if(input==0xE0)? ? ? ? ? ? ? ? ? ? //如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵
{
input=getch();? ? ? ? ? ?//獲得第二次輸入信息
switch(input)? ? ? ? ? ? ? //判斷方向鍵方向并移動光標位置
{
case 0x4B://
Cx--;
break;
case 0x48:
Cy--;
break;
case 0x4D:
Cx++;
break;
case 0x50:
Cy++;
break;
}
if(Cx<0)Cx=MAXIMUS-1;? ? ? ? ? ? //如果光標位置越界則移動到對側
if(Cy<0)Cy=MAXIMUS-1;
if(Cx>MAXIMUS-1)Cx=0;
if(Cy>MAXIMUS-1)Cy=0;
}
}
}
int main()? ? ? ? ? ? ?//主函數
{
system("title 簡易五子棋 ——");? ? ? ? ? ? //設置標題
system("mode con cols=63 lines=32");? ? ? ? ? ? ?//設置窗口大小
system("color B1");? ? ? ? ? ? ? ? ? ?//設置顏色
while(1){? ? ? ? ? ? ? ? //循環執行游戲
RunGame();
}}
3. 計算器程序的設計
設計目標:實現一個計算器功能的程序。能夠用C語言提供的圖形庫函數繪制計算器界面、基本的運算程序、計算界面數據數據、運算符定位和刷新功能。 設計思路參考: (1)初始化圖形系統,定義視口,確定計算器在屏幕中的位置。 (2)以矩形等形狀畫出計算器外形,設計計算各按鈕位置及輸出區域位置和效果,將表示數字和運算符的符號以文本顯示在對應按鈕位置,接收輸入,判斷其內容是否合法并給出提示,若合法將對應信息顯示在輸出區域 (3)當輸入為“等號”時,計算結果并將結果顯示在輸出口。 實現計算函數部分的偽C程序如下(入口:(left,top),左上角坐標。出口:最后一次計算的結果。): double Computer(intleft,int top) { 核對屏幕位置,是否可容納缺省的計算器尺寸; 保存計算器占用的屏幕畫面; 畫出計算器外形; do? { char str1[len],str2[len]; /兩個數對應的串/ char popstr[長度]; /可存兩串及一個運算符的數組/ double Data1,Data2; /由串轉換后的兩個數/ int Flag=0; /輸入的數據個數,Flag=2時計算/ char oper; /運算符/ oper=接收按鍵; if(oper是0 ̄9字符) if(在數據的限定長度內) 將oper寫入popstr; else 不處理或響鈴; else if(oper是非法字符) 不處理或響鈴; else /oper是運算符、或為=、或為/ { if(oper==Esc) 中止并返回0; else{ 測試popstr中的字符串; if(是形式) { 計算結果并顯示; if(輸入為運算符) { strcpy(popstr,計算結果串); 將oper寫入popstr;}} else if(是形式) 將oper寫入popstr; else 不處理或響鈴;} }}while(終止條件); return 最后計算結果;}
#include
void main(void){//簡易計算機的設計
int c=1;
float operationA=0;
float operationB=0;
int isContinue=1;
while(isContinue){
printf("請選擇你要進行的運算類型:1加法,2減法,3乘法,4除法\n");
scanf("%d",&c);
printf("請輸入第一個運算數字:\t");
scanf("%f",&operationA);
printf("請輸入第二個運算數字:\t");
scanf("%f",&operationB);
if(c==1){
printf("%f + %f = %f\n",operationA,operationB,operationA+operationB);
}else if(c==2){
printf("%f - %f = %f\n",operationA,operationB,operationA-operationB);
}else if(c==3){
printf("%f * %f = %f\n",operationA,operationB,operationA*operationB);
}else if(c==4){
while(operationB==0){
printf("除數不能為零!請重新輸入第二個數:");
scanf("%f",&operationB);
}
printf("%f / %f = %f\n",operationA,operationB,operationA/operationB);
}else{
printf("請正確選擇運算:");
}
printf("\n\n");
printf("你是否還要繼續進行運算:是:1 ? ?否:0 \n");
scanf("%d",&isContinue);
if(isContinue==0){
isContinue=0;
}}
printf("歡迎使用本計算機!");}
4.其它自選程序——掃雷
#include
#include
#include
#include
#include
#define SIZE 10
#define N 35
char mine[12][12]={{0}};
int step=65;
void gotoxy(int x,int y)//坐標函數
{
COORD pos ;
pos.X = x ;
pos.Y = y ;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE) , pos) ;
}
void color(int a)//顏色函數
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,a) ;
}
void init_mine()//初始化
{
int count,x,y;
for(count=0;count
{
x=rand()%10+1;
y=rand()%10+1;
if(!mine[y][x])
{
mine[y][x]=1;
count++;
}}
gotoxy(3,0);
for(x=1;x<=SIZE;x++)//設置行標號
{
color(13);
printf("%d ",x);
}
for(x=1;x<=SIZE;x++)//設置列標號
{
gotoxy(0,x);
printf("%d ",x);
}
for(y=1;y<=SIZE;y++)//初始化雷區
{
gotoxy(2,y);
for(x=1;x<=SIZE;x++)
{
color(11);
printf("□");
}}
gotoxy(45,0);//設置文字提示
color(12);
printf("掃雷-");
color(14);
gotoxy(0,11);
printf(" Input the position ( x , y )\n\n");
color(11);
printf("? ? ? Notice :when x=0 and y=0,the game is over!!!!");
}
void show_mine(int x,int y)
{
int num;
if(mine[y][x])//踩雷了
{
color(11);
gotoxy(x*2,y);
printf("●");
gotoxy(22,10);
for(y=1;y<11;y++)
for(x=1;x<11;x++)
{
gotoxy(x*2,y);
if(mine[y][x])
printf("●");
else
{
num=mine[y+1][x]+mine[y+1][x+1]+mine[y+1][x-1]+mine[y][x+1]+mine[y][x-1]+mine[y-1][x]+mine[y-1][x+1]+mine[y-1][x-1];
printf("%d ",num);
}
}
printf("踩中雷區陣亡,請再接再厲!!!");
exit(0);
}
else//未踩雷
{
num=mine[y+1][x]+mine[y+1][x+1]+mine[y+1][x-1]+mine[y][x+1]+mine[y][x-1]+mine[y-1][x]+mine[y-1][x+1]+mine[y-1][x-1];
gotoxy(x*2,y);
printf("%d ",num);
gotoxy(53,9);
printf("%d",--step);
}}
main()
{? ?char x,y,x1,y1;
x1 = 'c';
init_mine();? ? ? ? ? ? ? ? ?初始化游戲界面,埋雷,初始化顯示等
gotoxy(23,11);? ? ? ? ? ? ? //移動光標到坐標23,21
for(x=0,y=0;x1 !=0||y1 !=0;)
{
Sleep(1000);? ? ? ? ? ?//延時
if(kbhit())//輸入坐標
{
gotoxy(23,11);
scanf("%d",&x1);
gotoxy(27,11);
scanf("%d",&y1);
gotoxy(23,11);
printf("(x , y )? ? ");
}
if(x1 >0 && x1 <11 && y1>0 && y1<11&&( x!=x1 || y!=y1))
{
y=y1;
x=x1;
show_mine(x,y); //檢測有沒有踩雷,如果踩雷顯示雷,如果沒有,顯示周圍雷的個數
}
if(!step)
{
gotoxy(10,5);
printf("真棒!!您贏了!!");
exit(0);
}}
exit(0);
}
總結
以上是生活随笔為你收集整理的long在C语言中是非法字符吗,C程序设计实践——实验指导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html内容封装为一个对象_技术赋能还是
- 下一篇: java计算距离_java实现计算地理坐