学习笔记
用变量a给出下面的定义:
a) 一个整型数 // int a;
(An integer)
b) 一个指向整型数的指针 // int *a ;
(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数 // int * *a;(二级指针)
(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组 // int a[10];
(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的 // int * a[10];(存放了指针的数组)
(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针 // int (*a)[10];(数组的指针)
(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 // int (*a)(int)(函数指针)
(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
( An array of ten pointers to functions that take an integer argument and return an integer )
函数类型语法特殊
// int (*a[10])(int)(函数指针的数组)
结构体、公用体、枚举
结构体 struct
描述一些 原先 基本数据类型不好描述的这种复杂数据类型
语法:
struct 结构体类型名
{
数据成员列表;
};// 定义了一个“数据类型”——用户自定义的数据类型
eg:
描述学生这种类型:
struct student(学生数据类型)
{
// name——char name [20]; // 成员变量 各个成员变量用分号隔开
// age——int age;
// score——float score;
};// 结束时也需要写个分号,表示:结构体类型定义完成
struct student s;(s这种类型的一个变量)
注意:
1、结构体——用来实现自定义数据类型
2、用结构体
a、先构造出 数据类型
b、用数据类型 定义变量/数组/指针
3、访问结构体:
. // 结构体成员运算符
结构体变量名.成员变量名 // 结构体变量中的变量
练习1:
描述老师数据类型:名字、工资、工号
#include<stdio.h>
struct teacher
{
char name[20];
int tno;
int reward;
};
void PrintTeacherInfo(struct teacher *t)
{
printf("name = %s\n",t->name);
printf("no = %d\n",t->tno);
printf("reward= %d\n",t->reward);
}
int main(void)
{
struct teacher s = {"Jerry",20200131,10000};
printf("name: ");
scanf("%s",s.name);
printf("tno: ");
scanf("%d",&s.tno);
printf("reward: ");
scanf("%d",&s.reward);
PrintTeacherInfo(&s);
return 0;
}
练习2:
定义学生类型的变量
练习3:
找出成绩最高的学生,输出他的信息 // 函数
练习4:
将学生以各项指标进行排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[20];
int sno;
float score;
};
void Input(struct student *p,int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
printf("name:");
scanf("%s",(p+i)->name);
printf("sno :");
scanf("%d",&(p+i)->sno); //p[i].name
printf("score:");
scanf("%f",&(p+i)->score);
}
}
void Output(struct student *p,int len)
{
int i = 0;
printf("|%10s|%10s|%10s|\n","name","sno","score");
for (i = 0; i < len; ++i)
{
printf("%10s",p->name);
printf("%10d",p->sno);
printf("%10.2f\n",p->score);
++p;
}
}
void printMenu(void)
{
printf("-----Welcome Use Student info System-----\n");
printf("1 选择输入的学生人数\n");
printf("2 输入信息\n");
printf("3 查看学生信息\n");
printf("4 查看最高分学生信息\n");
printf("0 退出 \n");
printf(">");
}
void MaxScore(struct student *p,int len)
{
int i = 0;
int j = 0;
float max = p->score;
for (i = 0; i < len; ++i)
{
if ((p+i)->score > max)
{
max = p->score;
j = i;
}
}
printf("max score studentinfo: %s sno(%d) score(%.2f)\n",p[j].name,p[j].sno,p[j].score);
}
int CompareName(const void *a,const void *b)
{
const struct student *p1 = a;
const struct student *p2 = b;
int t = strcmp(p1->name,p2->name);
return t;
}
int CompareNumber(const void *a,const void *b)
{
const struct student *p1 = a;
const struct student *p2 = b;
return p1->sno - p2->sno;
}
int main(void)
{
struct student s[3] = {{"tom",111,88},{"jerry",112,77},{"rose",113,99}};
Output(s,3);
qsort(s,3,sizeof(struct student),CompareName);
Output(s,3);
qsort(s,3,sizeof(struct student),CompareNumber);
Output(s,3);
return 0;
}
#if 0
int main(void)
{
int n;
int len = 0;
struct student *s;
while (1)
{
printMenu();
scanf("%d",&n);
switch(n)
{
case 0:
printf("exit----\n");
return 0;
case 1:
printf(">");
scanf("%d",&len);
s = malloc(len*sizeof(struct student));
break;
case 2:
Input(s,len);
break;
case 3:
Output(s,len);
break;
case 4:
MaxScore(s,len);
break;
}
}
return 0;
}
#endif
homework
有一个班的4个学生,有5门课程。
1、求第一门课的平均分;
2、找出有两门以上课程不及格的学生, 输出他们的学号和全部课程成绩及平均分
1).统计学生不及格课程数
2).打印学生信息
3).求平均分的功能
3、找出平均分在90分以上或全部课程成绩在85分以上的学生。 分别编写三个函数来实现以上三个要求。
#include <stdio.h>
struct Stu
{
char name[20];
float No;
float A;
float B;
float C;
float D;
float E;
};
void Input(struct Stu *s,int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
printf("name: ");
scanf("%s",(s+i)->name);
printf("No: ");
scanf("%f",&(s+i)->No);
printf("Class A: ");
scanf("%f",&(s+i)->A);
printf("Class B: ");
scanf("%f",&(s+i)->B);
printf("Class C: ");
scanf("%f",&(s+i)->C);
printf("Class D: ");
scanf("%f",&(s+i)->D);
printf("Class E: ");
scanf("%f",&(s+i)->E);
}
}
int AverageOneClass(struct Stu *s,int len)
{
int i = 0;
int sum = 0;
for (i = 0; i < len; ++i)
{
sum += (s+i)->A;
}
return sum/len;
}
void PrintStuInfoFailTwoClass(struct Stu *s,int len)
{
int i = 0;
int j = 0;
//Input(s,len);
for (i = 0; i < len; ++i)
{
if ((s+i)->A < 60)
{
++j;
}
if ((s+i)->B < 60)
{
++j;
}
if ((s+i)->C < 60)
{
++j;
}
if ((s+i)->D < 60)
{
++j;
}
if ((s+i)->E < 60)
{
++j;
}
if (j >= 2)
{
printf("有两门以上不及格的学生为:%s\n",(s+i)->name);
printf("总共不及格的课程数为:%d\n",j);
printf("学号是:%g\n",(s+i)->No);
printf("课程A的成绩为:%.2f\n",(s+i)->A);
printf("课程B的成绩为:%.2f\n",(s+i)->B);
printf("课程C的成绩为:%.2f\n",(s+i)->C);
printf("课程D的成绩为:%.2f\n",(s+i)->D);
printf("课程E的成绩为:%.2f\n",(s+i)->E);
float ave;
ave = ((s+i)->A + (s+i)->B + (s+i)->C + (s+i)->D + (s+i)->E)/5;
printf("该学生的平均分为: %.2f\n",ave);
putchar('\n');
}
j = 0;
}
}
void ExcellentStu(struct Stu *s,int len)
{
float ave;
int i = 0;
int t = 0;
for (i = 0; i < len; ++i)
{
ave = ((s+i)->A + (s+i)->B + (s+i)->C + (s+i)->D + (s+i)->E)/5;
if ((s+i)->A >= 85 && (s+i)->B >=85 && (s+i)->C >= 85 && (s+i)->D >= 85 && (s+i)->E >= 85)
{
t = 1;
}
if (ave >= 90)
{
printf("学生%s的平均分在90分以上!\n",(s+i)->name);
}
if (t==1)
{
printf("学生%s的全部课程成绩在85分以上!\n",(s+i)->name);
}
t = 0;
}
}
int main(void)
{
struct Stu s[4];
Input(s,4);
//printf("四名学生第一门课程的平均分为:%d\n",AverageOneClass(s,4));
// PrintStuInfoFailTwoClass(s,4);
ExcellentStu(s,4);
return 0;
}