1.
有若干个学校人员的信息,包括学生和教师。 其中学生的数据包括:姓名、性别、职业s/S、分数。 教师的数据包括:姓名、性别、职业t/T、职务。 1,定义指针指向堆区内存 2.循环输入 3.计算老师的个数 4.计算学生的平均值 5.循环输出 6·释放堆区空间
#include <string.h>
#include <stdlib.h>
#include <stdio.h>typedef union diff
{int score;char pos[20];}diff_t;typedef struct person
{char name[20];char gender;char job;diff_t score_or_pos;} person_t; person_t *req_mem(int n);
void input(int n, person_t *parr);
int count(char job, int n, person_t *parr);
void output(int n, person_t *parr);
person_t *free_mem(person_t *parr);
float avg(int n, person_t *parr);int main(int argc, const char *argv[])
{int n=3;//定义指针向堆区的内存person_t *parr=req_mem(n);/*//testperson_t arr_p[]={"zhang", 'f', 's', 98,"li", 'f', 't', "class teacher","wang", 'm', 't', "schoolmaster","zhao", 'f', 's', 97}*///输入input(n, parr);//计算老师个数int teachers = count('t', n, parr);putchar(10);printf("teacher count=%d\n", teachers);int students = count('s', n, parr);putchar(10);printf("students count=%d\n", students);//计算学生的平均值putchar(10);float av=avg(n, parr);printf("students avg score=%.2lf\n", av);//输出putchar(10);output(n, parr);//释放堆区空间parr=free_mem(parr);return 0;
}person_t *req_mem(int n)
{person_t *p=(person_t*)malloc(sizeof(person_t)*n);if(NULL==p){printf("error");return NULL;}return p;}void input(int n, person_t *parr)
{for(int i=0; i<n; i++){printf("please input %d name:", i+1);scanf("%s", (parr+i)->name);printf("please input %d gender:", i+1);scanf(" %c", &(parr+i)->gender);printf("please input %d job:", i+1);scanf(" %c", &(parr+i)->job);if('s'==((parr+i)->job) || 'S'==(parr+i)->job){printf("please input %d score:", i+1);scanf("%d", &(parr+i)->score_or_pos.score);}else if('t'==((parr+i)->job) || 'T'==(parr+i)->job){printf("please input %d position:", i+1);scanf("%s", (parr+i)->score_or_pos.pos);}}}int count(char job, int n, person_t *parr)
{int count_s=0;int count_t=0;for(int i=0; i<n; i++){char cj=(parr+i)->job;if(cj=='t'||cj=='T'){count_t++;}else if(cj=='s'||cj=='S'){count_s++;}}if (job=='t'||job=='T'){return count_t;}else if('s'==job||'T'==job){return count_s;}return -1;} float avg(int n, person_t *parr)
{int sum=0;int count=0;for(int i=0; i<n; i++) {char cj = (parr+i)->job;if('s'==cj||'S'==cj){sum+=(parr+i)->score_or_pos.score;count++;}}if(count>0){return (float)sum*1.0/count;}else{return 0;}}void output(int n, person_t *parr)
{for(int i=0; i<n; i++){printf("No. %d person info:\n", i+1);printf("name=%s, gender=%c, job=%c, ", (parr+i)->name, (parr+i)->gender, (parr+i)->job );char cj=(parr+i)->job;if('s'==cj||'S'==cj){printf("score=%d\n", (parr+i)->score_or_pos.score);}else if('t'==cj||'T'==cj){printf("position=%s\n", (parr+i)->score_or_pos.pos);}putchar(10);}putchar(10);
}person_t *free_mem(person_t *parr)
{if(NULL==parr){return NULL;}free(parr);parr=NULL;return parr;}
please input 1 name:w
please input 1 gender:f
please input 1 job:s
please input 1 score:90
please input 2 name:a
please input 2 gender:f
please input 2 job:s
please input 2 score:92
please input 3 name:n
please input 3 gender:f
please input 3 job:t
please input 3 position:class teacherteacher count=1students count=2students avg score=91.00No. 1 person info:
name=w, gender=f, job=s, score=90No. 2 person info:
name=a, gender=f, job=s, score=92No. 3 person info:
name=n, gender=f, job=t, position=class
2.
以下结构体使用sizeof 计算大小的结果(默认4字节对齐)
struct s1
{char ch;int a;double b;char c1;};
s1-->20 | |
0x00 | ch |
0x01 | |
0x02 | |
0x03 | |
0x04 | a |
0x05 | |
0x06 | |
0x07 | |
0x08 | b |
0x09 | |
0x0A | |
0x0B | |
0x0C | |
0x0D | |
0x0E | |
0x0F | |
0x20 | c1 |
0x21 | |
0x22 | |
0x23 |
写一个简单的宏, 交换A, B两数的值(假设两个变量都是char 或int类型)
struct s2
{char ch;int a;double b;};
s2-->16 | |
0x00 | ch |
0x01 | |
0x02 | |
0x03 | |
0x04 | a |
0x05 | |
0x06 | |
0x07 | |
0x08 | b |
0x09 | |
0x0A | |
0x0B | |
0x0C | |
0x0D | |
0x0E | |
0x0F |
struct s3
{char i;struct{char c;};char a;char b;char d;char e;char f;};
s3->12 | |
0x00 | i |
0x01 | |
0x02 | |
0x03 | |
0x04 | c |
0x05 | a |
0x06 | b |
0x07 | d |
0x08 | e |
0x09 | f |
0x0A | |
0x0B |
3.
写一个简单的宏,交换两数的值(假设两个变量都是char或int类型)
#include <string.h>
#include <stdlib.h>
#include <stdio.h>#define EXCHANGE a=a+b; b=a-b; a=a-b; int main(int argc, const char *argv[])
{int a=2;int b=3;printf("before exchange: a=%d, b=%d\n", a, b );EXCHANGE;printf("afterbefore exchange: a=%d, b=%d\n", a, b );return 0;
}
4.
关键字static有什么含义
1.static修饰全局变量未初始化,默认结果为0
2.static修饰的局部,延长生命周期至本文件有效,但不是作用域
3.static修饰函数, 不可以跨文件调用,static修饰的函数生命周期在本文件有效
4.static修饰指针, static修饰的指针不要指向auto类型的变量地址