日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

long在C语言中是非法字符吗,C程序设计实践——实验指导

發(fā)布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 long在C语言中是非法字符吗,C程序设计实践——实验指导 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、課程的總體目標(biāo)和具體要求

總體目標(biāo):

利用C語言和程序設(shè)計方法編制程序,借助計算機(jī)解決問題的基本能力。(支撐畢業(yè)能力要求1)獨立解決文本處理、數(shù)學(xué)上的一些問題,編寫較規(guī)范化的代碼。(支撐畢業(yè)能力要求3)綜合運用數(shù)學(xué)和程序設(shè)計方法,設(shè)計有實用背景和一定規(guī)模的應(yīng)用問題的解決方案,可在較短計劃時間內(nèi)實現(xiàn)核心代碼,撰寫實驗報告。(支撐畢業(yè)能力要求3)選擇、運用工具構(gòu)建實驗、項目并熟練進(jìn)行程序編輯、調(diào)試、運行得到結(jié)果。(支撐畢業(yè)能力要求4)

具體要求: 1.了解和使用Turbo C和Visual C++6.0的集成開發(fā)環(huán)境 2.理解C語言的程序結(jié)構(gòu) 3.熟練掌握輸入輸出等交互方式 4.體會將待處理的問題轉(zhuǎn)換為算法描述,學(xué)會發(fā)現(xiàn)規(guī)律,并編程實現(xiàn) 5.體會用計算機(jī)進(jìn)行數(shù)學(xué)計算的特點 6.熟練掌握選擇結(jié)構(gòu)流程控制 7.熟練掌握不同的條件控制語句,體會其應(yīng)用方法 8.熟練掌握循環(huán)結(jié)構(gòu)流程控制 9.熟練掌握選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的嵌套 10.掌握一維數(shù)組和二維數(shù)組的定義、賦值和輸入輸出方法 11.掌握主要的數(shù)組有關(guān)的算法 12.學(xué)會進(jìn)行矩陣運算 13.字符處理及字符數(shù)組的使用 14.掌握函數(shù)的定義與使用 15.理解函數(shù)的參數(shù)傳遞方式,掌握函數(shù)傳值及傳址方法 16.掌握指針的概念和使用方法 17.比較指針操作與數(shù)組操作的一致性 18.體會指針在字符串操作中的應(yīng)用 19.學(xué)習(xí)C語言中復(fù)雜數(shù)據(jù)類型的定義和使用方法 20.學(xué)習(xí)應(yīng)用位運算 21.學(xué)會測試程序,發(fā)現(xiàn)非語法方面的錯誤 22.學(xué)習(xí)考慮邊界條件,學(xué)習(xí)從用戶角度思考問題 23.查找資料,自學(xué)圖形設(shè)計相關(guān)內(nèi)容 24.完成有實用背景的應(yīng)用程序的設(shè)計、編程、調(diào)試全過程并撰寫實驗報告

二、實驗環(huán)境

計算機(jī)的硬件環(huán)境: 目前各實驗室使用的PC兼容機(jī)或品牌機(jī),均能滿足該課的實驗要求。 計算機(jī)的軟件環(huán)境: 在Windows 操作系統(tǒng)環(huán)境下,使用Turbo C或Visual C++6.0可視化程序語言。 Turbo C是一個常用的、最基本的C語言工具,一般簡稱TC。它為C語言開發(fā)提供了操作便利的集成環(huán)境。源程序的輸入、修改、調(diào)試及運行都可以在TC集成環(huán)境下完成,非常方便有效。TC系統(tǒng)非常小巧,但功能齊全。它主要支持DOS環(huán)境,因此在操作中無法使用鼠標(biāo),更多的需要通過鍵盤操縱菜單或快捷鍵完成。 C++是一個面向?qū)ο蟮某绦蛟O(shè)計(OOP)語言,是C語言的進(jìn)一步發(fā)展,已成為當(dāng)今最流行的一種程序設(shè)計語言。Visual C++6.0是Windows環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一,它是C++語言的集成開發(fā)環(huán)境,也可以很好地進(jìn)行C語言應(yīng)用程序的開發(fā)。

三、實驗內(nèi)容及主要設(shè)計思路、算法原理

第一部分 基本程序

1. 第一天內(nèi)容

講解內(nèi)容: 選擇結(jié)構(gòu):if語句、switch語句; 循環(huán)結(jié)構(gòu):while語句、do_while語句、for語句; 函數(shù):函數(shù)的定義、函數(shù)說明、函數(shù)的調(diào)用。 重點講解函數(shù)的設(shè)計思路。 練習(xí)內(nèi)容:

1.1

編寫一個函數(shù)fun,然后設(shè)計主函數(shù)調(diào)用函數(shù)fun。函數(shù)fun的功能是:求兩數(shù)平方根之和,作為函數(shù)值返回。例如:輸入12和20,輸出結(jié)果為: 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("請輸入兩個要求平方根的數(shù):");

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

