C语言程序设计:通讯录程序设计

C语言程序设计:通讯录程序设计,第1张

#include "stdlib.h"

#include "string.h"

#include "conio.h"

#include "stdio.h"

#include "dos.h"

FILE *fp

int i//i是全局变量 可代替length

struct address

{ char postnum[10]

char a[40]//家庭地址

}

struct birthday

{ int year

int month

int day

}

struct ffriend

{ int num//序号

char name[20]

char sex

char telephone[13]

struct birthday birthday

struct address address

}

friends[50]

void Load()

{

int j

long k

fp=fopen("friend.txt","a+")//打开文件friend.txt

if(fp!=NULL)

{

for(i=1i<50i++)

{

j=fgetc(fp)

if(j==EOF) //判断是否到了文件尾

return

k=i-1

fseek(fp,k*sizeof(struct ffriend),SEEK_SET)

fread(&friends[i],sizeof(struct ffriend),1,fp)//从文件中读取一条记录

}

}

else

{

fp=fopen("friend.txt","w")

i=1

}

}

void Show(int j)

{

// friends[j].num=i

printf("\n\n\t编号-Nnumber: %3d",friends[j].num)

printf("\n\t姓名-Name:%-20s",friends[j].name)

printf("\n\t性别-Sex:%c",friends[j].sex)

printf("\n\t联系电话-Telephone:%-13s",friends[j].telephone)

printf("\n\t出生日期-Birthday:%4d-%2d-%3d",friends[j].birthday.year,friends[j].birthday.month,friends[j].birthday.day)

printf("\n\t邮编-Postnum:%-10s",friends[j].address.postnum)

printf("\n\t通信地址-address:%-40s",friends[j].address.a)

}

void Append(int j)

{

fflush(stdin)//区内清除文件缓冲区,文件以写方式打开时将缓冲容写入文件

//stdin是一个标准FILE*(文件型指针)指向通常是用键盘的输入的输入流

friends[j].num=j

printf("\n\t\t\t序号-Number:%d",j)

printf("\n\t\t\t姓名-Name:")

scanf("%s",friends[j].name)

fflush(stdin)//为什么没有fflush(stdin)的效果会自动跳过呢?

printf("\t\t\t性别-Sex(m/w):")//为什么输入汉字男女也会自动跳过联系电话呢

scanf("%c",&friends[j].sex)

printf("\t\t\t联系电话-telephone:")

scanf("%s",friends[j].telephone)

printf("\t出生日期-birthday")

printf("\n\t\t\t年份-year:")

scanf("%d",&friends[j].birthday.year)

printf("\t\t\t月份-month:")

scanf("%d",&friends[j].birthday.month)

printf("\t\t\t日-day:")

scanf("%d",&friends[j].birthday.day)

printf("\t\t\t邮编-Postnumber:")

scanf("%s",friends[j].address.postnum)

printf("\t\t\t通信地址-Address:")

scanf("%s",friends[j].address.a)

getchar()

}

void Delete()

{

int k

printf("\n\tDelete 序号-Number:")

scanf("%d",&k)

if(k<=i)

{

for(int j=kj<i+1j++) /*插入位置后的元素顺序后移*/

{

strcpy(friends[j].name,friends[j+1].name)/*交换元素内容*/

friends[j].sex=friends[j+1].sex

strcpy(friends[j].telephone,friends[j+1].telephone)

friends[j].birthday.year=friends[j+1].birthday.year

friends[j].birthday.month=friends[j+1].birthday.month

friends[j].birthday.day=friends[j+1].birthday.day

strcpy(friends[j].address.postnum,friends[j+1].address.postnum)

strcpy(friends[j].address.a,friends[j+1].address.a)

}

i--

}

else

{

printf("输入的序号太大!")

}

}

void Modify(int j)

{

Append(j)

}

void Save()

