程序设计基础——C语言
科学出版社
第六章——其他数据模型,教材习题答案。 东风冷雪
如果认为对自己不利那就离开。
你看了比没有看好,首先印象还是有的,如果自己不会你可能都不会写,结果就是什么也不做,老师讲解时效果也会降低。其次你不会可能上网查书也是为了寻找答案,这样浪费时间(可能影响深些)。
一份答案做起来不容易,合理利用不要全部抄复制,这样老师会发现。你可以修改啊!你可以排版的比我更加调理清楚。
1.0
#include
struct s
{
int x,*y;
} *p;
int date[]={10,20,30};
struct s array[]={100,&date[0],200,&date[1],300,&date[2]};
void main()
{
p=array;
printf("%d\n",++p->x);
printf("%d\n",++*p->y);
printf("%d\n",*++p->y);
}
/* p指向结构体数组array首地址 即是&array[0].
(1)++p->x 中->运算符优先级大于++所以)p->x 结果是100++p->x =101。
(2)++*p->y中->运算符优先级大于++和*++和*同优先级别结合方向自右向左所以 p->y=&date[0], *p->y=date[0]=10, ++*p->y=11。
(3)*++p->y中同理所以 p->y=&date[0], ++p->y=&date[1], *++p->y=date[1]=20. */
#include"stdio.h"
void main()
{
struct stuinf
{
char name[15];
int score;
}; //定义结构体类型
struct stuinf student;
printf("输入学生的姓名\n");
gets(student.name);
/*不要用scanf输入它遇到空格要结束。*/
printf("输入学生的分数\n");
scanf("%d",&student.score);
printf("\n%s\t%d\n",student.name,student.score);
}
3.0
#include
#define n 2
struct student
{
long int id; //这里的学号是数字
char name[10];
char sex;
int age;
float score;
};
typedef struct student stu; //重新命名,好操作。
void main()
{
stu s[n]; //定义结构体数组
int i,j;
float aveage,avescore;
int num1=0,num2=0,sumage=0,sumscore=0;
for(i=0;i
{
printf("输入第%d人学号:",i+1);
scanf("%ld",&s[i].id);
printf("输入第%d人的姓名:",i+1);
scanf("%s",s[i].name);
printf("请输入第%d人性别,如果男输入m,女输入f: ",i+1);
getchar(); //接受上次的回车,
scanf("%c",&s[i].sex);
//字符要取地址,字符串不用取地址符号。
printf("输入第%d人的年龄:",i+1);
scanf("%d",&s[i].age);
printf("输入第%d人的成绩",i+1);
scanf("%f",&s[i].score);
printf("\n");
}
for(i=0;i
{
if(s[i].sex=='m') num1++;
else num2++;
sumage=sumage+s[i].age;
sumscore=sumscore+s[i].score;
}
aveage=sumage/n;
avescore=sumscore/n;
printf("班上男生:%d人 女生:%d人\n",num1,num2);
printf("平均年龄为:%.2f\n",aveage);
printf("平均成绩为:%.2f\n",avescore);
printf("\n成绩高于平均分的学生信息为:\n");
for(i=0;i
if(s[i].score>avescore)
printf("%ld, %s, %c,%d, %.2f",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].score); }
}
4.0
输入今天是星期几的序号(0~6代表星期天至星期六),给今天和昨天赋予枚举值,并输出昨天是星期几对应的枚举值。
#include
enum day{sun=0,mon=1,thu=2,wed=3,th=4,fri=5,sat=6};
void main()
{
/* 06代表星期天至星期六*/ scanf("%d",&a); int a; printf("输入今天是星期几的序号:"); enum day today ,yesterday;
{ case 0: printf("sum\n"); break; case 1: printf("mon\n"); break; case 2: printf("thu\n"); break; switch(a-1) printf("昨天是:"); else printf("error ,error\n"); else if(a==0) printf("昨天是星期几对应的枚举值:%d\n",6); printf("昨天是星期几对应的枚举值:%d\n",a-1); if(a>0&&a
}
case 4: printf("th\n"); break; case 5: printf("fri\n"); break; case 6: printf("sat\n"); break; case 7: printf("sun\n"); break; }
5.0
#include"stdio.h"
#define m 20
void main()
{
struct publish_date
{
int year;
int month;
int day;
};
struct book
{
char book_name[30];
char author[10];
char publisher[50];
struct publish_date time;
float price;
};
struct book b[m];
int i;
for(i=0;i
{
printf("输入第%d本书的信息",i+1);
printf("请输入书名:");
scanf("%s",b[i].book_name);
printf("输入作者");
scanf("%s",b[i].author);
printf("输入出版社");
scanf("%s",b[i].publisher);
printf("输入出版日期,逗号分隔");
scanf("%d,%d,%d",&b[i].time.year,&b[i].time.month,&b[i].time.day);
printf("输入价格");
scanf("%f",&b[i].price);
}
printf("book_name\t author\t publisher\t publish_date\t price\n");
for(i=0;i
{
printf("%-10s\t ",b[i].book_name);
printf("%-10s\t",b[i].author);
printf("%-10s\t",b[i].publisher);
printf("%d-%d-%d\t",b[i].time.year,b[i].time.month,b[i].time.day);
printf("%-3.2f\n",b[i].price);
printf("\n");
}
}
6.0
6.0某单位工资结构体包含,工资编号,职工姓名,工资年龄,考核奖金,房租水电,公积金,实发工资等内容,假设该单位有六位职工。
输入职工信息,不包括实发工资,计算每一个人的实发工资;统计单位的实发工资总额;计算单位的平均工资;
#include
void select(struct worker s[],int n); // 这个函数是从小到大排序 #define m 6
struct worker
void main()
{
struct worker s[m]; int i,j,k,max; int sum; float ave,wage[m],temp; }; { int id; char name[15]; int wage1; //工龄工资 int price; int pay1; // 房租水电 int pay2; //公积金 float wage; // 实发工资
for(i=0;i
printf("工积金:"); printf("房租水电:"); scanf("%d",&s[i].pay1); printf("考核奖金:"); scanf("%d",&s[i].price); printf("工龄工资:"); scanf("%d",&s[i].wage1); printf("输入职工姓名:"); scanf("%s",s[i].name); printf("输入工资编号:"); scanf("%d",&s[i].id); { printf("输入第%d人的信息",i+1);
} sum=0;
for(i=0;i
printf("单位平均工资:%f\n",sum/(m*1.0)); printf("单位工资总额:%d\n",sum); sum=sum+wage[i]; } printf("第%d人的实发工资",i+1); printf("%5.2f\n",wage[i]); { wage[i]=s[i].wage1+s[i].price-s[i].pay1-s[i].pay2;
for(i=0;i
printf("%5d %5d %5d %5d %10.2f\n",s[i].wage1,s[i].price,s[i].pay1,s[{ printf("%-10d %-10 %s",s[i].id,s[i].name); select(s,m); {s[k].wage=s[k].wage1+s[k].price-s[k].pay1-s[k].pay2;} for(k=0;k
}
}
{
void select(struct worker s[],int n) { int i,j,k,max; struct worker temp; for(i=0;is[j].wage) max=j;
if(i!=max)
{
temp=s[i]; s[i]=s[max]; s[max]=temp;
}
}
7-1
#include
void main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
printf("%d\n",(m=a>b)&(n=c>d));
}
/*
a>b不成立,所以m=0, c>d不成立,所以
*/
n=0, 0&0=0
#include
void main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4;
c=~(~0
d=b&c;
printf("%o,%o\n",a,b);
printf("d=%o c=%o\n",d,c);
}
/* a=0331(8),八进制,因为输入为%o,
a=011 011 001(2)
b=a>>4=000001101(2)=015(8)
c=000~1111=15
d=b&c=000 001 101(2)=15(8) */
8题
编写一个函数int move(int value,char dirction,int digits), 其中形参是value是被循环移位的数,dirction,是被移位的方向,r为友移,l左移, digits为移动位数,函数函数换回值为移动结果。
#include
int move(int value,char dirction,int digits);
int move(int value,char direction,int digits)
{
if(direction=='r')
value=value>>digits;
return value;
if(direction=='l')
value=value
}
void main()
{
int num;
char c;
int dig,end;
printf ("输入被移位的数:");
scanf("%d",&num);
getchar();
printf("如果左移输入l,右移输入r:
scanf("%c",&c); ");
printf("输入移动的位数");
scanf("%d",&dig);
end=move(num,c,dig);
printf("value=%d\n",end);
}
程序设计基础——C语言
科学出版社
第六章——其他数据模型,教材习题答案。 东风冷雪
如果认为对自己不利那就离开。
你看了比没有看好,首先印象还是有的,如果自己不会你可能都不会写,结果就是什么也不做,老师讲解时效果也会降低。其次你不会可能上网查书也是为了寻找答案,这样浪费时间(可能影响深些)。
一份答案做起来不容易,合理利用不要全部抄复制,这样老师会发现。你可以修改啊!你可以排版的比我更加调理清楚。
1.0
#include
struct s
{
int x,*y;
} *p;
int date[]={10,20,30};
struct s array[]={100,&date[0],200,&date[1],300,&date[2]};
void main()
{
p=array;
printf("%d\n",++p->x);
printf("%d\n",++*p->y);
printf("%d\n",*++p->y);
}
/* p指向结构体数组array首地址 即是&array[0].
(1)++p->x 中->运算符优先级大于++所以)p->x 结果是100++p->x =101。
(2)++*p->y中->运算符优先级大于++和*++和*同优先级别结合方向自右向左所以 p->y=&date[0], *p->y=date[0]=10, ++*p->y=11。
(3)*++p->y中同理所以 p->y=&date[0], ++p->y=&date[1], *++p->y=date[1]=20. */
#include"stdio.h"
void main()
{
struct stuinf
{
char name[15];
int score;
}; //定义结构体类型
struct stuinf student;
printf("输入学生的姓名\n");
gets(student.name);
/*不要用scanf输入它遇到空格要结束。*/
printf("输入学生的分数\n");
scanf("%d",&student.score);
printf("\n%s\t%d\n",student.name,student.score);
}
3.0
#include
#define n 2
struct student
{
long int id; //这里的学号是数字
char name[10];
char sex;
int age;
float score;
};
typedef struct student stu; //重新命名,好操作。
void main()
{
stu s[n]; //定义结构体数组
int i,j;
float aveage,avescore;
int num1=0,num2=0,sumage=0,sumscore=0;
for(i=0;i
{
printf("输入第%d人学号:",i+1);
scanf("%ld",&s[i].id);
printf("输入第%d人的姓名:",i+1);
scanf("%s",s[i].name);
printf("请输入第%d人性别,如果男输入m,女输入f: ",i+1);
getchar(); //接受上次的回车,
scanf("%c",&s[i].sex);
//字符要取地址,字符串不用取地址符号。
printf("输入第%d人的年龄:",i+1);
scanf("%d",&s[i].age);
printf("输入第%d人的成绩",i+1);
scanf("%f",&s[i].score);
printf("\n");
}
for(i=0;i
{
if(s[i].sex=='m') num1++;
else num2++;
sumage=sumage+s[i].age;
sumscore=sumscore+s[i].score;
}
aveage=sumage/n;
avescore=sumscore/n;
printf("班上男生:%d人 女生:%d人\n",num1,num2);
printf("平均年龄为:%.2f\n",aveage);
printf("平均成绩为:%.2f\n",avescore);
printf("\n成绩高于平均分的学生信息为:\n");
for(i=0;i
if(s[i].score>avescore)
printf("%ld, %s, %c,%d, %.2f",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].score); }
}
4.0
输入今天是星期几的序号(0~6代表星期天至星期六),给今天和昨天赋予枚举值,并输出昨天是星期几对应的枚举值。
#include
enum day{sun=0,mon=1,thu=2,wed=3,th=4,fri=5,sat=6};
void main()
{
/* 06代表星期天至星期六*/ scanf("%d",&a); int a; printf("输入今天是星期几的序号:"); enum day today ,yesterday;
{ case 0: printf("sum\n"); break; case 1: printf("mon\n"); break; case 2: printf("thu\n"); break; switch(a-1) printf("昨天是:"); else printf("error ,error\n"); else if(a==0) printf("昨天是星期几对应的枚举值:%d\n",6); printf("昨天是星期几对应的枚举值:%d\n",a-1); if(a>0&&a
}
case 4: printf("th\n"); break; case 5: printf("fri\n"); break; case 6: printf("sat\n"); break; case 7: printf("sun\n"); break; }
5.0
#include"stdio.h"
#define m 20
void main()
{
struct publish_date
{
int year;
int month;
int day;
};
struct book
{
char book_name[30];
char author[10];
char publisher[50];
struct publish_date time;
float price;
};
struct book b[m];
int i;
for(i=0;i
{
printf("输入第%d本书的信息",i+1);
printf("请输入书名:");
scanf("%s",b[i].book_name);
printf("输入作者");
scanf("%s",b[i].author);
printf("输入出版社");
scanf("%s",b[i].publisher);
printf("输入出版日期,逗号分隔");
scanf("%d,%d,%d",&b[i].time.year,&b[i].time.month,&b[i].time.day);
printf("输入价格");
scanf("%f",&b[i].price);
}
printf("book_name\t author\t publisher\t publish_date\t price\n");
for(i=0;i
{
printf("%-10s\t ",b[i].book_name);
printf("%-10s\t",b[i].author);
printf("%-10s\t",b[i].publisher);
printf("%d-%d-%d\t",b[i].time.year,b[i].time.month,b[i].time.day);
printf("%-3.2f\n",b[i].price);
printf("\n");
}
}
6.0
6.0某单位工资结构体包含,工资编号,职工姓名,工资年龄,考核奖金,房租水电,公积金,实发工资等内容,假设该单位有六位职工。
输入职工信息,不包括实发工资,计算每一个人的实发工资;统计单位的实发工资总额;计算单位的平均工资;
#include
void select(struct worker s[],int n); // 这个函数是从小到大排序 #define m 6
struct worker
void main()
{
struct worker s[m]; int i,j,k,max; int sum; float ave,wage[m],temp; }; { int id; char name[15]; int wage1; //工龄工资 int price; int pay1; // 房租水电 int pay2; //公积金 float wage; // 实发工资
for(i=0;i
printf("工积金:"); printf("房租水电:"); scanf("%d",&s[i].pay1); printf("考核奖金:"); scanf("%d",&s[i].price); printf("工龄工资:"); scanf("%d",&s[i].wage1); printf("输入职工姓名:"); scanf("%s",s[i].name); printf("输入工资编号:"); scanf("%d",&s[i].id); { printf("输入第%d人的信息",i+1);
} sum=0;
for(i=0;i
printf("单位平均工资:%f\n",sum/(m*1.0)); printf("单位工资总额:%d\n",sum); sum=sum+wage[i]; } printf("第%d人的实发工资",i+1); printf("%5.2f\n",wage[i]); { wage[i]=s[i].wage1+s[i].price-s[i].pay1-s[i].pay2;
for(i=0;i
printf("%5d %5d %5d %5d %10.2f\n",s[i].wage1,s[i].price,s[i].pay1,s[{ printf("%-10d %-10 %s",s[i].id,s[i].name); select(s,m); {s[k].wage=s[k].wage1+s[k].price-s[k].pay1-s[k].pay2;} for(k=0;k
}
}
{
void select(struct worker s[],int n) { int i,j,k,max; struct worker temp; for(i=0;is[j].wage) max=j;
if(i!=max)
{
temp=s[i]; s[i]=s[max]; s[max]=temp;
}
}
7-1
#include
void main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
printf("%d\n",(m=a>b)&(n=c>d));
}
/*
a>b不成立,所以m=0, c>d不成立,所以
*/
n=0, 0&0=0
#include
void main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4;
c=~(~0
d=b&c;
printf("%o,%o\n",a,b);
printf("d=%o c=%o\n",d,c);
}
/* a=0331(8),八进制,因为输入为%o,
a=011 011 001(2)
b=a>>4=000001101(2)=015(8)
c=000~1111=15
d=b&c=000 001 101(2)=15(8) */
8题
编写一个函数int move(int value,char dirction,int digits), 其中形参是value是被循环移位的数,dirction,是被移位的方向,r为友移,l左移, digits为移动位数,函数函数换回值为移动结果。
#include
int move(int value,char dirction,int digits);
int move(int value,char direction,int digits)
{
if(direction=='r')
value=value>>digits;
return value;
if(direction=='l')
value=value
}
void main()
{
int num;
char c;
int dig,end;
printf ("输入被移位的数:");
scanf("%d",&num);
getchar();
printf("如果左移输入l,右移输入r:
scanf("%c",&c); ");
printf("输入移动的位数");
scanf("%d",&dig);
end=move(num,c,dig);
printf("value=%d\n",end);
}