printf("%lf",fun(a,b));

}

1.2

編寫一個函數(shù)fun,然后設(shè)計主函數(shù)調(diào)用函數(shù)fun。函數(shù)fun的功能是:計算正整數(shù)num的各位上的數(shù)字之積。例如,若輸入:252,則輸出應(yīng)該是:20。若輸入:202,則輸出應(yīng)該是:0。

#include

int fun(int x)

{

int a=1;

while(x)

{

a *= (x % 10);

x /= 10;

}

return a;

}

void main()

{

int p;

printf("請輸入一個整數(shù):");

scanf("%d",&p);

printf("%d\n",fun(p));

}

1.3

編寫一個函數(shù)fun,然后設(shè)計主函數(shù)調(diào)用函數(shù)fun。函數(shù)fun的功能是:通過某種方式實現(xiàn)兩個變量值的交換。例如變量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("請輸入要交換的兩個數(shù):");

scanf("%d %d",&x,&y);

printf("交換前:");

printf("%d %d\n",x,y);

fun(&x,&y);

printf("交換后:");

printf("%d %d\n",x,y);

}

1.4

編寫一個函數(shù)fun,然后設(shè)計主函數(shù)調(diào)用函數(shù)fun。函數(shù)fun的功能是:求出兩個非零正整數(shù)的最大公約數(shù)(考慮遞歸和非遞歸兩種方法,任選一種實現(xiàn)),并作為函數(shù)值返回。再設(shè)計一個函數(shù),函數(shù)的功能是計算兩個非零正整數(shù)的最小公倍數(shù)。

#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("請輸入兩個數(shù):");//求最大公因數(shù)與最小公倍數(shù)//

scanf("%d %d",&x,&y);

printf("最大公因數(shù):");

printf("MAX:%d\n",fun(x,y));

printf("最小公倍數(shù):");

printf("min:%d\n",fun_(x,y));

}

5. 用下述公式求π的近似值,直到最后一項的絕對值小于指定的數(shù)(參數(shù)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. 第二天內(nèi)容

講解內(nèi)容:進(jìn)制轉(zhuǎn)換的基本設(shè)計思想,循環(huán)結(jié)構(gòu)程序設(shè)計的一般規(guī)律,用程序?qū)崿F(xiàn)數(shù)學(xué)表達(dá)的方法。 練習(xí)內(nèi)容:

2.1

請編寫函數(shù)float fun(float x, int m),它的功能是:將浮點數(shù)x保留m位小數(shù)(m不大于6),第m+1位四舍五入。例如,輸入123.456,保留2位小數(shù)應(yīng)輸出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

請編寫一個函數(shù)unsigned fun ( unsigned w ), w是一個大于10的無符號整數(shù),若w是n (n≥2)位的整數(shù),函數(shù)求出w的后n-1位的數(shù)作為函數(shù)值返回。

#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

編寫一個函數(shù)fun,函數(shù)fun的功能是:從低位開始取出長整型變量s中偶數(shù)位上的數(shù),依次構(gòu)成一個新數(shù)放在t中。例如,當(dāng)s中的數(shù)為:7654321時,t中的數(shù)為: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

將十進(jìn)制正整數(shù)轉(zhuǎn)換成k進(jìn)制(2<=k<=9)數(shù)的數(shù)字輸出。例如,若輸入8和2,則應(yīng)輸出1000(即十進(jìn)制數(shù)8轉(zhuǎn)換成二進(jìn)制表示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的奇數(shù))。例如:若k=7,則應(yīng)輸出: 1.00000 6.00000 120.00000 5040.00000。

#include

void main()

{

double k,d,s=1;

printf("k是小于9的奇數(shù):");

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組成的整數(shù)) 例如,a=2,n=6,則以上表達(dá)式為: 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

編寫一個函數(shù)float fun(float eps),它的功能是: 根據(jù)如下公式計算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