{

int j

fp=fopen("friend.txt","w")

for(j=1j<=ij++)

{

fwrite(&friends[j],sizeof(struct ffriend),1,fp)

}

fclose(fp)

}

void main()

{

int j

char grade

char searchname[10]

Load()

i--

do

{

printf("\t\t\t\t简易通讯录\n\n")

printf("功能选择(Function choose)\n")

printf("\1A.读取(Read)\n")

printf("\2B.增添(Append)\n")

printf("\6C.插入(Insert)\n")

printf("\5D.删除(Delete)\n")

printf("\5E.查询(Search)\n")

printf("\6F.修改(Modify)\n")

printf("\2G.保存(Save)\n")

printf("\1H.退出(Quit)\n")

printf("请选择(Choice)\n注:输入A~H的大写字母\n")

scanf("%c",&grade)

switch(grade)

//加个大写和小写 都可以啊

{

case 'A': j=1//显示功能

while(getchar()!=0x1b&&j<=i) //增添按Esc键退出

{

Show(j++)

printf("\n请按回车键继续!")

}

if(j-1<1)

{

printf("\n\t空文档,无任何记录-Empty Note\n")

printf("\n请按回车键继续!")

getchar()

}

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

break

case 'B': //增加功能

while(i<=50) //增加按ESC键退出的功能

{

i++

Append(i)

printf("\t是否继续增加?y/n")

//修改 加上else if 其他就跳出或强制打印出出错

char a=getchar()

if(a=='n'||a=='N')

break

}

if(i==51)

printf("\n\t文档已满,无法增加记录-note full")

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

getchar()

break

case 'C':

int k

printf("\n\t输入要插入的位置:")

scanf("%d",&k)

j=i+1

friends[j].num=j

for(jj>kj--) //插入功能

{

strcpy(friends[j].name,friends[j-1].name)//数据后移

friends[j].sex=friends[j-1].sex

strcpy(friends[j].telephone,friends[j-1].telephone)

friends[j].birthday.year=friends[j-1].birthday.year

friends[j].birthday.month=friends[j-1].birthday.month

friends[j].birthday.day=friends[j-1].birthday.day

strcpy(friends[j].address.postnum,friends[j-1].address.postnum)

strcpy(friends[j].address.a,friends[j-1].address.a)

}

Append(k)

i++

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

break

case 'D': //删除功能 //增添随意删除多条记录的功能

Delete()

if(i<1)

printf("\n没有记录-No records\n")

printf("\n请按回车键继续!")

getchar()

getchar()

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

break

case 'E': //查询功能

printf("\n\t请输入要查询记录的相关姓名:")//增添查询按列号的

scanf("%s",searchname)

for(j=1j<=ij++)

{

if(strcmp(searchname,friends[j].name)==0) //比较字符串

{

Show(j)

break

}

}

if(i<1)

{

printf("\n 没有您所查询的记录-No records")

printf("\n 请按回车键继续!")

getchar()

}

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

getchar()

break

case 'F': //修改功能 / /增添按序列号查询

printf("\n\t请输入要修改记录的相关姓名:")

gets(searchname)

scanf("%s",searchname)

for(j=1j<=ij++)

{

if(strcmp(searchname,friends[j].name)==0) //比较字符串

{

Modify(j)

// getchar()//加个输出确定修改吗

}

}

if(i<1) //修改功能

{ printf("\n 没有您所要修改的记录-No records")

printf("\n 请按回车键继续!")

getchar()

getchar()

}

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

break

case 'G':

Save()//存盘功能

getchar()

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

break

case 'H': //退出功能

char x

printf("是否保存?yes/no\n")

scanf("%s",&x)

//getchar()

// getchar()

if(x=='y')

{

Save()

exit(0)

}

else

exit(0)

default:

printf("\n\t输入有误,请输入正确的序列号!")

printf("\n请按回车键继续!")

getchar()

printf("\n\t\t\t\t\t\t\t此次 *** 作结束")

printf("\n\t------------------------------------------------------------\t\t\n")

}

}while(1)

}

