简单计算器
#include<stdio.h>
int main()
{
int a=0,b=0;
char c = 0;
scanf("%d %c %d",&a,&c,&b);
if(c=='\\' && b ==0){printf("Divided by zero!");
}
else{
switch(c){
case '+':printf("%d",a+b);break;
case '-':printf("%d",a-b);break;
case '*':printf("%d",a*b);break;
case '/':printf("%d",a/b);break;
default:printf("Invalid operator!");
}
}
return 0;
}
图书管理系统
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int nCount =0;
typedef struct Node {
struct Node * Blink;//指向上一个节点
struct Node * Flink;//指向下一个节点
char BookName[50];
float BookPrice;
int BookNumber;
};
struct Node * ndHeaderNode =NULL;//全局的头节点
struct Node * AppendNode(struct Node * CurrentNode,char * BookName,int BookNumber,float BookPrice)//CurrentNode当前节点
{
struct Node * pNewNode = NULL;//一个新节点
struct Node * pTempNode = NULL;//一个临时节点
struct Node * pHeadNode = CurrentNode;//一个头节点,接收当前节点作为头节点使用
pNewNode = (struct Node *)malloc(sizeof(struct Node));//新节点开辟内存,申请一个节点大小的内存
if(pNewNode == NULL)//判断新节点是否仍然指向null,如果指向的话,则证明内存申请失效
{
printf("memory malloc failed!\n");
return pNewNode;
}
if(CurrentNode == NULL)//如果当前节点为空,即为一个空链表,插入的节点为头节点
{
CurrentNode = pNewNode;//当前节点也是一块内存,把当前节点指向新申请的内存
CurrentNode->Blink = NULL;//当前节点的前节点为空
CurrentNode->Flink = NULL;//当前节点的后节点为空,即可证明当前节点为头节点
}
else
{
while(pHeadNode->Flink != NULL)//如果头节点的后一个节点不为空,即从第一个节点到最后一个节点依次遍历
{
pTempNode = pHeadNode;//临时的节点指针指向头节点
pHeadNode = pHeadNode->Flink;//头节点等于自己的后一个节点
}
pHeadNode->Flink = pNewNode;//循环过后,头节点到达末尾,将新节点的值赋予给头节点
pHeadNode->Blink = pTempNode;//将头节点的上一个节点设置为临时节点(之前临时节点就在头节点前面)
}
strcpy(pNewNode->BookName,BookName);//赋予新节点的名字
pNewNode->BookPrice = BookPrice;//赋予新节点的价格
pNewNode->BookNumber = BookNumber;//赋予新节点的书号
pNewNode->Flink=NULL;//使新节点的后一个节点为
nCount++;//添加节点的数量
return CurrentNode;//返回当前节点,即返回了添加节点之后的节点
}
void QueryNode(struct Node * HeaderNode,char * BookName)//根据书名去查找
{
if(HeaderNode == NULL)//判断头节点是否为空
{
printf("ERROR:HeaderNode == NULL\n");
return;
}
if (strcmp(HeaderNode->BookName, BookName) == 0)
{
printf("书名:%s\n", HeaderNode->BookName);
printf("定价:%f\n", HeaderNode->BookPrice);
printf("书号:%d\n", HeaderNode->BookNumber);
return;
}
// for(size_t i = 0;i<nNodeCount,i++)
// {
// if(strcmp(HeaderNode->BookName,BookName) == 0)
// {
// printf("书名:%s\n",HeaderNode->BookName);
// printf("定价:%f\n",HeaderNode->BookPrice);
// printf("书号:%d\n",HeaderNode->BookNumber);
// return;
// }
// HeaderNoder = HeaderNode->Flink;
// }
while(HeaderNode->Flink != NULL)//判断头节点后面的是否为空
{
HeaderNode = HeaderNode->Flink;//头节点后移一位
if(strcmp(HeaderNode->BookName,BookName)==0)//
{
printf("书名:%s\n", HeaderNode->BookName);
printf("定价:%f\n", HeaderNode->BookPrice);
printf("书号:%d\n", HeaderNode->BookNumber);
return;
}
}
printf("Can Not Found!\n");
}
void ModifyNode(struct Node * HeaderNode,char * BookName,float BookPrice)//根据书名修改定价
{
if(HeaderNode == NULL)//判断头节点是否为空
{
printf("ERROR:HeaderNode==NULL\n");
return;
}
if(strcmp(HeaderNode->BookName,BookName)==0)//如果头节点和我们输入的参数相等,即不需要向下遍历了
{
HeaderNode->BookPrice = BookPrice;//修改头节点的价格
printf("ModifyNode Success!\n");
return;
}
while(HeaderNode->Flink!=NULL)//如果头节点的下一个节点不为空
{
HeaderNode = HeaderNode->Flink;//先把自己,即头节点指向下一个节点,因为头节点的书名已经对比过了
if(strcmp(HeaderNode->BookName,BookName)==0)//如果头节点和我们输入的参数相等,即不需要向下遍历了
{
HeaderNode->BookPrice=BookPrice;//修改头节点的价格
printf("ModifyNode Success!\n");
return;
}
}
printf("ModifyNode Failed!\n");
return;
}
void DeleteNode(struct Node * HeaderNode,char * BookName)
{
struct Node * pNode = NULL;//定义一个临时节点
pNode = HeaderNode;//临时节点指向头节点的地址
for(size_t i = 0;i<nCount;i++)//
{
if(strcmp(pNode->BookName,BookName)==0)//判断节临时点的书名字是否与查询的书名相同
{
if(pNode == HeaderNode)//如果发现找到的节点与头节点相同
{
pNode = HeaderNode->Flink;//将临时节点后移到当前这个头节点的下一个节点
free(HeaderNode);//释放了头节点的空间
ndHeaderNode=pNode;//将全局的头节点指向我们的临时节点,当前的头节点已经没了
HeaderNode = ndHeaderNode;//头节点指向全局的头节点
nCount--;//数量减一
return;
}
if(pNode->Flink==NULL)//删除尾节点,判断这个节点的下一个为空
{
pNode->Blink->Flink=NULL;//将当前节点的上一个节点的下一个节点设置为null,这样上一个节点就认为自己是尾节点
free(pNode);//free临时节点
nCount--;
printf("Delete Success!\n");
return;
}
//下面是中间的节点
pNode->Blink->Flink=pNode->Flink;//临时节点的前一个节点的后一个节点,指向临时节点的后一个节点
pNode->Flink->Blink=pNode->Blink;//临时节点的后一个节点的前一个节点,指向临时节点的前一个节点
free(pNode);//这样这个临时节点就可以free了
nCount--;
printf("Delete Success!\n");
return;
}
pNode = pNode->Flink;//当前节点等于下一个节点
}
}
void WriteFile(struct Node * HeaderNode,char * szFilePath)
{
struct Node *p = HeaderNode;//定义一个临时节点
FILE * w = fopen(szFilePath,"wb");//以写方式打开当前目录下文件,使w指向该文件,可以通过w操作该文件(b,二进制文件)
if(w ==NULL)
{
printf("open file failed!\n");
system("pause");//调用操作系统暂停功能
fclose(w);
exit(0);
}
while(p)
{
printf("%s",p->BookName);
printf("%f",p->BookPrice);
printf("%d",p->BookNumber);
printf("\n");
fprintf(w,"%s",p->BookName);// fprintf发送格式化输出到流 stream 中
fprintf(w,"%f",p->BookPrice);
fprintf(w,"%d",p->BookNumber);
fprintf(w,"\n");
p=p->Flink; //p向后移动一位
}
fprintf(w,"\n");
fclose(w);
return;
}
struct Node * ReadFile(char * szFilePath)
{
struct Node * head = (struct Node *)malloc(sizeof(struct Node));//(Node *)malloc(sizeof(Node))是指在malloc成功后返回一个Node类型的指针
head->Blink = NULL;//头节点前一个为空
head->Flink = NULL;//头节点后一个为空
char name[50];
memset(name,0,50);//常用于内存空间初始化。
float price;
int number;
struct Node * p;
struct Node * q;
p = q = head;
FILE * r = fopen(szFilePath,"rb");
if(r == NULL)
{
printf("open file failed!\n");
system("pause");
fclose(r);
exit(0);
}
while(fscanf(r,"%s",name)!=EOF)//在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件
{
q = (struct Node *)malloc(sizeof(struct Node));//(Node *)malloc(sizeof(Node))是指在malloc成功后返回一个Node类型的指针
fscanf(r,"%f",&price);
fscanf(r,"%d",&number);
strcpy(q->BookName,name);//string copy(字符串复制)的缩写
q->BookPrice = price;
q->BookNumber = number;
q->Blink = p;//q的前一位为p
p=q;
}
p->Flink = NULL;//p的后一位为空
return head->Flink;//返回头的后一位
}
void show(struct Node * HeaderNode)
{
printf("书名:%s\n",HeaderNode->BookName);
printf("定价:%f\n",HeaderNode->BookPrice);
printf("书号:%d\n",HeaderNode->BookNumber);
while(HeaderNode->Flink !=NULL)
{
HeaderNode = HeaderNode->Flink;
printf("书名:%s\n",HeaderNode->BookName);
printf("定价:%f\n",HeaderNode->BookPrice);
printf("书号:%d\n",HeaderNode->BookNumber);
}
}
void Start()
{
while(1)
{
int nFlag = 0;
int ReadFlag = 0;
char szBookName[50];
float fBookPrice = 0;
float fNewBookPrice = 0;
int nBookNumber = 0;
printf("请输入需要使用的功能:\n");
printf("1.添加书籍信息\n");
printf("2.查询书籍信息\n");
printf("3.修改书籍信息\n");
printf("4.删除书籍信息\n");
printf("5.将书籍信息存入文件\n");
printf("6.从文件中读取书籍信息\n");
printf("7.展示所有书籍信息\n");
printf("8.退出\n");
scanf("%d",&ReadFlag);
switch(ReadFlag)
{
case 1:
printf("请输入书名:");
scanf("%s",szBookName);
printf("请输入定价 :");
scanf("%f", &fBookPrice);
printf("请输入书号:");
scanf("%d", &nBookNumber);
ndHeaderNode = AppendNode(ndHeaderNode,szBookName,nBookNumber,fBookPrice);
break;
case 2:
printf("请输入书名:");
scanf("%s",szBookName);
QueryNode(ndHeaderNode,szBookName);
break;
case 3:
printf("请输入书名:");
scanf("%s", szBookName);
printf("请输入新的定价:");
scanf("%f", &fNewBookPrice);
ModifyNode(ndHeaderNode,szBookName,fNewBookPrice);
break;
case 4:
printf("请输入书名:");
scanf("%s", szBookName);
DeleteNode(ndHeaderNode,szBookName);
break;
case 5:
WriteFile(ndHeaderNode,"information.txt");
break;
case 6:
ndHeaderNode = ReadFile("information.txt");
break;
case 7:
show(ndHeaderNode);
break;
case 8:
nFlag =1;
break;
}
if(nFlag)
{
break;
}
}
}
int main()
{
Start();
return 0;
}