編寫一個函數(shù)fun,然后設(shè)計主函數(shù)調(diào)用函數(shù)fun。 函數(shù)fun的功能是:統(tǒng)計不超過一個整數(shù)m(包括m且m>=3)的素數(shù)個數(shù)(不包括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. 第三天內(nèi)容

講解內(nèi)容:指針的概念與運算、指針作函數(shù)的參數(shù)、一維數(shù)組的定義和引用、一維數(shù)組和指針的關(guān)系、字符數(shù)組作字符串變量、指向字符串常量的指針變量、字符串操作函數(shù)。重點講解指針操作數(shù)組的思路。 練習(xí)內(nèi)容:

3.1

編寫一個函數(shù)len,其功能是計算出一個字符串中含有的所有字符個數(shù)(不使用庫函數(shù)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

編寫函數(shù)fun,函數(shù)的功能是:計算一個字符串s中的所含有的指定字符的個數(shù),返回此值。 例如,輸入字符串"Thisisastring",被查找字符為’i’,則應(yīng)輸出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

編寫函數(shù)fun,其功能是刪除一個字符串中的所有空格。 例如,輸入字符串"This is a string",則應(yīng)輸出"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

編寫函數(shù)fun,函數(shù)fun 的功能是:將字符串a(chǎn)中的所有字符復(fù)制到字符串b中,要求每復(fù)制三個字符之后插入一個空格。

#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

編寫函數(shù),函數(shù)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

編寫函數(shù),函數(shù)fun 的功能是:首先把b所指字符串中的字符按逆序存放,然后將a所指字符串中的字符和b所指字符串中的字符,按排列的順序交叉合并到c所指數(shù)組中,過長的剩余字符接在c所指數(shù)組的尾部。 例如,當(dāng)a所指字符串中的內(nèi)容為“abcdefg”,b所指字符串中的內(nèi)容為“1234”時,c所指數(shù)組中的內(nèi)容應(yīng)該為“a4b3c2d1efg”;而當(dāng)a所指字符串中的內(nèi)容為“1234”,b所指字符串中的內(nèi)容為“abcdefg”時,c所指數(shù)組中的內(nèi)容應(yīng)該為“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. 第四天內(nèi)容

講解內(nèi)容:選擇排序法、冒泡排序法、簡單插入排序法和查找與替換方法。引導(dǎo)學(xué)生考慮設(shè)計高效的算法。 練習(xí)內(nèi)容:

4.1

用選擇排序法對數(shù)組a的元素從小到大排序。例如,輸入2 5 4 1 6 2 7 3 2 9 4,則應(yīng)輸出1 2 2 2 3 4 5 6 7 9。 選擇排序法采取如下思想對數(shù)組a的元素從小到大排序: 將數(shù)組a的元素處理n-1次,第k次處理時僅處理前n-k個元素,方法是選擇出這k個元素中的最大元素,并將其與這些元素中的最后一個交換。當(dāng)然,也可以按每次選擇最小元素的辦法進(jìn)行選擇排序。

# 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("請輸入數(shù)組個數(shù)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

下述程序中,函數(shù)fun的功能是:用冒泡法對6個字符串按由小到大的順序進(jìn)行排序。 冒泡排序基本思路:所謂“冒泡排序”,也稱“起泡排序”或者“氣泡排序”,是指這樣的一種簡單排序方法,若被排序的數(shù)組元素個數(shù)為N,可以對此數(shù)組做N-1次處理。 在第k次(k=0, 1, …, N-1)處理時,需比較前N-k個元素,方法是:連續(xù)從前到后比較相鄰的兩個元素,如果后面的元素小于前面的元素,則將二者交換,否則不變。 可見,每經(jīng)過一次處理,至少此次被處理的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個數(shù):");

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

{

scanf("%d",&b[i]);

}

printf("數(shù)組的內(nèi)容:");

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

{

printf("%4d",b[i]);

}

printf("\n");

printf("數(shù)組升序排列后:");

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

編寫函數(shù)fun,函數(shù)fun的功能是:利用插入排序法對字符串中的字符按從小到大的順序進(jìn)行排序。 插入法的基本算法思路是:先對字符串中的頭兩個元素進(jìn)行排序。然后把第三個字符插入到前兩個字符中,插入后前三個字符依然有序;再把第四個字符插入到前三個字符中,……。待排序的字符串已在主函數(shù)中賦值。

#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

編寫一個函數(shù),其功能是統(tǒng)計一個子字符串在另一個字符串中出現(xiàn)的次數(shù)。例如,假定輸入的字符串為"this is a string",子字符串為"is",則應(yīng)輸出2。 設(shè)計思路:

⑴分析參數(shù)與返回值。

本例中函數(shù)fun的參數(shù)的含義為:母字符串str和子字符串sub。該函數(shù)需要統(tǒng)計子字符串出現(xiàn)的個數(shù),返回值是int類型,必然是統(tǒng)計后所得的出現(xiàn)次數(shù)值,觀察main函數(shù)中的輸出也能肯定這一點。

⑵整理編程思路。

編寫該函數(shù)需要使用一個循環(huán),循環(huán)中可以考慮通過一個字符類型的指針在str中由前到后移動,每次移動一個字符位,且將目前指針位置開始的m個字符與sub所包含的全部m個字符比較(假定sub的長度是m),若二者相同則說明子字符串在母字符串中出現(xiàn)一次,進(jìn)行累計,否則不累計。無論如何,將指針再移到下一個字符位,進(jìn)行下一次循環(huán)比較。

⑶細(xì)節(jié)考慮。

首先,為了實現(xiàn)兩組m個字符的比較,一個可行的辦法是寫一個函數(shù)來實現(xiàn),但程序不允許再編寫其它函數(shù),只能使用庫函數(shù)或自己構(gòu)成循環(huán)。能夠使用的庫函數(shù)是定義在string.h中的strstr,其函數(shù)原型如下: 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個有序整數(shù)數(shù)列已放在一堆數(shù)組中。下述程序中的函數(shù)fun的功能是:利用折半查找算法查找整數(shù)m在數(shù)組中的位置。若找到返回其下標(biāo)值;反之,返回-1 折半查找設(shè)計思想:折半查找也稱為二分查找或二分檢索,其基本思想是,在一個數(shù)組中查找某個值m是否存在時,每次查找前先確定數(shù)組中待查的范圍:low和hitgh (low high,查找結(jié)束。

#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

請編寫函數(shù)int* fun(char* st),其中st是僅由字符a、b和c組成的字符串。 函數(shù)的功能是:統(tǒng)計字符串st中’a’、’b’和’c’的個數(shù)并分別存入不同的內(nèi)存區(qū),帶回內(nèi)存區(qū)的首地址。

#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. 第五天內(nèi)容

講解內(nèi)容:二維數(shù)組的定義、引用與初始化、二維數(shù)組與指針的關(guān)系(二維數(shù)組的一維表示、對二維數(shù)組的約定、指向一維數(shù)組的指針變量、二維數(shù)組作函數(shù)的參數(shù)和用二維數(shù)組操作字符串)。 練習(xí)內(nèi)容:

5.1

將數(shù)組x的元素倒置輸出。例如,若輸入1 2 3 4 5,則應(yīng)輸出5 4 3 2 1。

#include

void main()

{

int i,n,a[10];

printf("請輸入數(shù)組個數(shù):");

scanf("%d",&n);

printf("請輸入數(shù)組:");

for(i=0;i

scanf("%d",&a[i]);

for(i=n-1;i>=0;i--)

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

}

5.2

請編寫函數(shù)void fun ( int aa[ ], int x, int *n ),它的功能是:刪除數(shù)組aa中所有與x相等的元素,數(shù)組元素個數(shù)由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("請輸入數(shù)組元素個數(shù):");

scanf("%d",&n);

printf("請輸入數(shù)組:");

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

請編函數(shù)void fun(int *a, int *b),它的功能是:求出1到100之內(nèi)被7或11整除的所有整數(shù)放在數(shù)組a中,通過n返回這些數(shù)的個數(shù)。

#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

編寫函數(shù)int fun (int lim, int aa[MAX] ),該函數(shù)的功能是求出小于lim的所有素數(shù)并放在aa數(shù)組中,該函數(shù)返回所求出素數(shù)的個數(shù)。然后編寫主函數(shù)調(diào)用它。

#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

編寫函數(shù),其功能是:實現(xiàn)矩陣(3行3列)的轉(zhuǎn)置(即行列互換)。

#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("轉(zhuǎn)置后矩陣:\n");

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

{

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

{? ? printf("%2d",a[j][i]);

if(j==2)

printf("\n");

}}}

6. 第六天內(nèi)容

講解內(nèi)容:遞歸函數(shù)、動態(tài)內(nèi)存管理、結(jié)構(gòu)體類型的定義、結(jié)構(gòu)體變量的定義、結(jié)構(gòu)體變量的成員、整體引用結(jié)構(gòu)體、結(jié)構(gòu)體數(shù)據(jù)在函數(shù)間傳遞、結(jié)構(gòu)體變量的初始化、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針、單鏈表。重點講解鏈表。 練習(xí)內(nèi)容:

6.1

請編寫函數(shù)int fun(double a[ ], int k, int m, double x),它的功能是:用遞歸方法在數(shù)組a中查找x是否出現(xiàn),其中數(shù)組a的元素已按由大到小的次序排序,k和m是數(shù)組的最小和最大下標(biāo),函數(shù)采用二分查找算法,若找到則返回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

用遞歸法將一個整數(shù)n轉(zhuǎn)換成字符串。例如,輸入整數(shù)483,應(yīng)輸出字符串“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

編寫一個函數(shù),函數(shù)fun的功能是:輸入一個整數(shù)x,計算x的平方和立方。 例如,輸入10,則應(yīng)輸出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

學(xué)生的記錄由學(xué)號和成績組成,N名學(xué)生的數(shù)據(jù)已在主函數(shù)中放入結(jié)構(gòu)體數(shù)組s中,請編寫函數(shù)fun,它的功能是:把分?jǐn)?shù)最低的學(xué)生數(shù)據(jù)放在h所指的數(shù)組中, 注意:分?jǐn)?shù)最低的學(xué)生可能不止一個,函數(shù)返回分?jǐn)?shù)最低的學(xué)生的人數(shù)。

