算法与编程实验报告
姓名:
学号:
班级:
专业:
2012.6.26
基础训练题目部分
题1.指示灯控制
问题描述:
N盏灯排成一排,从1到N按顺序依次排号。有N个人也从1到N依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯做相反处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将他打开)。以后的人都和三一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。请编写程序实现。要求:程序中要显示每个人所做工作的过程,列如:第i个人操作时,则显示将i和i的倍数和灯做相反处理过程;当第N个人操作之后,显示灯的最后状态。
程序代码与解释
#include
void main()
{
int n,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
int t=0;
void check(char a[])
{
int i;
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;
}
}
// 用来找到数字的位数,同时移动指针到下一个位置
int fun(char a[])
{
int i,k=0;
for(i=t;;i++){
if(a[i]>='0'&&a[i]<='9')
k++;
else{
t=t+k+1;
break;
}
}
return k-1;
}
void sort(char a[],double b[],char c[])
{
int k,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);
}
}
void main()
{
int i,j;
char a[50],c[4]={'\0'};
double b[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]){
// '*' 乘法
case 42:{
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;
}
// '/' 除法
case 47:{
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"
struct Telephone
{
char number[200];
char name[20];
char off[20];
char addrass[20];
char mail[20];
char telephone[20];
struct Telephone *next;
};
typedef struct Telephone TEL;
TEL *head=NULL;
void Menu(); /*菜单*/
void Crease(); /*添加条目*/
void print(); /*输出条目*/
void Search(); /*查找条目(按姓名)*/
void Delate(); /*删除信息*/
void Save(); /*保存到文件*/
void Open(); /*打开文件*/
void Change(); /*修改信息*/
void Arrange(); /*排序*/
void main()
{
char ch;
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;
}
}
}
/*菜单*/
void Menu()
{
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请选择:");
}
/*添加条目*/
void Crease()
{
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("此信息已添加!");
}
/*输出学生信息*/
void print()
{
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.按姓名*/
void Search()
{
TEL *p;
char findname[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);
}
}
/*删除信息*/
void Delate()
{
char findname[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("此信息已删除!");
}
else printf("无此信息!\n");
}
void Save() /*保存链表信息到文件并释放内存空间*/
{
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);
}
/*文件信息输出到链表*/
void Open()
{
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); /*关闭文件*/
}
void Change()
{
TEL *p;
char name[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); }
else printf("无此信息!\n"); }
}
程序流程图
main:
Menu:
Crease:
Print:
Search:
Delete: