结构体和指针的运用

今天按照上一次发布的博客进行延续,上一次讲的是指针的一些运用,但是我学习了一下其他优秀博主发表的博客,感觉我写的太不易懂,不如别的博主写的非常细致,所以想将以后的博客文章字数和讲解不会低于2000字任务量,以便大家能够学习到更多的东西。

目录

1结构体

1.1结构体

1.2 关于结构体的变量如何定义

输入格式:

输出格式:

输入样例:

输出样例:

现在放假了有时间保证三天一篇

上次说的贪吃蛇,直接上代码


1结构体

1.1结构体

什么是结构体,其实结构体就是多个数组和函数的组合,以下介绍一下以下三种结构体的构造。

struct man st1//struct man表示的是构造一个结构体,而st1则表示的是这个结构体变量的名字
{
   char name[100];//定义一个男人的名字
   int year[100];//定义年纪
   float tizon;/*定义体重
…………还可以根据需求自己定义*/
};//一定不要忘记用;这个是硬性规定

 第二种描述

struct student2
{
int age;
float score;
char sex;
}st2;//将结构体命名放在最后

第三种描述

struct 
{
int age;
float score;
char sex; 
}st3;

通过上面的几种描述有数组学习的同学肯定能快速地接受结构体,没有学过的也没有关系如后2种的表示对一个人这个结构体的描述也是非常不错的,能够比较好地接受。

1.2 关于结构体的变量如何定义

可以初始化时进行赋值

struct student st ={80,66.6,'F'};//依次赋值

或者用一个结构体指针

struct student *pst =&st//表示pst表示st这个结构体的地址

pst->age =88;//第二种方式

结构体相当于一个超级数组,可以容纳多种(int,float……)数组,我们要如何访问结构成员,这还需要介绍点(.)运算符:.比&的优先级要高,所以可以表达成&(library.float)如library.value就是访问library中的value部分,如果value这是float类型,那么就将library.value当成float类型的变量就行,不要进行没必要的想象。

下面总结一下这三种方法

1.用结构体变量的成员作为参数

2.用结构体变量作为实参

3.用指向结构体变量(数组)的指针作为实参,将结构体变量(数组)的地址传给形参

那现在就以一道经典题目为列子来看一下结构体与其他的运用(绝对不是我懒)

7-1 学生成绩录入及查询

息包含如下信息:
学号(11位)、姓名、数学成绩、英语成绩、程序设计成绩、物理成绩。

本题要求编写程序,录入N条学生的信息,并且按查询要求显示学生成绩等信息。

输入格式:

输入在第一行给出正整数N(N<=10);随后N行,每行按格式:

学号 姓名 数学成绩 英语成绩 程序设计成绩 物理成绩

给出一名学生的信息。
其中学号是11位数字;姓名是不超过10个字符、不包含空格的非空字符串;成绩是<=100的非负整数;

在学生信息输入完成后,给出要查询的姓名。

输出格式:

对查询的姓名的每一名学生,在一行中按照如下格式输出:

学号  姓名 数学成绩 英语成绩 程序设计成绩 物理成绩

如果有相同姓名的同学,输出全部同学的信息,每名同学一行;
如果要查询的学生不存在,则输出:

Not Found!

输入样例:

在这里给出一组输入。例如:

4
20201003012 LiWen 68 90 78 86
20201003012 HeHua 91 88 80 82
20201002121 WangFang 78 78 82 90
20201002112 ZhengYi 56 83 77 80
ZhengYi

输出样例:

在这里给出相应的输出。例如:

20201002112 ZhengYi 56 83 77 80

废话不多说,社会我贤哥,直接上答案。

#include<stdio.h>
#include<string.h>
struct student{
 char num[20];//学号11位数字 
 char name[10];//姓名 
 int math,english,program,physical;
 //  数学  英语   程序设计  物理 
};
int main(void){
 struct student students[20],s1;
 int N;
 scanf("%d",&N); 
 int i;
 for(i=0;i<N;i++){
  scanf("%s%s%d%d%d%d ",students[i].num,students[i].name,&students[i].math,
  &students[i].english,&students[i].program,&students[i].physical);
 }
 char sname[10];
 int flag=0;
 scanf("%s",s1.name);
 for(i=0;i<N;i++){
  if(strcmp(s1.name,students[i].name)==0){
   printf("%s %s %d %d %d %d\n",students[i].num,students[i].name,students[i].math,
   students[i].english,students[i].program,students[i].physical);
   flag=1;
  }
 }
 if(flag==0){
  printf("Not Found!");
 }
 return 0;
}

可能一道题目还不过瘾,那就再来一个

7-2 统计平均成绩和不及格人数

输入整数N,再输入N个学生的学号、姓名和成绩。最后输出所有人的总成绩、平均成绩和不及格人数。(使用结构体)

输入格式:

第一行是整数N(N<100),以下是N个学生的信息,一行一个学生,包括:学号(整数)、姓名(不超20个字符中间无空格)、成绩(实数)

输出格式:

总成绩 平均成绩 不及格人数,小数保留2位

输入样例:

5
1001   YaolinPan       89
1002   YuhangGao       98.9
1003   JunyuanGao      42.5
1004   HongpengYang    72
1005   YuxuanHan       35

输出样例:

337.40 67.48 2
#include<stdio.h>
int main()
{
    struct student
    {
        int num;
        char name[20];
        float score;
    };
    int n,count=0;
    float average,sum=0;
    scanf("%d",&n);
    struct student stu[100];
    for(int i=0;i<n;i++)
    {
        scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);
        sum+=stu[i].score;
        if(stu[i].score<60)
            count++;
    }
    average=sum/n;
    printf("%.2f %.2f %d",sum,average,count);
    
    return 0;
}

现在放假了有时间保证三天一篇

上次说的贪吃蛇,直接上代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
 
#define High 25   //游戏画面尺寸  以向下为x的正半轴,向右为Y的正半轴 
#define Width 45
 
//全局变量
int moveDirection;  //小蛇移动位置 ,上下左右分别用1,2,3,4表示 
int food_x,food_y;  //食物的位置 
int canvas[High][Width]={0};/*二维数组存储游戏画布中对应元素 0表示空格,1表示蛇头@,-1表示边宽 大于1表示蛇身#*/ 


//该函数是用于控制 控制台的光标的移动
void gotoxy(int x,int y)
{ 
 HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
 
 
  /*调用HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE))在C语言中表示:从一个特定的标准设备(标准输出)中取得一个句柄(用来标识不同设备的数值)。

其中,STD_OUTPUT_HANDLE表示标准输出的句柄。GetStdHandle是Windows API函数,hConsole只是一个句柄变量。HANDLE是Windows用来表示对象的(不是C++的对象),HWND是其中一种,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一个通用句柄表示。

GetStdHandle((STD_OUTPUT_HANDLE))等效于GetStdHandle(STD_OUTPUT_HANDLE)*/




 COORD pos;
 
 
 /*      定义一个坐标coord   Windows API中定义的结构
COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标   */



 pos.X=x;
 pos.Y=y;
 SetConsoleCursorPosition(handle,pos);
} 

//该函数是为了蛇的正常运动以及保证食物的持续出现
void moveSankeByDirection()
{
 int i,j;
 for(i=1;i<High-1;i++)
 {
  for(j=1;j<Width-1;j++)
  {
   if(canvas[i][j]>0)
    canvas[i][j]++;
  }
 }
 
 int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
 int max=0;
 
 for(i=1;i<High-1;i++)
 {
  for(j=1;j<Width-1;j++)
  {
   if(canvas[i][j]>0)
   {
    if(max<canvas[i][j])
    {
     max=canvas[i][j];
     oldTail_i=i;
     oldTail_j=j;
    }
    if(canvas[i][j]==2)
    {
     oldHead_i=i;
     oldHead_j=j;
    }
   }
  }
 } 
 
 int newHead_i,newHead_j;
 
 if(moveDirection==1)   //向上移动 
 {
  newHead_i=oldHead_i-1;
  newHead_j=oldHead_j;
 }
 if(moveDirection==2)   //向下移动 
 {
  newHead_i=oldHead_i+1;
  newHead_j=oldHead_j;
 }
 if(moveDirection==3)   //向左移动 
 {
  newHead_i=oldHead_i;
  newHead_j=oldHead_j-1;
 }
 if(moveDirection==4)   //向右移动 
 {
  newHead_i=oldHead_i;
  newHead_j=oldHead_j+1;
 }
 
  //如果吃到食物
 if(canvas[newHead_i][newHead_j]==-2)
 {
  canvas[food_x][food_y]=0;
  //产生一个新的食物
  food_x=rand()%(High-5)+2;//rand 包含在<stdlib.h> 
  food_y=rand()%(Width-5)+2;//rand()函数定义:int rand(void);
  canvas[food_x][food_y]=-2;//随机产生新的食物 
 
  //原来的旧蛇尾,长度自动增加1
 } 


 else//否则,为了保持长度不变,原来的旧蛇尾减掉
 {
  canvas[oldTail_i][oldTail_j]=0;
 }
 
 //小蛇是否撞墙或者和自身相撞,游戏失败
 if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
 {
  printf("                   行不行啊细狗~~~游戏失败!\n");
  Sleep(2000);  //Windows API函数为了不占过多cpu资源,sleep让程序休眠
  system("pause"); //C语言标准库中的函数,让程序实现冻结屏幕,便于观察程序的执行结果
  exit(0);     //c语言标准库中的函数,用于终止程序
 } 
 else
 {
  canvas[newHead_i][newHead_j]=1;  //为新的蛇头赋值
 }
} 

//初始化时的函数
void startup()  //表示数据的初始化 
{
	mciSendString("open .\Users\29574\Music\.mp3 alias BGM", 0, 0, 0);
	mciSendString("play BGM repeat", 0, 0, 0);
 int i,j;
 //初始化边框
 for(i=0;i<High;i++)
 {
  canvas[i][0]=-1;//让上边框显示 
  canvas[i][Width-1]=-1;//让下边框显示 
 }
 for(j=0;j<Width;j++)
 {
  canvas[0][j]=-1;//左边框 
  canvas[High-1][j]=-1;//右边框 
 } 
 
 //初始化蛇头
 canvas[High/2][Width/2]=1;  //初始时蛇出生在中间,就算是为了美观吧 
                          //初始化蛇身,画布元素分别为2,3,4,5
 for(i=1;i<=4;i++)
  canvas[High/2][Width/2-i]=i+1; //大于1为蛇身 
 
 //初始小蛇向右移动
 moveDirection=4; //也可以其他反向,谁便你要怎么搞 
 
 food_x=rand()%(High-5)+2;  //rand()函数是c语言标准库中的函数,用于产生随机数
 food_y=rand()%(Width-5)+2; //rand()函数产生的随机数范围为0-0x7fff,即0-32767 
 canvas[food_x][food_y]=-2;  //食物的赋值 
}

//一个根据我们定义的画布上的数据而分别为用户呈现不同视觉效果的函数 
void show() 
{
 gotoxy(0,0);//光标移动到原点位置,以下重画清屏
 int i,j; //此处就是来说明上面的数字的定义 
 for(i=0;i<High;i++)
 {
  for(j=0;j<Width;j++)
  {
   if(canvas[i][j]==0) //0为空格,-1为边框#,-2为食物¥,1为蛇头@,大于1为蛇身* 
    printf(" ");
   else if(canvas[i][j]==-1)
    printf("o");
   else if(canvas[i][j]==1)
    printf("@");
   else if(canvas[i][j]>1)
    printf("o");
   else if(canvas[i][j]==-2)
    printf("$");
  }
  printf("\n");
 }
 Sleep(100);//还是休眠程序的作用吧 
}

//与用户无关的更新的函数 
void updateWithoutInput()   
{
 moveSankeByDirection();
}

//与用户有关的更新的函数 ,判断用户的输入 
void updateWithInput()   
{
 char input;
 if(kbhit())     //kbhit是conio库中的函数,判断是否有输入 
 {
  input=getch(); //根据用户不同的输入来移动,不必输入回车 
  if(input=='a'|| input =='8')   //input、getch是conio库中的函数,用于输入和输出字符
  {
   moveDirection=3; //位置左移 
   moveSankeByDirection();
  }
    if(input=='d')
  {
   moveDirection=4; //位置右移 
   moveSankeByDirection();
  }
    if(input=='w')
  {
   moveDirection=1; //位置上移 
   moveSankeByDirection();
  }
    if(input=='s')
  {
   moveDirection=2; //位置下移 
   moveSankeByDirection();
  }
 }
}
 
int main()//主函数使用上面的函数 
{

  
 startup();     //数据初始化
 while(1)     //游戏循环执行 
 {
  show();     //显示画面 
  updateWithoutInput();
  updateWithInput();
 }
 return 0; 
}

但是有一个点要稍微注意一下就是里面有个easyx的运用,需要在VS上下载easyx库函数,才能接收music,用到其中的函数。

最后谢谢大家支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宅博士(嵌入式版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值