#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

建立一個單向鏈表,鏈表中的每個結(jié)點有一個int類型的數(shù)據(jù)域,輸入0時標(biāo)志鏈表建立過程結(jié)束。 例如,輸入1 2 3 4 0,則應(yīng)輸出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;}}

第二部分 實用程序設(shè)計

講解內(nèi)容:采用c語言進(jìn)行圖形設(shè)計的方法和思路。 本部分包含了圖形應(yīng)用程序,Turbo C中提供了對圖形支持,在c++環(huán)境中,通過安裝插件實現(xiàn)對標(biāo)準(zhǔn)c圖形設(shè)計方式的支持,采用c++環(huán)境的同學(xué)查找相應(yīng)插件并完成安裝,之后采用Turbo C同樣的方式完成應(yīng)用程序設(shè)計。 圖形系統(tǒng)的有關(guān)信息和函數(shù)原型都定義于graphics.h中。 1、 初始設(shè)置 為了使屏幕能夠顯示圖形,首先要調(diào)用initgraph()函數(shù)進(jìn)行初始化,該函數(shù)有三個參數(shù),分別對應(yīng)顯示器模式、分辨率、驅(qū)動程序路徑。 例如:#include /圖形函數(shù)/ …… int GraphDriver = DETECT,GraphMode=0; /* DETECT表示自動檢測顯示器*/ initgraph(&GraphDriver,&GraphMode,"") ; /空串表示在當(dāng)前路徑下查找驅(qū)動程序/ …… closegraph(); 結(jié)束圖形程序時應(yīng)調(diào)用closegraph()函數(shù),釋放為圖形系統(tǒng)分配的資源,回到字符模式。 可以調(diào)用視口函數(shù)setviewport,在屏幕上開辟一塊區(qū)域建立一個新的視口。 2、 顏色與填充 前景色設(shè)置函數(shù)setcolor(int color); 背景色設(shè)置函數(shù)setbkcolor(int color); 區(qū)域填充函數(shù)setfillstyle(int pattern,int color); 例如:setbkcolor(WHITE); setcolor(BLUE); setfillstyle(SOLID_FILL, RED); 3、 基本繪圖函數(shù) 畫直線函數(shù)line(); 畫圓函數(shù)circle(); 畫弧函數(shù)arc(); 畫矩形函數(shù)rectangle(); 畫多邊形函數(shù)drawpoly()以及fillpoly(),后者為帶填充的多邊形。 設(shè)置線寬函數(shù)setlinestyle(); 4、 在圖形模式下輸出文本 文本輸出模式設(shè)置函數(shù)settextstyle(); 文本輸出函數(shù)outtext(); 在指定位置輸出文本outtextxy();? 要求所有同學(xué)通過自學(xué)查找和掌握完成任務(wù)所需函數(shù)用法。 實驗內(nèi)容(下述內(nèi)容任選其一):

