算法与编程实验报告.docx
- 文档编号:4602358
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:26
- 大小:166.69KB
算法与编程实验报告.docx
《算法与编程实验报告.docx》由会员分享,可在线阅读,更多相关《算法与编程实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
算法与编程实验报告
算法与编程实验报告
姓名:
学号:
班级:
专业:
2012.6.26
基础训练题目部分
题1.指示灯控制
问题描述:
N盏灯排成一排,从1到N按顺序依次排号。
有N个人也从1到N依次编号。
第一个人(1号)将灯全部关闭。
第二个人(2号)将凡是2和2的倍数的灯打开。
第三个人(3号)将凡是3和3的倍数的灯做相反处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将他打开)。
以后的人都和三一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。
请编写程序实现。
要求:
程序中要显示每个人所做工作的过程,列如:
第i个人操作时,则显示将i和i的倍数和灯做相反处理过程;当第N个人操作之后,显示灯的最后状态。
程序代码与解释
#include
voidmain()
{
intn,i,j,a[200];//定义数组来判别灯是否为亮,1为亮的,-1为黑的
printf("请输入是第几人的操作\n");
scanf("%d",&n);
for(i=1;i<=n;i++)//先将数组里的定义为1(即灯是亮的)
a[i]=1;
for(i=1;i<=n;i++)//利用循环来判断灯是否亮
{
printf("第%d个人操作时\n",i);
for(j=1;j<=n;j++)
{
if(j%i==0)//整倍则进行相反处理
a[j]=-1*a[j];
if(a[j]==1)//若数组是1则灯是亮的,是1则是黑的,并输出结果
printf("第%d盏灯是亮的\n",j);
else
printf("第%d盏灯是黑的\n",j);
}
}
}
程序流程图
运行结果:
题2.四则运算
问题描述:
运行程序时,首先提示用户输入四则运算表达式(表达式中最多有3个运算符,数据范围为1-100的整数);
输入结束后,0程序自动进行计算并给出结果。
如:
输入13-10+5/8时输出3.625。
程序代码与解释
#include
#include
#include
intt=0;
voidcheck(chara[])
{
inti;
for(i=0;a[i]!
='\0';i++)
//如果有效继续
if(a[i]>='0'&&a[i]<='9'||a[i]=='*'||a[i]=='-'||a[i]=='+'||a[i]=='/');
//重新输入
else{
printf("请重新输入\n");
scanf("%s",a);
//别忘了归零
i=0;
continue;
}
}
//用来找到数字的位数,同时移动指针到下一个位置
intfun(chara[])
{
inti,k=0;
for(i=t;;i++){
if(a[i]>='0'&&a[i]<='9')
k++;
else{
t=t+k+1;
break;
}
}
returnk-1;
}
voidsort(chara[],doubleb[],charc[])
{
intk,i=0,j,h;
for(j=0;a[j]!
='\0';j++)
//如果是操作符,就放到c数组里
if(a[j]=='*'||a[j]=='-'||a[j]=='+'||a[j]=='/')
{
c[i]=a[j];
i++;
}
for(j=0;j<=i;j++)
{
//得到当前数字的位数
k=fun(a);
//把字符串变成数字,
for(h=0;k>=0;k--,h++)
b[j]=b[j]+(a[t-2-h]-48)*pow(10,h);
}
}
voidmain()
{
inti,j;
chara[50],c[4]={'\0'};
doubleb[4]={0};
printf("请输入算式\n");
//得到算式字符串
scanf("%s",a);
//检查有效性
check(a);
//将操作数与操作符分离
//把操作数存在b数组里,
//把操作符存在c数组里.
sort(a,b,c);
//得到操作符个数i
for(i=0;c[i]!
='\0';i++);
for(j=0;j<=i;j++)
{
//先乘除
if(c[j]=='*'||c[j]=='/')
switch(c[j]){
//'*'乘法
case42:
{
b[j]=b[j]*b[j+1];
//弹出一个操作符
strcpy(c+j,c+j+1);
//减少一个操作数
for(;j
b[j+1]=b[j+2];
//使j从零开始
j=-1;
//减小一个操作符数
i=i-1;
break;
}
//'/'除法
case47:
{
b[j]=b[j]/b[j+1];
//跟上面重复
strcpy(c+j,c+j+1);
for(;j
b[j+1]=b[j+2];
j=-1;
i=i-1;
break;
}
}
}
//跟上面逻辑一样,只不过写法不同
for(j=0;j<=i;j++)
{
if(c[j]=='+')
{
b[j]=b[j]+b[j+1];
strcpy(c+j,c+j+1);
for(;j
b[j+1]=b[j+2];
j=-1;
i=i-1;
}
else
{if(c[j]=='-')
{
b[j]=b[j]-b[j+1];
strcpy(c+j,c+j+1);
for(;j
b[j+1]=b[j+2];
j=-1;
i=i-1;
}
}
}
//输出结果
printf("%f",b[0]);
}
流程图
程序运行结果
题3.通讯录
问题描述:
从键盘输入编号、姓名、单位、地址、邮箱、电话,人数要10人以上。
输入的符号字母、数字由英文字母、数字及中文构成。
将他们写入一个文件。
如果这个文件不存在,就写入新的文件。
如果文件已存在,就将他们写入该文件。
程序代码与解释
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
structTelephone
{
charnumber[200];
charname[20];
charoff[20];
charaddrass[20];
charmail[20];
chartelephone[20];
structTelephone*next;
};
typedefstructTelephoneTEL;
TEL*head=NULL;
voidMenu();/*菜单*/
voidCrease();/*添加条目*/
voidprint();/*输出条目*/
voidSearch();/*查找条目(按姓名)*/
voidDelate();/*删除信息*/
voidSave();/*保存到文件*/
voidOpen();/*打开文件*/
voidChange();/*修改信息*/
voidArrange();/*排序*/
voidmain()
{
charch;
Open();/*打开文件*/
while
(1)
{
Menu();/*显示菜单*/
scanf("%c",&ch);
switch(ch)
{
case'1':
Crease();/*添加条目*/
break;
case'2':
Search();/*查找条目1.按姓名*/
break;
case'3':
Change();/*修改信息*/
print();
break;
case'4':
Delate();/*删除信息*/
print();/*输出删除后的结果*/
break;
case'5':
print();/*输出条目*/
break;
case'0':
Save();/*保存并释放内存*/
exit(0);/*退出*/
break;
default:
printf("选择错误!
");
break;
}
}
}
/*菜单*/
voidMenu()
{
printf("\n*****************通讯录系统*****************\n");
printf("\t1.录入。
\n");
printf("\t2.按姓名查询\n");
printf("\t3.修改信息\n");
printf("\t4.删除\n");
printf("\t5.输出\n");
printf("\t0.保存并退出!
\n");
printf("*************************************************\n");
printf("\t请选择:
");
}
/*添加条目*/
voidCrease()
{
TEL*p1=NULL,*p2=NULL;
p1=(TEL*)malloc(sizeof(TEL));/*申请结点*/
printf("输入编号:
");
scanf("%s",p1->number);
printf("输入姓名:
");/*添加信息*/
scanf("%s",p1->name);
printf("输入单位:
");
scanf("%s",p1->off);
printf("输入地址:
");
scanf("%s",p1->addrass);
printf("输入邮箱:
");
scanf("%s",p1->mail);
printf("输入电话:
");
scanf("%s",p1->telephone);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(TEL*)malloc(sizeof(TEL));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此信息已添加!
");
}
/*输出学生信息*/
voidprint()
{
TEL*p=NULL;
if(head==NULL)
{
printf("此通讯录中无记录,请输入记录后在使用本功能!
\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
/*查找信息1.按姓名*/
voidSearch()
{
TEL*p;
charfindname[20];
printf("请输入要查找的姓名:
");
scanf("%s",findname);
printf("**************通讯录系统*********************\n");
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
for(p=head;p!
=NULL;p=p->next)
{
if(strcmp(p->name,findname)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
}
/*删除信息*/
voidDelate()
{
charfindname[20];/*先查找后删除*/
TEL*p=head,*pr;
printf("输入要删除的姓名:
");
scanf("%s",findname);
if(head->next==NULL)
{
printf("空链表!
\n");
return;
}
while((strcmp(p->name,findname)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(findname,p->name)==0)/*输出删除信息*/
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
printf("此信息已删除!
");
}
elseprintf("无此信息!
\n");
}
voidSave()/*保存链表信息到文件并释放内存空间*/
{
TEL*p=NULL;
FILE*fp;
char*Book="books.txt";
if(head==NULL)
{
printf("\n记录为空!
\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"wb+"))==NULL)
{
printf("\n打不开文件!
\n");
return;
}
while(p!
=NULL)/*保存信息*/
{
fwrite(p,sizeof(TEL),1,fp);
p=p->next;
}
printf("保存完毕!
\n");
fclose(fp);
/*****释放链表空间*****/
for(;head->next!
=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
/*文件信息输出到链表*/
voidOpen()
{
FILE*fp;
TEL*p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL)
{
printf("\n****************通讯录******************\n");
return;
}
head=(TEL*)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while(!
feof(fp))/*循环读取*/
{
p1=(TEL*)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(TEL),1,fp);
}
temp->next=NULL;
fclose(fp);/*关闭文件*/
}
voidChange()
{
TEL*p;
charname[20];
printf("输入要修改人的姓名:
");
scanf("%s",name);
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{printf("**************通讯录系统*********************\n");
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
printf("输入要修改的内容:
\n");
printf("输入编号:
");
scanf("%s",p->number);
printf("输入姓名:
");
scanf("%s",p->name);
printf("输入单位:
");
scanf("%s",p->off);
printf("输入地址:
");
scanf("%s",p->addrass);
printf("输入邮箱:
");
scanf("%s",p->mail);
printf("输入电话:
");
scanf("%s",p->telephone);
}
elseprintf("无此信息!
\n");
}
}
程序流程图
main:
Menu:
Crease:
Print:
Search:
Delete:
Save:
Open:
Chang:
程序运行结果:
题4.单词开头大写
问题描述:
输入一个由多个英文单词组成的句子,两个单词之间包括空格或标点符号,长度不超过200个字符。
最后输出这个英文句子使句中每个单词开头第一个字母大写,其他不变。
程序代码与解释:
#include
voidmain()
{
chars[200];//数组用来存放句子
inti;
printf("请输入英语句子\n");
gets(s);//字符串输入函数
s[0]=s[0]-32;//把第一个字母变成大写的
for(i=1;s[i]!
='\0';i++)
{
if(s[i-1]==''||s[i-1]>=32&&s[i-1]<=47)//判断前一个是不是空格或是符号
{
s[i]=s[i]-32;//把这个字母变成大写的
}
}
for(i=0;s[i]!
='\0';i++)//输出含大写单词的句子
{
printf("%c",s[i]);
}
printf("\n");
}
程序流程图:
程序运行结果:
心得体会:
通过这短学期的学习我学会了用C语言编程,在VC++环境下进行调试。
学会了按照程序功能分成几个功能模块来实现,各个功能块分别使用函数来完成。
我同时通过编写熟悉文件的访问、文本文件的读写。
掌握如何将字符串写入文本文件,从文本文件中读入字符串、随机访问文件中的数据以及修改文件中的内容,培养了我利用c语言对文件进行操作的能力。
我还学会了通过编写熟悉的字符串的方法,来加强函数的运用,字母的大小写转换。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 编程 实验 报告