【高效复习】C语言程序设计(UESTC) 黄迪明版 (第四章-第六章——数组和结构、指针、函数)

这篇博客详细介绍了C语言中数组、结构、指针和函数的概念与应用。讨论了二维数组的操作,字符数组的赋值,输入输出中的注意事项,以及字符串函数的使用。在指针部分,讲解了指针类型、定义与存储、运算以及数组指针。此外,还涉及了函数的使用,包括函数参数传递和函数指针。博客提供了丰富的例子和练习题,适合C语言学习者巩固知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍数组和结构、函数。指针,以运算和存储(定义)为主线。这也是计算机这个黑盒子中的关键三环中的两环。(存储、运算、控制)

第四章 数组和结构

4.1数值数组:

二维数组a[i][j],除了行与列的解释,还可以i代表第i个一维数组,j代表一维数组中第j个元素。

4.1.1

运算:(1)二维数组不可以缺省列的个数。int a[][3]={1,2,3,4,5,6}就是可行的赋值的,区别于,函数的形参与实参中,第二维

必须相同int arry[][4]。
(2)对一维数组而言,a是数组名,可视为列指针,a+1就是跳一列。
(3)对二维数组而言,可视为行指针,a+1就是跳一行。a[0]、a[1]这些都应该视为列指针。
(4)a是地址常量,不可以a++或者a=a+2;二维的a[0]、a[1]也是不可以进行赋值操作,都是地址常量。

4.2字符数组

赋值:(1)字符赋值char s[5]={‘a’,‘a’,‘a’,‘a’,‘a’};(2)字符串常量赋值char s[5]=“aaaaa”;或char s[]=“aaaaa”;
未赋值部分默认为’\0’,ASCII为0;

4.3输出输入

注:
(1)gets可以读取空格,但是scanf不可以;puts自带换行功能,输出一个字符串后就会换一行。
(2)改错题中,常出现,为加’\0’作为字符串结束标志。
(3)对于s[]和s[n],可以通过修改’\0’来增加字符数组长度。
(4)对于s[n],只可以放n-1个字符。

4.3.1 字符串函数

在这里插入图片描述
在这里插入图片描述
注:
(1)结构体中范式没有明确初值的成员,都默认为0;
(2)atoi、atof装换字符串为整数/浮点数
(3)优先级的细节,++p->age,(++p)->age,&p->age,第一个是age++;第二个是p++,第三是age的地址。

4.4 结构体与函数/指针

注:改错题中,会出现结构体定义结尾没有‘;’,do…while();也是!
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
1、用结构体变量名作参数。一般较少用这种方法。
2、用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
3、用结构体变量的引用变量作函数参数。

  1. 用结构体变量作函数参数。
#include <iostream>
#include <string>
using namespace std;
struct Student//声明结构体类型Student
{
   
   
   int num;
   char name[20];
   float score[3];
};
int main( )
{
   
   
   void print(Student); //函数声明,形参类型为结构体Student
   Student stu; //定义结构体变量               
   stu.num=12345; //以下5行对结构体变量各成员赋值
   stu.name="Li Fung";
   stu.score[0]=67.5;
   stu.score[1]=89;
   stu.score[2]=78.5;
   print(stu); //调用print函数,输出stu各成员的值
   return 0;
}
void print(Student st)
{
   
   
   cout<<st.num<<" "<<st.name<<" "<<st.score[0]
   <<" " <<st.score[1]<<" "<<st.score[2]<<endl;
}

2)用指向结构体变量的指针作实参在上面程序的基础上稍作修改即可。

#include <iostream>
#include <string>
using namespace std;
struct Student
{
   
   
   int num; string name; //用string类型定义字符串变量
   float score[3];
}stu={
   
   12345,"Li Fung",67.5,89,78.5}; //定义结构体student变量stu并赋初值
int main( )
{
   
   
   void print(Student *); //函数声明,形参为指向Student类型数据的指针变量
   Student *pt=&stu; //定义基类型为Student的指针变量pt,并指向stu
   print(pt); //实参为指向Student类数据的指针变量
   return 0;
}
//定义函数,形参p是基类型为Student的指针变量
void print(Student *p)
{
   
   
   cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" " <<
   p->score[1]<<" "<<p->score[2]<<endl;
}
  1. 用结构体变量的引用作函数参数
#include <iostream>
#include <string>
using namespace std;
struct Student
### C语言期末考试上机题目概述 对于电子科技大学(UESTC)的大一学生而言,掌握特定类型的编程实践问题至关重要。这些练习不仅有助于巩固课堂上学到的知识,还能够帮助学生更好地准备即将到来的期末考试。 #### 题目类型分析 常见的C语言上机试题涵盖了多种知识点,包括但不限于基本语法、函数定义与调用、指针操作、结构体应用等方面的内容[^2]。通过解决这些问题,可以有效提升学生的编码能力逻辑思维能力。 #### 实际案例展示 为了使学习过程更加生动具体,在此提供一道典型的C语言程序设计题目作为例子: 编写一个简单的学生成绩管理系统,该系统应具备如下功能: - 输入若干名同学的成绩; - 输出最高分及其对应的姓名; - 统计不及格人数并给出名单; ```c #include <stdio.h> #define MAX_STUDENTS 100 typedef struct { char name[50]; float score; } Student; int main() { int n; // 学生数量 printf("请输入学生总数:"); scanf("%d", &n); if (n > MAX_STUDENTS || n <= 0){ printf("输入的学生数超出范围\n"); return -1; } Student students[MAX_STUDENTS]; for(int i=0;i<n;++i){ printf("\n第%d位同学的信息:\n", i+1); printf("名字: "); fflush(stdin); gets(students[i].name); do{ printf("成绩(0~100): "); scanf("%f",&students[i].score); if (!(students[i].score >= 0 && students[i].score<=100)) puts("错误! 成绩应在0至100之间."); }while(!(students[i].score>=0&&students[i].score<=100)); } // 找出最高分数及对应的名字 float maxScore = students[0].score; const char* topStudentName = students[0].name; for(int j=1;j<n;++j){ if(maxScore<students[j].score){ maxScore = students[j].score; topStudentName = students[j].name; } } printf("\n最高分为%.2f,由%s获得.\n",maxScore,topStudentName); // 不及格的人数统计 int failCount = 0; printf("\n以下是不及格的同学列表:\n"); for(int k=0;k<n;++k){ if(students[k].score<60){ ++failCount; printf("- %s (%.2f)\n",students[k].name,students[k].score); } } if(failCount==0) printf("(无任何同学不及格)"); else printf("\n总计有%d位同学未达到合格线.",failCount); return 0; } ``` 上述代码实现了对学生信息录入、处理以及查询等功能的要求,适用于初学者理解练习基础概念[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值