1.時鐘模擬程序設(shè)計

設(shè)計目標(biāo):設(shè)計一個時鐘表盤,能及時讀取系統(tǒng)的時間,并根據(jù)當(dāng)前時間計算并繪制出在時鐘表盤上時鐘時針、分針和秒針的具體位置,形成時鐘運轉(zhuǎn)動畫。 設(shè)計思路參考: (1)以圓形、橢圓或矩形等繪制時鐘邊框,設(shè)計時鐘指針圖形(如采用不同寬度、顏色和長度的直線分別代表時針、分針、秒針)。 (2)讀取系統(tǒng)時間,轉(zhuǎn)換為時鐘時針、分針、秒針當(dāng)前位置,在屏幕上畫出時鐘指針,分別計算時針、分針、秒針移動一次所轉(zhuǎn)動的角度,并據(jù)此分別計算下一個位置的坐標(biāo),按各自的時間間隔刷新時鐘指針位置。 (3)以圖形或文本方式完成時鐘表盤數(shù)字繪制,并添加自己設(shè)計的個性化元素美化實現(xiàn)效果。

#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. 五子棋對戰(zhàn)游戲設(shè)計

設(shè)計目標(biāo):實現(xiàn)利用計算機(jī)評判兩個人五子棋比賽游戲、用C語言提供的圖形庫函數(shù)實現(xiàn)繪制五子棋棋盤,實現(xiàn)五子棋規(guī)則評判算法。 設(shè)計思路參考:

(A)五子棋對戰(zhàn)游戲規(guī)則:

(1)對局雙方各執(zhí)一色棋子。 (2)空棋盤開局。 (3)黑先、白后,交替下子,每次只能下一子。 (4)棋子下在棋盤的空白點上,棋子下定后,不得向其它點移動,不得從棋盤上拿或拿起另落別處。 (5)黑方的第一枚棋子可下在棋盤任意交叉點上。 (6)當(dāng)有一方先在行、列、或者斜線上連續(xù)下出連續(xù)5個棋子可以判定為勝局。

(B)游戲的基本流程為:

啟動游戲,顯示游戲參數(shù)設(shè)置界面,用戶輸入?yún)?shù)后進(jìn)入游戲界面,顯示棋盤及雙方博弈過程,游戲過程中可選擇退出游戲。判定一方獲勝后結(jié)束本局游戲,可選擇繼續(xù)下一局或者退出游戲。

(C)設(shè)計實現(xiàn)思路及步驟

(1)游戲參數(shù)設(shè)置。定義游戲各項參數(shù),如博弈雙方用戶名,背景色,先手方。 (2)棋盤繪制 棋盤設(shè)計為19×19矩形網(wǎng)格,設(shè)置背景顏色,設(shè)置棋盤網(wǎng)格線顏色,光標(biāo)的初始位置在棋盤中間。游戲界面顯示博弈雙方名稱和執(zhí)子顏色,顯示當(dāng)前執(zhí)子方。 (3)棋子繪制 設(shè)計黑白兩色圓形棋子,做顏色填充,可以設(shè)計棋子大小。采用二維數(shù)組W[L][R]存儲,數(shù)組的每個元素對應(yīng)一個網(wǎng)格交叉點。每個數(shù)據(jù)元素的取值范圍可定義為3個數(shù)值分別代表3種狀態(tài):空白、落黑子、落白子。 (4)落子 兩色棋子輪流落子。用戶單擊鼠標(biāo)(或按鍵)將光標(biāo)移至空白的網(wǎng)格交叉點后再次單擊(或按鍵)同一位置落子,落子后切換當(dāng)前執(zhí)子方。限制光標(biāo)位置位于棋盤網(wǎng)格內(nèi)。除了鼠標(biāo)外落子方式也可選用按鍵操作,如:棋手1用Up、Down、Left、Right控制光標(biāo)移動,回車鍵表示落子。棋手2用W、S、A、D控制光標(biāo)移動,空格鍵表示落子。一旦接收到回車鍵或空格鍵,說明棋手落子,先判斷是否是有效位置,也就是說已經(jīng)有棋子的位置不能重疊落子 (5)輸贏判定 落子成功后,馬上判斷以該位置為中心的八個方向:上、下、左、右、左上、左下、右上、右下是否有相同顏色的棋子連成五子,如果連成五子,則游戲結(jié)束,輸出相應(yīng)的信息。如果想退出游戲,可以按Esc鍵。

#include

#include

#include

#include

#define MAXIMUS 15? ? ? ?//定義棋盤大小

int p[MAXIMUS][MAXIMUS];? ? ? ?//存儲對局信息

char buff[MAXIMUS*2+1][MAXIMUS*4+3];? ? ? ?//輸出緩沖器

int Cx,Cy;? ? ? ? ?//當(dāng)前光標(biāo)位置

int Now;? ? ? ?//當(dāng)前走子的玩家,1代表黑,2代表白

int wl,wp;? ? ? //當(dāng)前寫入緩沖器的列數(shù)和行數(shù)位置

char* showText;? ? ?//在棋盤中央顯示的文字信息

int count;//回合數(shù)

char* Copy(char* strDest,const char* strSrc)? ? ?//修改過的字符串復(fù)制函數(shù),會忽略末端的\0

{

char* strDestCopy = strDest;

while (*strSrc!='\0')

{

*strDest++=*strSrc++;

}

return strDestCopy;

}

void Initialize()? ? ? ?//初始化一個對局函數(shù)

