文档库 最新最全的文档下载
当前位置:文档库 › 算法与编程实验报告

算法与编程实验报告

算法与编程实验报告
算法与编程实验报告

算法与编程实验报告

姓名:

学号:

班级:

专业:

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:

相关文档