通讯录中要有 人名、年龄、性别、地址、手机号码这些信息,因此我们可以通过结构体进行实现。
我们在实现了通讯录的基本信息后,我们需要对通讯录的各个信息大小进行设置,以及通讯录的长度等,并将功能进行声明。
将以上要求写入头文件(contact.h)中
#include<stdio.h>
#include<string.h>
#define MAX_NAME 20
#define MAX_SEX 4
#define MAX_ADDR 20
#define MAX_TELE 12
#define MAX 1000
struct PeoInfo{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char addr[MAX_ADDR];
char tele[MAX_TELE];
}
struct Contact{
struct PeoInfo data[MAX];
int size; //通讯录的现有长度
}
//初始化通讯录
void InitContact(struct Contact*ps);
//增加功能
void AddContact(struct Contact*ps);
//删除功能
void DelContact(struct Contact*ps);
//更改功能
void ModifyContact(struct Contact*ps);
//查找功能
void SearchContact(const struct Contact*ps); //此处使用const,是因为查找并不改变数据,展示也是同理
//展示功能
void ShowContact(const struct Contact*ps);
//排序功能
void SortContact(struct Contact*ps);
通讯录的功能中包含增删改查,我们在此基础上,增加了展示功能以及排序功能,以及使用之前需要初始化,其大致框架如下:写入test.c中
#include"contact.h"
void menu(){
printf("********************\n");
printf("**1.增加 2.删除***\n");
printf("**3.更改 4.查找***\n");
printf("**5.展示 6.搜索***\n");
printf("**0.退出 ***\n");
printf("********************\n");
}
int main(){
int input=0;
struct Contact con; //创建通讯录
InitContact(&con); //初始化通讯录
do{
menu();
printf("输入您的选择:>");
scanf("%d",&input);
switch(input){
case ADD:
AddContact(&con); //增加功能 与枚举中的ADD对应 1
case DEL:
DelContact(&con); //删除功能 与枚举中的DEL对应 2
case MODIFY:
ModifyContact(&con); //更改功能
case SEARCH:
SearchContact(&con); //搜索功能
case SHOW:
ShowContact(&con); //展示功能
case SORT:
SortContact(&con); //排序功能
case EXIT: // 与枚举中的EXIT对应 0
printf("退出\n");
default:
printf("请输入0——6范围内的数字\n");
}
}while(input);
}
上述代码中的switch选项 是通过头文件中的枚举进行实现的,写入contact.h中,代码如下
enum Option
{
EXIT, //此处采用枚举进行一个switch的选项,枚举中
ADD, //首项默认为0,然后依次加1,最终各项正好与switch()中的选项值相等
DEL, //于是当输入0~6时,对应test.c中的功能
MODIFY,
SEARCH,
SHOW,
SORT
}
我们使用三个文件进行通讯录的实现:
1.test.c
2.contact.h
3.contact.c
我们将main函数放在test.c文件中,而通讯录信息等数据结构,预处理,声明等放在contact.h文件中,而具体功能放置在contact.c文件中
初始化代码如下(写入contact.c中):
void InitContact(struct Contact*ps){
memset(ps->data,0,sizeof(ps->data));
ps->size=0;
}
void AddContact(struct Contact*ps){
if(ps->size==MAX)
{ printf("已满,无法添加\n");
}
else
{
printf("请输入添加的人名:>");
scanf("%s",ps->data[ps->size].name); //data作为数组名时,代表的是指针,当我们要其内部成员时,需要使用箭头操作符
printf("请输入添加的年龄:>"); //但当以数组形式时,data[i],这种形式时
scanf("%d",&(ps->data[ps->size].age)); //此时是一个命名的具体的单个结构体,于是我们用
printf("请输入添加的性别:>"); //点操作符直接访问其内部成员,而不是箭头操作符
scanf("%s",ps->data[ps->size].sex);
printf("请输入添加的地址:>");
scanf("%s",ps->data[ps->size].addr);
printf("请输入添加的电话:>");
scanf("%s",ps->data[ps->size].tele);
ps->size++;
}
}
void FindByNmae(struct Contact*ps)
{
char name[MAX_NAME];
printf("输入查找的名字:>");
scanf("%s",&name);
int i=0;
for(i=0;i<ps->size;i++)
{ if(0==strcmp(name,ps->data[i].name)
return i;)
}
return -1;
}
void DelContact(struct Contact*ps)
{
//查找功能
int pos=FindByName(ps);
//删除功能
if(pos==-1)
{printf("没有此人\n");
}
else
{ int j=0;
for(j=pos;j<ps->size-1;j++)
{
ps->data[ret].name=ps->data[ret+1].name;
}
ps->size--;
printf("删除成功\n");
}
}
void ModifyContact(struct Contact*ps)
{
int pos=FindByName(ps);
if(pos==-1)
{
printf("查无此人\n");
}
else
{
printf("请输入更改的人名:>");
scanf("%s",ps->data[pos].name);
printf("请输入更改的年龄:>");
scanf("%d",&(ps->data[pos].name));
printf("请输入更改的性别:>");
scanf("%s",ps->data[pos].sex);
printf("请输入更改的地址:>");
scanf("%s",ps->data[pos].addr);
printf("请输入更改的电话:>");
scanf("%s",ps->data[pos].tele);
}
}
void SearchContact(const struct Contact*ps)
{
int pos=FindByName(ps);
if(pos==-1)
{
printf("查无此人\n");
}
else
{
printf("%20s\t%4s\t%10s\t%12s\t%20s\t","姓名","年龄","性别","地址","电话");
printf("%20s\t%4d\t%10s\t%12s\t%20s\t",
ps->data[pos].name,
ps->data[pos].age,
ps->data[pos].sex,
ps->data[pos].addr,
ps->data[pos].tele);
}
}
void ShowContact(const struct Contact *ps)
{
if(ps->size==0)
{
printf("列表为空\n");
}
else
{
printf("%20s\t%4s\t%10s\t%12s\t%20s\t","姓名","年龄","性别","地址","电话");
int i=0;
for(i=0;i<ps->size;i++)
{
printf("%20s\t%4d\t%10s\t%12s\t%20s\t",
ps->data[i].name,
ps->data[i].age, //此处age为%d,是因为age在结构体中为int型
ps->data[i].sex,
ps->data[i].addr,
ps->data[i].tele);
}
}
}
void bubble_sort(struct Contact*ps)
{
int i=0;
for(i=0;i<ps->size;i++)
{
int j=0;
for(j=0;j<ps->size-1-i;j++)
{
if(ps->data[j].age>ps->data[j+1].age)
{
struct PeoInfo tmp=ps->data[j];
ps->data[j]=ps->data[j+1];
ps->data[j+1]=tmp;
}
}
}
}
void SortContact(const struct Contact*ps)
{
bubble_sort(ps);
printf("排序成功\n"); //该功能是通过年龄进行排序的
}
因此此时我们在main函数中创建了con,此时的con只是一个结构体,因此当我们需要进行操作时,我们需要取其地址,再进行操作,于
是传递的参数便是 &con 。
在增加功能中,我们可以看到scanf中,有些参数传递时需要 &符号,而有些不需要,是因为类型不同,name,sex,addr,tele等参数在
struct PeoInfo中是数组,数组名在使用时会产生 指针常量,指向第一个元素地址,因此不需要,而age需要&符号,是因为此时age是
int类型,需要传递其地址,才能修改其值。
因为此时data[ps->size],此时的data是一个命名的单个的结构体,而不是指针,因此在访问其成员时,使用的是点头操作符。
若此时只有数组名data,则传递的是一个常量指针,此时使用的便是 箭头操作符。
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复