{

int i,j;? ? ? ?//循環(huán)變量

showText="";? ? ? ? //重置顯示信息

count=0;? ? ? ? ? //回合數(shù)歸零

for(i=0;i

{

for(j=0;j

{

p[i][j]=0;}}

Cx=Cy=MAXIMUS/2;? ? ? ? ?//重置光標(biāo)到中央

Now=1;? ? ? ?//重置當(dāng)前為黑方

}

char* getStyle(int i,int j)? ? ? ?//獲得棋盤中指定坐標(biāo)交點位置的字符,通過制表符拼成棋盤

{

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){? ? ? ?//獲得指定坐標(biāo)交點位置左上格的樣式,通過制表符來模擬光標(biāo)的顯示

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 " ";? ? ? ? ? //如果不在光標(biāo)附近則為空

}

void write(char* c)? ? ? ? ? //向緩沖器寫入字符串

{

Copy(buff[wl]+wp,c);

wp+=strlen(c);

}

void ln()? ? ? ? ? ? //緩沖器寫入位置提行

{

wl+=1;

wp=0;

}

void Display()? ? ? ? ? ? ?//將緩沖器內(nèi)容輸出到屏幕

{

int i,l=strlen(showText);? ? ? ? ? ? ?//循環(huán)變量,中間文字信息的長度

int Offset=MAXIMUS*2+2-l/2;? ? ? ? ? ?//算出中間文字信息居中顯示所在的橫坐標(biāo)位置

if(Offset%2==1)? ? ? ? ? ? //如果位置為奇數(shù),則移動到偶數(shù),避免混亂

{

Offset--;

}

Copy(buff[MAXIMUS]+Offset,showText);? ? ? ? ? ?//講中間文字信息復(fù)制到緩沖器

if(l%2==1)? ? ? ? ? ? //如果中間文字長度為半角奇數(shù),則補(bǔ)上空格,避免混亂

{

*(buff[MAXIMUS]+Offset+l)=0x20;

}

system("cls");? ? ? ? ? ?//清理屏幕,準(zhǔn)備寫入

for(i=0;i

printf("%s",buff[i]);

if(i

printf("\n");

}}

void Print()? ? ? ? ? ? //將整個棋盤算出并儲存到緩沖器,然后調(diào)用Display函數(shù)顯示出來

{

int i,j;? ? ? ? ? ?//循環(huán)變量

wl=0;

wp=0;

for(j=0;j<=MAXIMUS;j++)? ? ? ? ? ? ?//寫入出交點左上角的字符,因為需要打印棋盤右下角,所以很以橫縱各多一次循環(huán)

{

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)? ? ? ? ?//如果是最后一次循環(huán),則只需要處理邊側(cè)字符,交點要少一排

{

break;

}

ln();? ? ? ? ? ? //提行開始打印交點內(nèi)容

write(" ");? ? ? ? ? ?//用空位補(bǔ)齊位置

for(i=0;i

{

write(getStyle(i,j));? ? ? ? ? ?//寫入交點字符

if(i!=MAXIMUS-1)? ? ? ? ? ? ? //如果不在最右側(cè)則補(bǔ)充一個橫線承接左右

{

if(j==0||j==MAXIMUS-1)

{

write("━");? ? ? ? ? ? //上下邊緣的橫線更粗

}

else

{

write("—");? ? ? ? ? ? ? ?//中間的橫線

}}}

ln();? ? ? ? ? ? ? //寫完一行后提行

}

Display();? ? ? ? ? ?//將緩沖器內(nèi)容輸出到屏幕

}

int Put(){? ? ? ? ? ? ?//在當(dāng)前光標(biāo)位置走子,如果非空,則返回0表示失敗

if(p[Cx][Cy]==0)

{

p[Cx][Cy]=Now;? ? ? ? ? ? ? //改變該位置數(shù)據(jù)

return 1;? ? ? ? ? ? ?//返回1表示成功

}

else

{

return 0;}}

int Check()? ? ? ? ? ? //勝負(fù)檢查,即判斷當(dāng)前走子位置有沒有造成五連珠的情況

{

int w=1,x=1,y=1,z=1,i;? ? ? ? ? ?//累計橫豎正斜反邪四個方向的連續(xù)相同棋子數(shù)目

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;? ? ? ? ? ? ?//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

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;? ? ? ? ? ? ? ? ? ? ? //若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

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;? ? ? ? ? ? ?//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

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;? ? ? ? ? ? ? //若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

return 0;? ? ? ? ? ? ? ?//若沒有檢查到五連珠,則返回0表示還沒有玩家達(dá)成勝利

}

int RunGame()? ? ? ? ? ? ? ? ?//進(jìn)行整個對局,返回贏家信息(雖然有用上)

{

int input;? ? ? ? ? //輸入變量

int victor;? ? ? ? ? ?//贏家信息

Initialize();? ? ? ? ?//初始化對局

while(1){? ? ? ? ? ? //開始無限回合的死循環(huán),直到出現(xiàn)勝利跳出

Print();? ? ? ? ? ? //打印棋盤

input=getch();? ? ? ? ? ?//等待鍵盤按下一個字符

if(input==27)? ? ? ? ? ?//如果是ESC則退出程序

{

exit(0);

}

else if(input==0x20)? ? ? ? ? //如果是空格則開始走子

{

if(Put())? ? ? ? ? ?//如果走子成功則判斷勝負(fù)

{

victor=Check();

Now=3-Now;? ? ? ? ? //輪換當(dāng)前走子玩家

count++;

if(victor==1)? ? ? ? ? //如果黑方達(dá)到勝利,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="黑方獲得了勝利!";

Print();

if(getch()==0xE0)

{

getch();

}

return Now;

}

else if(victor==2)? ? ? //如果白方達(dá)到勝利,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="白方獲得了勝利!";

Display();

if(getch()==0xE0)

{

getch();

}

return Now;

}else if(count==MAXIMUS*MAXIMUS)? ? ? ? ? ? ? ? ? ? ? ?//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果回合數(shù)達(dá)到了棋盤總量,即棋盤充滿,即為平局

{

showText="平局!";

Display();

if(getch()==0xE0)

{

getch();

}

return 0;}}}

else if(input==0xE0)? ? ? ? ? ? ? ? ? ? //如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵

{

input=getch();? ? ? ? ? ?//獲得第二次輸入信息

switch(input)? ? ? ? ? ? ? //判斷方向鍵方向并移動光標(biāo)位置

{

case 0x4B://

Cx--;

break;

case 0x48:

Cy--;

break;

case 0x4D:

Cx++;

break;

case 0x50:

Cy++;

break;

}

if(Cx<0)Cx=MAXIMUS-1;? ? ? ? ? ? //如果光標(biāo)位置越界則移動到對側(cè)

if(Cy<0)Cy=MAXIMUS-1;

if(Cx>MAXIMUS-1)Cx=0;

if(Cy>MAXIMUS-1)Cy=0;

}

}

}

int main()? ? ? ? ? ? ?//主函數(shù)

{

system("title 簡易五子棋 ——");? ? ? ? ? ? //設(shè)置標(biāo)題

system("mode con cols=63 lines=32");? ? ? ? ? ? ?//設(shè)置窗口大小

system("color B1");? ? ? ? ? ? ? ? ? ?//設(shè)置顏色

while(1){? ? ? ? ? ? ? ? //循環(huán)執(zhí)行游戲

RunGame();

}}

3. 計算器程序的設(shè)計

設(shè)計目標(biāo):實現(xiàn)一個計算器功能的程序。能夠用C語言提供的圖形庫函數(shù)繪制計算器界面、基本的運算程序、計算界面數(shù)據(jù)數(shù)據(jù)、運算符定位和刷新功能。 設(shè)計思路參考: (1)初始化圖形系統(tǒng),定義視口,確定計算器在屏幕中的位置。 (2)以矩形等形狀畫出計算器外形,設(shè)計計算各按鈕位置及輸出區(qū)域位置和效果,將表示數(shù)字和運算符的符號以文本顯示在對應(yīng)按鈕位置,接收輸入,判斷其內(nèi)容是否合法并給出提示,若合法將對應(yīng)信息顯示在輸出區(qū)域 (3)當(dāng)輸入為“等號”時,計算結(jié)果并將結(jié)果顯示在輸出口。 實現(xiàn)計算函數(shù)部分的偽C程序如下(入口:(left,top),左上角坐標(biāo)。出口:最后一次計算的結(jié)果。): double Computer(intleft,int top) { 核對屏幕位置,是否可容納缺省的計算器尺寸; 保存計算器占用的屏幕畫面; 畫出計算器外形; do? { char str1[len],str2[len]; /兩個數(shù)對應(yīng)的串/ char popstr[長度]; /可存兩串及一個運算符的數(shù)組/ double Data1,Data2; /由串轉(zhuǎn)換后的兩個數(shù)/ int Flag=0; /輸入的數(shù)據(jù)個數(shù),Flag=2時計算/ char oper; /運算符/ oper=接收按鍵; if(oper是0 ̄9字符) if(在數(shù)據(jù)的限定長度內(nèi)) 將oper寫入popstr; else 不處理或響鈴; else if(oper是非法字符) 不處理或響鈴; else /oper是運算符、或為=、或為/ { if(oper==Esc) 中止并返回0; else{ 測試popstr中的字符串; if(是形式) { 計算結(jié)果并顯示; if(輸入為運算符) { strcpy(popstr,計算結(jié)果串); 將oper寫入popstr;}} else if(是形式) 將oper寫入popstr; else 不處理或響鈴;} }}while(終止條件); return 最后計算結(jié)果;}

#include

void main(void){//簡易計算機(jī)的設(shè)計

int c=1;

float operationA=0;

float operationB=0;

int isContinue=1;

while(isContinue){

printf("請選擇你要進(jìn)行的運算類型:1加法,2減法,3乘法,4除法\n");

scanf("%d",&c);

printf("請輸入第一個運算數(shù)字:\t");

scanf("%f",&operationA);

printf("請輸入第二個運算數(shù)字:\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("除數(shù)不能為零!請重新輸入第二個數(shù):");

scanf("%f",&operationB);

}

printf("%f / %f = %f\n",operationA,operationB,operationA/operationB);

}else{

printf("請正確選擇運算:");

}

printf("\n\n");

printf("你是否還要繼續(xù)進(jìn)行運算:是:1 ? ?否:0 \n");

scanf("%d",&isContinue);

if(isContinue==0){

isContinue=0;

}}

printf("歡迎使用本計算機(jī)!");}

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)//坐標(biāo)函數(shù)

