目录
7.4 设计一个用于人事管理的结构体。(1)每个人的数据包括:职工号、职工姓名、性别、出生日期。(2)性别和出生日期用位段表示。
7.6 有4名学生,每个学生的属性包括学号、姓名、成绩,要求通过指针方法找出成绩最高者的姓名和成绩。
7.7 建立一个链表,每个结点所包含的成员为:职工号、工资。
(2)在(1)的基础上,新增加一个职工的数据。这个新结点不放在最后,而是按职工号的顺序插入,新职工号为0606。编写一个函数insert来插入新结点。
(3)在(1)、(2)的基础上,编写一个函数delete,用来删除一个结点(按照所指定的职工号删除)。要求删除职工号为0606的结点。
7.8 有一个unsignedlong类型整数(4 B),想分别将前两个字节和后两个字节作为两个unsignedshort类型输出(各占2B)。
7.9 将4 个字符“拼”成一个long 型数,这4 个字符为“a”、“b”、“c”、“d”。编写一函数,把由这4个字符连续组成的4 B 内容作为一个longint型数输出。
7.11 口袋中有红、黄、兰、白、黑五种颜色的球若干,每次从口袋中取出3个球。问得到三种不同颜色球的可能选取方法,打印出三种颜色的各种组合(提示:用枚举类型)。
一、习题
7.3 职工数据包括:职工号、职工姓名、性别、年龄、工龄、工资、地址。(1)为其定义一个结构体变量。(2)对上述定义的变量,从键盘输入所需的具体数据,然后通过printf函数显示出来。(3)定义一个职工数据的结构体数组,从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(为了简单起见,可设数组只有3个元素)。
#include<stdio.h>
struct employee{
char eno[20];
char ena[20];
char esex[2];
int eage;
int esalary;
char eplace[20];
}e[3];
int main(){
int i;
for(i=0; i<3; i++)
scanf("%s %s %s %d %d %s",
&e[i].eno, &e[i].ena, &e[i].esex, &e[i].eage, &e[i].esalary, &e[i].eplace);
printf("编号\t姓名\t性别\t年龄\t工资\t地址\n");
for(i=0; i<3; i++)
printf("%s\t%s\t%s\t%d\t%d\t%s\n",
e[i].eno, e[i].ena, e[i].esex, e[i].eage, e[i].esalary, e[i].eplace);
return 0;
}
7.4 设计一个用于人事管理的结构体。
(1)每个人的数据包括:职工号、职工姓名、性别、出生日期。
(2)性别和出生日期用位段表示。
struct date{
unsigned int day : 5;
unsigned int month : 4;
unsigned int year : 15;
}
struct employee{
char eno[20];
char ena[20];
unsigned int esex : 1;
struct date ebirth;
};
7.5 有n个学生,每个学生的数据包括学号(num)、姓名(name[20])、性别(sex)、年龄(age)、三门课程成绩(score[3])。要求在m ain函数中输入学生的这几个数据,再调用一个函数count,在该函数中计算出每个学生的总分和平均分,然后打印出所有各项数据(包括原有的和新求解的)。
#include<stdio.h>
#define N 3
struct student{
char num[20];
char name[20];
char sex[2];
int age;
float score[3];
float sum;
float avg;
}s[N];
//方法一:变量
//void count(struct student s){
// int i;
// s.sum = 0;
// for(i=0; i<N; i++)
// s.sum += s.score[i];
// s.avg = s.sum / 3;
// printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",
// s.num, s.name, s.sex, s.age,
// s.score[0], s.score[1], s.score[2], s.sum, s.avg);
//}
//int main(){
// int i;
// for(i=0; i<N; i++){
// scanf("%s %s %s %d %f %f %f",
// &s[i].num, &s[i].name, &s[i].sex, &s[i].age,
// &s[i].score[0], &s[i].score[1], &s[i].score[2]);
// }
// printf("学号\t姓名\t性别\t年龄\t成绩1\t成绩2\t成绩3\t总分\t平均分\n");
// for(i=0; i<N; i++){
// count(s[i]);
// }
// return 0;
//}
//方法二:指针
void count(struct student *s){
int i;
s->sum = 0;
for(i=0; i<N; i++)
s->sum += s->score[i];
s->avg = s->sum / 3;
printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",
s->num, s->name, s->sex, s->age,
s->score[0], s->score[1], s->score[2], s->sum, s->avg);
}
int main(){
struct student *p;
for(p = s; p < s + N; p++){
scanf("%s %s %s %d %f %f %f",
&p->num, &p->name, &p->sex, &p->age,
&p->score[0], &p->score[1], &p->score[2]);
}
printf("学号\t姓名\t性别\t年龄\t成绩1\t成绩2\t成绩3\t总分\t平均分\n");
for(p = s; p < s + N; p++){
count(p);
}
return 0;
}
7.6 有4名学生,每个学生的属性包括学号、姓名、成绩,要求通过指针方法找出成绩最高者的姓名和成绩。
#include<stdio.h>
#define N 4
struct student{
char num[20];
char name[20];
float score;
}s[N];
int main(){
struct student *p, *q;
for(p = q = s; p < s + N; p++){
scanf("%s %s %f", &p->num, &p->name, &p->score);
if(p->score > q->score)
q = p;
}
printf("姓名\t成绩\n");
printf("%s\t%.1f\n", q->name, q->score);
return 0;
}
7.7 建立一个链表,每个结点所包含的成员为:职工号、工资。
(1)用malloc函数开辟新结点。要求链表包含5个结点,从键盘输入结点中的有效数据,然后把这些结点的数据打印出来。要求使用函数creat来建立函数,用list函数来输出数据。这5个职工的号码依次为0601、0603、 0605、 0607、 0609。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct employee{
char num[20];
float wage;
struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
int i;
struct employee *head, *p, *q;
if(n == 0) return NULL;//无结点
for(i = 0; i < n; i++){
p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
printf("输入第%d个职工的号码和工资:", i+1);
scanf("%s %f", &p->num, &p->wage);
if(i == 0) head = q = p;
else{
q->next = p;
q = p;
}
}
q->next = NULL;//尾结点
return head;
}
void list(struct employee *p){//打印数据
if(p == NULL){
printf("没有职工数据!\n");
return;
}
printf("职工号\t工资\n");
while(p != NULL){
printf("%s\t%.1f\n", p->num, p->wage);
p = p->next;
}
}
int main(){
struct employee *head;
head = creat(N);
list(head);
return 0;
}
(2)在(1)的基础上,新增加一个职工的数据。这个新结点不放在最后,而是按职工号的顺序插入,新职工号为0606。编写一个函数insert来插入新结点。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct employee{
char num[20];
float wage;
struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
int i;
struct employee *head, *p, *q;
if(n == 0) return NULL;//无结点
for(i = 0; i < n; i++){
p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
printf("输入第%d个职工的号码和工资:", i+1);
scanf("%s %f", &p->num, &p->wage);
if(i == 0) head = q = p;
else{
q->next = p;
q = p;
}
}
q->next = NULL;//尾结点
return head;
}
void list(struct employee *p){//打印数据
if(p == NULL){
printf("没有职工数据!\n");
return;
}
printf("职工号\t工资\n");
while(p != NULL){
printf("%s\t%.1f\n", p->num, p->wage);
p = p->next;
}
}
struct employee *insert(struct employee *p){//在p指向的链表中插入结点
int flag;
struct employee *head, *p, *q,
*r = (struct employee *)malloc(sizeof(struct employee));
printf("输入要插入职工的号码和工资:");
scanf("%s %f", &r->num, &r->wage);
for(head = p, q = r, flag = 0; p && r->num > p->num; q = p, p = p->next, flag = 1);
q->next = r;
r->next = p;
return flag? head : q;//flag = 0 指表头处插入
}
int main(){
struct employee *head;
head = creat(N);
list(head);
head = insert(head);
list(head);
return 0;
}
(3)在(1)、(2)的基础上,编写一个函数delete,用来删除一个结点(按照所指定的职工号删除)。要求删除职工号为0606的结点。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5
struct employee{
char num[20];
float wage;
struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
int i;
struct employee *head, *p, *q;
if(n == 0) return NULL;//无结点
for(i = 0; i < n; i++){
p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
printf("输入第%d个职工的号码和工资:", i+1);
scanf("%s %f", &p->num, &p->wage);
if(i == 0) head = q = p;
else{
q->next = p;
q = p;
}
}
q->next = NULL;//尾结点
return head;
}
void list(struct employee *p){//打印数据
if(p == NULL){
printf("没有职工数据!\n");
return;
}
printf("职工号\t工资\n");
while(p != NULL){
printf("%s\t%.1f\n", p->num, p->wage);
p = p->next;
}
}
struct employee *insert(struct employee *p){//在p指向的链表中插入结点
int flag;
struct employee *head, *p, *q,
*r = (struct employee *)malloc(sizeof(struct employee));
printf("输入要插入职工的号码和工资:");
scanf("%s %f", &r->num, &r->wage);
for(head = p, q = r, flag = 0; p && r->num > p->num; q = p, p = p->next, flag = 1);
q->next = r;
r->next = p;
return flag? head : q;//flag = 0 指表头处插入
}
struct employee *del(struct employee *p, char num[]){
struct employee *q, *r;
if(p == NULL){
printf("没有职工数据!\n");
return;
}
printf("输入要删除职工的号码:");
scanf("%s", &q->num);
for(q = p; q && strcmp(q->num, num) != 0; r = q, q = q->next);
if(strcmp(q->num, num) == 0){
if(q == p) p = q->next;
else r->next = q->next;
free(q);
printf("记录已删除!\n");
}
else
printf("未找到记录!\n");
return p;
}
int main(){
struct employee *head;
char c[20];
head = creat(N);
list(head);
head = insert(head);
list(head);
head = del(head, c);
list(head);
return 0;
}
7.8 有一个unsignedlong类型整数(4 B),想分别将前两个字节和后两个字节作为两个unsignedshort类型输出(各占2B)。
//联合体用于拆分
#include<stdio.h>
union longshort{
unsigned long l;
unsigned short s[2];
};
void convert(unsigned long l){
union longshort ls;
ls.l = l;
printf("转换后的两个短整型为:%d,%d\n", ls.s[0], ls.s[1]);
}
int main(){
unsigned long l;
printf("输入长整型:");
scanf("%ld", &l);
convert(l);
return 0;
}
7.9 将4 个字符“拼”成一个long 型数,这4 个字符为“a”、“b”、“c”、“d”。编写一函数,把由这4个字符连续组成的4 B 内容作为一个longint型数输出。
//联合体用于拼接
#include<stdio.h>
union charlong{
char c[4];
unsigned long l;
};
void convert(char ch[]){
union charlong cl;
int i;
for(i = 0; i < 4; i++){
cl.c[i] = ch[i];
}
printf("转换后的长整型为:%ld\n", cl.l);
}
int main(){
char ch[4];
int i;
printf("输入四个字符:");
for(i = 0; i < 4; i++){
scanf("%c", &ch[i]);
}
convert(ch);
return 0;
}
7.11 口袋中有红、黄、兰、白、黑五种颜色的球若干,每次从口袋中取出3个球。问得到三种不同颜色球的可能选取方法,打印出三种颜色的各种组合(提示:用枚举类型)。
#include<stdio.h>
enum ball{red, yellow, blue, white, black};
int main(){
int i, j, k;
int n = 0, temp, loop;
for(i = red; i <= black; i++){
for(j = red; j <= black; j++){
if(i != j){
for(k = red; k <= black; k++){
if(k != i && k != j){
n++;
printf("第%-2d种:", n);
for(loop = 1; loop <= 3; loop++){//三个球
switch(loop){
case 1: temp = i; break;
case 2: temp = j; break;
case 3: temp = k; break;
default: break;
}
switch(temp){
case red: printf("red\t"); break;
case yellow: printf("yellow\t"); break;
case blue: printf("blue\t"); break;
case white: printf("white\t"); break;
case black: printf("black\t"); break;
default: break;
}
}
printf("\n");
}
}
}
}
}
printf("\nTotal is : %d\n\n",n);
return 0;
}
二、注意
2.1 声明枚举变量三种方法
声明枚举变量三种方法
1、先声明枚举类型后定义枚举类型变量
enum WeekdayType
{
sun,mou,tue,wed,thu,fri,sat
};
enum WeekdayType today,yesterday,tomorrow;
2、声明枚举类型的同时定义枚举类型变量
enum WeekdayType
{
sun,mou,tue,wed,thu,fri,sat
}today,yesterday,tomorrow;
3、直接定义枚举类型变量
enum
{
sun,mou,tue,wed,thu,fri,sat
}today,yesterday,tomorrow;