编程原理

程序1为查询通信方式接口程序,为一典型的数据采集例程。其中bioscom()函数初始化COM1(此函数实际调用BIOS

INT

14H中断0号功能)。这样在程序中就避免了具体设置波特率因子等繁琐工作,只需直接访问发送/接收寄存器(3F8H)和线路状态寄存

CLIENT:

#include <stdio.h>

#include <stdio.h>

#include <winsock.h>

#pragma comment(lib,"Ws2_32")

#define PORT 6666 /* 客户机连接远程主机的端口 */

#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */

int main()

{

int sockfd, numbytes

char buf[MAXDATASIZE]

char msg[MAXDATASIZE]

char *argv="127.0.0.1"

struct sockaddr_in their_addr /* 对方的地址端口信息 */

WSADATA wsWSAStartup(MAKEWORD(2,2),&ws)//初始化Windows Socket Dll

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

//如果建立socket失败,退出程序

printf("socket error\n")

exit(1)

}

//连接对方

their_addr.sin_family = AF_INET/* 协议类型是INET */

their_addr.sin_port = htons(PORT) /* 连接对方PORT端口 */

their_addr.sin_addr.s_addr = inet_addr(argv) /* 连接对方的IP */

if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)

{

//如果连接失败,退出程序

printf("connet error\n")

closesocket(sockfd)

exit(1)

}

while(1){

scanf("%s",msg)

//发送数据

if (send(sockfd, msg, MAXDATASIZE, 0) == -1)

{

printf("send error")

closesocket(sockfd)

exit(1)

}

//接收数据,并打印出来

if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)

{

//接收数据失败,退出程序

printf("recv error\n")

closesocket(sockfd)

exit(1)

}

buf[numbytes] = '\0'

printf("Received: %s\n",buf)}

closesocket(sockfd)

return 0

}

SERVER:

#include <stdio.h>

#include <winsock.h>

#pragma comment(lib,"Ws2_32")

#define MYPORT 6666 /*定义用户连接端口*/

#define BACKLOG 10 /*多少等待连接控制*/ #define MAXDATASIZE 100

int main()

{

int sockfd, new_fd /*定义套接字*/

struct sockaddr_in my_addr /*本地地址信息 */

struct sockaddr_in their_addr /*连接者地址信息*/

int sin_size,numbytes char msg[10],buf[MAXDATASIZE]

WSADATA ws

WSAStartup(MAKEWORD(2,2),&ws) //初始化Windows Socket Dll

//建立socket

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

//如果建立socket失败,退出程序

printf("socket error\n")

exit(1)

}

//bind本机的MYPORT端口

my_addr.sin_family = AF_INET/* 协议类型是INET */

my_addr.sin_port = htons(MYPORT) /* 绑定MYPORT端口*/

my_addr.sin_addr.s_addr = INADDR_ANY /* 本机IP*/

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)

{

//bind失败,退出程序

printf("bind error\n")

closesocket(sockfd)

exit(1)

}

//listen,监听端口

if (listen(sockfd, BACKLOG) == -1)

{

//listen失败,退出程序

printf("listen error\n")

closesocket(sockfd)

exit(1)

}

printf("listen...")

//等待客户端连接

sin_size = sizeof(struct sockaddr_in)

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)

{

printf("accept error\n")

closesocket(sockfd)

exit(1)

}

printf("\naccept!\n")

while(1) {

if((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) continue

if(!strcmp(buf,"bye"))

{

//成功,关闭套接字

closesocket(sockfd)

closesocket(new_fd)

return 0

}

printf("%s %d",buf,strlen(buf))

sprintf(msg,"%d",strlen(buf))

if (send(new_fd,msg,MAXDATASIZE, 0) == -1)

{

printf("send ERRO")

closesocket(sockfd)

closesocket(new_fd)

return 0

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11148873.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存