C语言经典小程序和C语言编写的小游戏带注释 自动保存的.docx
《C语言经典小程序和C语言编写的小游戏带注释 自动保存的.docx》由会员分享,可在线阅读,更多相关《C语言经典小程序和C语言编写的小游戏带注释 自动保存的.docx(61页珍藏版)》请在冰豆网上搜索。
C语言经典小程序和C语言编写的小游戏带注释自动保存的
1、写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机。
#include
#include
#include
#include
intmain()
{
charcmd[20]="shutdown-s-t";//远程关机,系统在一定时间之后关机
chart[5]="0";//将输入的时间初始化为0
intc;
system("titleC语言关机程序");//设置cmd窗口标题
system("modeconcols=48lines=25");//窗口宽度高度
system("colorf0");//可以写成red调出颜色组,这里f0是调亮白色
system("date/T");//输出系统当前日期
system("TIME/T");//输出系统当前时间
printf("-----------C语言关机程序-----------\n");
printf("1.实现10分钟内的定时关闭计算机\n");
printf("2.立即关闭计算机\n");
printf("3.注销计算机\n");
printf("0.退出系统\n");
printf("-------------------------------------\n");
scanf("%d",&c);
//对输入的数值进行判断循环
switch(c)
{
case1:
printf("您想在多少秒后自动关闭计算机?
(0~600)\n");
scanf("%s",t);
system(strcat(cmd,t));//将输入的时间连接上已经调用的命令
break;
case2:
system("shutdown-p");//立即关闭计算机
break;
case3:
system("shutdown-l");//注销计算机
break;
case0:
system("pause");
break;
default:
printf("Error!
\n");
}
system("pause");
return0;
}
2、这是一个简单的猜拳游戏(剪刀、石头、步),让你与电脑对决。
你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负。
#include
#include
#include
intmain()
{
chargamer;//玩家出拳
intcomputer;//电脑出拳
intresult;//比赛结果
//为了避免玩一次游戏就退出程序,可以将代码放在循环中
while
(1)
{
printf("这是一个猜拳的小游戏,请输入你要出的拳头:
\n");
printf("A:
剪刀\nB:
石头\nC:
布\nD:
不玩了\n");
scanf("%c%*c",&gamer);
switch(gamer)
{
case65:
case97:
//A||a
gamer=4;break;
case66:
case98:
//B||b
gamer=7;break;
case67:
case99:
//C||c
gamer=10;break;
case68:
case100:
//D||d
return0;
default:
printf("你的选择为%c选择错误,退出...\n",gamer);
getchar();
system("cls");//清屏
return0;
break;
}
srand((unsigned)time(NULL));//随机数种子
computer=rand()%3;//产生随机数并取余,得到电脑出拳
result=(int)gamer+computer;//gamer为char类型,数学运算时要强制转换成int类型
printf("电脑出了");
switch(computer)
{
case0:
printf("剪刀\n");break;//41
case1:
printf("石头\n");break;//72
case2:
printf("布\n");break;//103
}
printf("你出了");
switch(gamer)
{
case4:
printf("剪刀\n");break;
case7:
printf("石头\n");break;
case10:
printf("布\n");break;
}
if(result==6||result==7||result==11)printf("你赢了!
");
elseif(result==5||result==9||result==10)printf("电脑赢了!
");
elseprintf("平手");
system("pause>nul&&cls");//暂停并清屏
}
return0;
}
3、实现统计文件中的字符数、单词数以及总行数。
(空白字符(空格符、tab缩进符、换行符)不计入字符总数)
#include
#include
int*getCharNum(char*filename,int*totalNum);
intmain()
{
charfilename[30];
//totalNum[0]:
总行数totalNum[1]:
总字符数totalNum[2]:
总单词数
inttotalNum[3]={0,0,0};
printf("请输入需要统计的文件地址及文件名:
\n");
scanf("%s",filename);
if(getCharNum(filename,totalNum))
{
printf("统计得:
%d行,%d个单词,%d个字符(不含空白字符)\n",totalNum[0],totalNum[2],totalNum[1]);
}
else
{
printf("统计失败!
!
!
\n");
}
return0;
}
/**
*统计文件的字符数、单词数、行数
*@paramfilename文件名
*@paramtotalNum文件统计数据
*@return成功返回统计数据,否则返回NULL
**/
int*getCharNum(char*filename,int*totalNum)
{
FILE*fp;//指向文件的指针
charbuffer[1003];//缓冲区,存储读取到的每行的内容
intbufferLen;//缓冲区中实际存储的内容的长度
inti;//当前读到缓冲区的第i个字符
charc;//读取到的字符
intisLastBlank=0;//上个字符是否是空格
intcharNum=0;//当前行的字符数
intwordNum=0;//当前行的单词数
if((fp=fopen(filename,"rb"))==NULL)//为输入打开一个二进制文件
{
perror(filename);//perror是系统错误输出函数
returnNULL;
}
printf("行数\t\t单词数\t\t字符数(不含空白字符)\n");
//每次读取一行数据,保存到buffer,每行最多只能有1000个字符
while(fgets(buffer,1003,fp)!
=NULL)
{
bufferLen=strlen(buffer);
//遍历缓冲区的内容
for(i=0;i{
c=buffer[i];
if(c==''||c=='\t')
{//遇到空格
!
isLastBlank&&wordNum++;//如果上个字符不是空格,那么单词数加1
isLastBlank=1;
}
elseif(c!
='\n'&&c!
='\r')
{//忽略换行符
charNum++;//如果既不是换行符也不是空格,字符数加1
isLastBlank=0;
}
}
!
isLastBlank&&wordNum++;//如果最后一个字符不是空格,那么单词数加1
isLastBlank=1;//每次换行重置为1
//一行结束,计算总字符数、总单词数、总行数
totalNum[0]++;//总行数
totalNum[1]+=charNum;//总字符数
totalNum[2]+=wordNum;//总单词数
printf("第%-3d行,共%-5d个单词,共%-6d个字符\n",totalNum[0],wordNum,charNum);
//置零,重新统计下一行
charNum=0;
wordNum=0;
system("pause");
}
returntotalNum;
}
4、实现文件复制代码(包括文本文件和二进制文件)
#include
#include
intcopyFile(char*fileRead,char*fileWrite);
intmain()
{
charfileRead[100];//要复制的文件名
charfileWrite[100];//复制后的文件名
//获取用户输入
printf("要复制的文件:
");
scanf("%s",fileRead);
printf("将文件复制到:
");
scanf("%s",fileWrite);
//进行复制操作
if(copyFile(fileRead,fileWrite))
{
printf("恭喜你,文件复制成功!
\n");
}
else
{
printf("文件复制失败!
\n");
}
return0;
}
/**
*文件复制函数
*@paramfileRead要复制的文件
*@paramfileWrite复制后文件的保存路径
*@returnint1:
复制成功;2:
复制失败
**/
intcopyFile(char*fileRead,char*fileWrite)
{
FILE*fpRead;//指向要复制的文件的指针
FILE*fpWrite;//指向复制后的文件的指针
intbufferLen=1024*10;//缓冲区长度
char*buffer=(char*)malloc(bufferLen);//开辟10K的缓存
intreadCount;//实际读取的字节数
if((fpRead=fopen(fileRead,"rb"))==NULL)//为输入打开一个二进制文件
{
perror(fileRead);//perror是系统错误输出函数
exit
(1);
}
if((fpWrite=fopen(fileWrite,"wb"))==NULL)//为输出打开一个二进制文件
{
perror(fileWrite);//perror是系统错误输出函数
exit
(1);
}
//不断从fileRead读取内容,放在缓冲区
//再将缓冲区的内容写入fileWrite
while((readCount=fread(buffer,1,bufferLen,fpRead))>0)//fread:
从文件在中读数据
{
fwrite(buffer,1,readCount,fpWrite);//fwrite:
在文件里写数据
}
free(buffer);//释放节点
fclose(fpRead);//关闭文件
fclose(fpWrite);//关闭文件
return1;
}
5、实现将一个正整数分解质因数,如:
输入90,打印出90=2*3*3*5。
#include
intmain()
{
intn;//用户输入的整数
inti;//循环标志
printf("输入一个整数:
");
scanf("%d",&n);
printf("%d=",n);
//n>=2才执行下面的循环
for(i=2;i<=n;i++)
{
while(n!
=i)
{
if(n%i==0)//算出因子
{
printf("%d*",i);//输出分解的因式
n=n/i;
}
else
break;
}
}
printf("%d\n",n);//输出分解的因式的最后一个数字
return0;
}
6、向文件写入内容并读取显示。
程序功能实现将学生信息(姓名、年龄、学号和平均分)写入文件,然后读取显示出来。
要求:
从控制台输入学生信息;
可以输入任意数目的学生信息;
文件每行存储一条学生信息,姓名、年龄、学号、平均分以tab(\t)为分隔。
#include
#include
#include
#defineFILE_PATH"D:
/demo.txt"//文件路径
intmain()
{
charname[20];//姓名
intage;//年龄
intstudNo;//学号
intnum,i;
floatscore;//平均分
FILE*fp;//文件指针
//判断文件是否能够正确创建/打开
if((fp=fopen(FILE_PATH,"wt+"))==NULL)//wt+:
为读写打开或着建立一个文本文件
{
perror(FILE_PATH);
exit
(1);
}
printf("请输入需要写入的学生总数:
");
scanf("%d",&num);
//从控制台输入学生信息并写入文件
printf("\n请输入姓名、年龄、学号和平均分(以空格相隔):
\n");
for(i=0;i{
scanf("%s%d%d%f",name,&age,&studNo,&score);
fprintf(fp,"%s\t%d\t%d\t%.2f\n",name,age,studNo,score);
}
//刷新缓冲区,将缓冲区的内容写入文件
fflush(fp);
//重置文件内部位置指针,让位置指针指向文件开头
rewind(fp);
//从文件中读取学生信息
printf("\n读取文件内容:
\n");
for(i=0;i{
fscanf(fp,"%s\t%d\t%d\t%f",name,&age,&studNo,&score);
printf("%s\t%d\t%d\t%f\n",name,age,studNo,score);
}
fclose(fp);//关闭文件
return0;
}
7、猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。
问第一天共摘了多少个桃子?
#include
#include
intmain()
{
intday,x1,x2;
day=9;//总天数减去1
x2=1;//初始第10天吃了1个桃
printf("第10天共有%d个桃子。
\n",x2);
while(day>0)
{
x1=(x2+1)*2;//第一天的桃子数是第2天桃子数加1后的2倍
x2=x1;
printf("第%d天共有%d个桃子。
\n",day,x2);
day--;//每循环一次,总天数减去1
}
printf("\n小猴第1天共摘了%d个桃子。
\n",x1);
return0;
}
8、从键盘输入年号和月号,求这一年的这一月共有多少天。
#include
#include
voidmain()
{
intyear,month,days;
printf("输入年份(1990~2050):
");
scanf("%d",&year);
printf("输入月份(1~12):
");
scanf("%d",&month);
//对输入的月份进行判断
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
days=31;break;
case4:
case6:
case9:
case11:
days=30;break;
//判断是否为闰年或平年
case2:
{
if(year%4==0&&year%100!
=0||year%400==0)
{
days=29;
printf("\n%d年是闰年!
\n",year);
}
else
{
days=28;
printf("\n%d年是平年!
\n,year")
}
break;
}
//处理因误输入的错误月份
default:
{
printf("月份输入错误!
\n");
exit
(1);
break;
}
}
printf("\n%d年的%d月份有%d天!
\n",year,month,days);
}
9、程序功能:
将从字符数组中删除特定的字符,要求字符数组和要删除的字符都是手动输入。
#include
intmain()
{
chars[80],c;
intj,k;
printf("请输入任意字符串:
");
gets(s);
printf("\n请输入需要删除的字符:
");
c=getchar();
//对字符串进行扫描
for(j=k=0;s[j]!
='\0';j++)
{
//找到输入的字符,将剩余的字符往前推移一位
if(s[j]!
=c)
s[k++]=s[j];
}
//将字符串的尾填0
s[k]='\0';
printf("\n删除字符%c后的字符串为:
%s\n",c,s);
return0;
}
10、输入一个字符串,判断其是否为回文。
所谓回文字符串,是指从左到右读和从右到左读完全相同的字符串。
#include
#include
voidmain()
{
chars[1024];//存放输入的字符串
inti,j,n;
printf("请输入任意字符串:
");
gets(s);
n=strlen(s);//计算字符串长度
//从左至右,从右至左进行扫描判断
for(i=0,j=n-1;i//判断是否为回文串
if(s[i]!
=s[j])
break;
if(i>=j)
printf("\n%s是回文串!
\n",s);
else
printf("\n%s不是回文串!
\n",s);
}
11、打印杨辉三角,用n控制输出行数。
(解法一:
使用数组)
#include
#defineN15
voidmain()
{
inti,j,k,n=0,a[N][N];//定义二维数组a[15][15]
while(n<=0||n>=13)//控制打印的行数不要太大,过大会造成显示不规范
{
printf("\n请输入要打印的行数(小于13):
");
scanf("%d",&n);
}
printf("\n%d行杨辉三角如下:
\n",n);
for(i=1;i<=n;i++)
a[i][1]=a[i][i]=1;//两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数
for(i=3;i<=n;i++)
for(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];//除两边的数外都等于上两顶数之和
for(i=1;i<=n;i++)
{
for(k=1;k<=n-i;k++)
printf("");//这一行主要是在输出数之前打上空格占位,让输出的数更美观
for(j=1;j<=i;j++)//j<=i的原因是不输出其它的数,只输出我们想要的数
printf("%6d",a[i][j]);
printf("\n");//当一行输出完以后换行继续下一行的输出
}
printf("\n\n");
}
(解法二:
使用阶乘)
#include
/*
*定义阶乘,在这里可能会想。
为什么要用float,