{

COORD pos ;

pos.X = x ;

pos.Y = y ;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE) , pos) ;

}

void color(int a)//顏色函數(shù)

{

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++)//設(shè)置行標(biāo)號

{

color(13);

printf("%d ",x);

}

for(x=1;x<=SIZE;x++)//設(shè)置列標(biāo)號

{

gotoxy(0,x);

printf("%d ",x);

}

for(y=1;y<=SIZE;y++)//初始化雷區(qū)

{

gotoxy(2,y);

for(x=1;x<=SIZE;x++)

{

color(11);

printf("□");

}}

gotoxy(45,0);//設(shè)置文字提示

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("踩中雷區(qū)陣亡,請再接再厲!!!");

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);? ? ? ? ? ? ? //移動光標(biāo)到坐標(biāo)23,21

for(x=0,y=0;x1 !=0||y1 !=0;)

{

Sleep(1000);? ? ? ? ? ?//延時

if(kbhit())//輸入坐標(biāo)

{

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); //檢測有沒有踩雷,如果踩雷顯示雷,如果沒有,顯示周圍雷的個數(shù)

}

if(!step)

{

gotoxy(10,5);

printf("真棒!!您贏了!!");

exit(0);

}}

exit(0);

}

總結(jié)

以上是生活随笔為你收集整理的long在C语言中是非法字符吗,C程序设计实践——实验指导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。