本文章为C语言程序设计课后习题和答案
-------------------如有错误,欢迎及时评论区指出,目前自主学习不定时更新-------------------------
欢迎大家一起讨论,也欢迎大家一起学习相关的知识,多多交流,一起提高
目录
第一章程序设计基础
因都为文字叙述题和简答题(后续章节一样),所以暂不更新第一章。
第二章 数据类型、运算符和表达式
1.略, 2.C, 3.D, 4.C, 5.A, 6.A, 7.C, 8.A, 9.A, 10.B, 11.A, 12.D, 13.B, 14.C, 16.略。
15.代码如下:
#include<stdio.h>
int main(){
float F;//定义一个华氏度温度
scanf("%f",&F);
printf("C=%f ",5*(F-32)/9);//也可以定义一个C表示出
return 0;
}
第三章 顺序结构程序设计
1.(1)C, (2)B。
2.scanf缺少取地址符号'&',printf应该为%d。
3.(1)BOY换行 (2)12%,15.500000%。
4.略。
5.代码如下
(1)
#include<stdio.h>
int main(){
int l,w;//定义长度和宽度
int s=0,c=0;//定义面积和周长
printf("请输入长度和宽度并用空格隔开:\n");
scanf("%d %d",&l,&w);
s=l*w;
c=2*(l+w);
printf("周长为:%d\n面积为:%d\n",c,s);
return 0;
}
(2)
#include<stdio.h>
int main(){
char Letter,letter;//定义大写字母和小写字母
printf("输入一个大写字母:\n");
Letter=getchar();
letter=Letter+32;//大写字母为小写字母ASCII码+32
printf("转换前:%c\tASCII码为:%d\n转换后:%c\tASCII码为:%d\n",Letter,Letter,letter,letter);
return 0;
}
(3)
#include<stdio.h>
int main(){
int num1,num2,num3,num4,num5;
printf("请输入5个数:\n");
scanf("%d%d%d%d%d",&num1,&num2,&num3,&num4,&num5);
printf("计算结果为:\n");
printf("%015.8lf",(float)num1/num2*num3+num4-num5);
/*因为整数是6位,小数是8位,加上一位小数点,总共为15位*/
return 0;
}
(4)
#include<stdio.h>
int main(){
int num1;
char ch1,ch2;
float num2;
printf("请输入4个数据(依次为1个整数、2个字符、1个实数)\n");
scanf("%d %c %c %f",&num1,&ch1,&ch2,&num2);
printf("这4个数据倒序为:\n");
printf("4-%.2f 3-%c 2-%c 1-%d",num2,ch2,ch1,num1);//参考书上输出所以保留两位
return 0;
}
(5)
#include<stdio.h>
int main(){
int y,m,d;
printf("please input a date:\n");
scanf("%d-%d-%d",&y,&m,&d);
printf("the date is:\n");
printf("%d/%d/%d",y,m,d);//若需要考虑月和日0开头则格式化输出即可
return 0;
}
(6)
#include<stdio.h>
int main(){
int num,sum;//sum用于统计;
printf("请输入一位三位数整数\n");
scanf("%d",&num);
printf("百位为%d 十位为%d 个位为%d ",num/100,num/10%10,num%10);
sum=num/100+num/10%10+num%10;
printf("位数之和为%d \n",sum);//可以循环依次取余相加也可
return 0;
}
(7)
#include<stdio.h>
#include<math.h>//方便使用根号公式
int main(){
int a,b,c;
a=4,b=4;//手动输入则修改为读入即可
c=sqrt(a*a+b*b);//c等于根号下a方+b方
printf("斜边为:%d\n",c);//会丢掉小数位
return 0;
}
(8)略
(9)
#include<stdio.h>
#include<math.h>//方便使用根号公式
int main(){
int r1,r2;//定义小圆半径和大圆半径
printf("依次输入小圆半径和大圆半径:\n");
scanf("%d %d",&r1,&r2);
float PI=3.14,S;//圆周率和圆环面积
S=PI*(r2*r2-r1*r1);
printf("%.3f \n",S);
return 0;
}
-----------------------------------------------------------------------------------------------------------------6.30日更新
第四章 选择结构程序设计
(1)
#include<stdio.h>
int main(){
int num1,num2,num3,num4;
int max1,max2;
printf("请输入4个数字:\n");
scanf("%d %d %d %d",&num1,&num2,&num3,&num4);
if(num1>=num2){
max1=num1;
max2=num2;
}else{
max1=num2;
max2=num1;
}if(max1<=num3){
max2=max1;
max1=num3;
}else if(max2<=num3){
max2=num3;
}
if(max1<=num4){
max2=max1;
max1=num4;
}else if(max2<=num4){
max2=num4;
}
printf("最大值是%d,次大值是%d\n",max1,max2);
return 0;
}
(2)
#include<stdio.h>
int main(){
int x;
printf("请输入x的数值:\n");
scanf("%d",&x);
if(x<1){
printf("y的值为%d \n",x);
}else if(x>=30){
printf("y的值为%d \n",7*x-3);
}else{
printf("y的值为%d\n",3*x+5);
}
return 0;
}
(3)
#include<stdio.h>
int main(){
int x;
printf("请输入x的数值:\n");
scanf("%d",&x);
if(x>=0){
printf("x的值为%d \n",x);
}else{
printf("x的绝对值为%d\n",-x);
}
return 0;
}
(4)
#include<stdio.h>
#include<math.h>//方便使用abs函数判断两数之差
int main(){
int a,b,c;
int p,s;//辅助记录函数面积
printf("请输入a b c的数值:\n");
scanf("%d %d %d",&a,&b,&c);
if(a+b>c && abs(a-b)<c){//可能为负数所以要加绝对值
printf("可以构成三角形\n");
}else if(a+c>b && abs(a-c)<b){
printf("可以构成三角形\n");
}else if(b+c>a && abs(b-c)<a){
printf("可以构成三角形\n");
}else {
printf("不可以构成三角形\n");
}
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("三角形的面积为%d",s);
return 0;
}
(5)
#include<stdio.h>
int main(){
char ch;
printf("请输入一个字符:\n");
ch=getchar();
if(ch>='a' && ch<='z'){
printf("大写为%c \n",ch-32);
}else if(ch>='A' && ch<='Z'){
printf("小写为%c \n",ch+32);
}else if(ch>='0' && ch<='9'){
printf("ASCII码为 %d \n",ch);
}else{
printf("@ \n");
}
return 0;
}
(6)
#include<stdio.h>
int main(){
double BMI,kg,m;
printf("请输入身高(m)和体重(kg):\n");
scanf("%lf %lf",&m,&kg);
BMI=kg/(m*m);
if(BMI<18.5){
printf("体重过低\n");
}else if(BMI>=18.5 && BMI<24){
printf("正常范围\n");
}else if(BMI>=24 && BMI<28){
printf("超重\n");
}else{
printf("肥胖\n");
}
return 0;
}
(7)
#include<stdio.h>
int main(){
int num1,num2,num3,num4;
int max1,max2,max3,max4;
printf("请输入4个数字:\n");
scanf("%d %d %d %d",&num1,&num2,&num3,&num4);
max1=max2=max3=max4=0;
if(num1>=num2){
max1=num1;
max2=num2;
}else{
max1=num2;
max2=num1;
}if(max1<=num3){
max3=max2;
max2=max1;
max1=num3;
}else if(max2<=num3){
max3=max2;
max2=num3;
}else{
max3=num3;
}if(max1<=num4){
max4=max2;
max2=max1;
max1=num4;
}else if(max2<=num4){
max4=max2;
max2=num4;
}else{
max4=num4;
}if(max3>=max4){
printf("%d %d %d %d\n",max1,max2,max3,max4);//本章输出前两位大小也可以用此方法
}else{
printf("%d %d %d %d\n",max1,max2,max4,max3);
}
return 0;
}
第五章 循环结构程序设计
(1)
#include <stdio.h>
int main(){
int n,fac=1,sum=0;
printf("请输入n的值:\n");
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int k=i;k>0;k--){
fac*=k;
}
sum+=fac;
fac=1;
}
printf("%d的阶乘加和为%d ",n,sum);
return 0;
}
(2)
#include <stdio.h>
int main(){
int sum=0;
printf("1000以内的完数有:");
for(int i=1;i<1000;i++){
for(int k=1;k<i;k++){
if(!(i%k)){
sum+=k;
}
}
if(sum==i){
printf("%d ",i);
}
sum=0;
}
return 0;
}
(3)
#include <stdio.h>
int main(){
int m,n,min;
printf("请输入m和n:\n");
scanf("%d %d",&m,&n);
if(n>m){
min=m;
m=n;
n=min;
}
for(int i=n;i>0;i--){
if(n%i==0&&m%i==0){
min=i;
break;
}
}
printf("最大公约数为%d ",min);
return 0;
}
(4)
#include <stdio.h>
int main(){
double sum,h;//定义总米数和高度
h=100;
sum=100;//因为只有第一次是单独一次下落
for(int i=1;i<10;i++){
h/=2;
sum+=h*2;
}
printf("总经过长度%lf,第8次反弹高度为%lf",sum,h);
return 0;
}
(5)
#include <stdio.h>
int main(){
printf("请输入一串字符:\n");
int sum1,sum2,sum3;
char ch;
sum1=sum2=sum3=0;
while((ch=getchar())!='\n'){
if(ch>='a' && ch<='z'){
sum1++;
}else if(ch>='A' && ch<='Z'){
sum1++;
}else if(ch>='0' && ch<='9'){
sum2++;
}else{
sum3++;
}
}
printf("英文字母次数为%d 数字为次数为%d 其他字符次数为%d ",sum1,sum2,sum3);
return 0;
}
(6)
#include <stdio.h>
int main(){
printf("请输入任意个整数空格隔开,用-888表示结束:\n");
int num1,max,min;
num1=0;
scanf("%d",&num1);
if(num1==-888){
return 0;
}
max=min=num1;
while(num1 != -888){
if(num1>max){
max=num1;
}else if(num1<min){
min=num1;
}
scanf("%d",&num1);
}
printf("最大值为%d,最小值为%d",max,min);
return 0;
}
(7)
#include <stdio.h>
int main(){
int one,five,ten;
for(ten=5;ten<=10;ten+=5){
for(five=5;five<=20;five+=5){
for(one=5;one<=100;one+=5){
if(one+five*5+ten*10==100){
printf("一元的要%d张,五元的要%d张,十元的要%d张\n",one,five,ten);
}
}
}
}
}
(8)
#include <stdio.h>
int main(){
int g,m,x;//分别是公鸡 母鸡 小鸡
for(g=1;g<=20;g++){
for(m=1;m<=33;m++){
for(x=1;x<=330;x++){
if(x/3.0+m*3+g*5==100&&x+m+g==100){
printf("小鸡%3d只,母鸡%3d只,公鸡%3d只\n",x,m,g);
}
}
}
}
return 0;
}
--------------------------------------------------------------------------------------------------7.2更新
第六章 模块化程序设计
(1)
#include<stdio.h>
#include<math.h>//方便使用根号公式
void S(int r1,int r2);
int main(){
int r1,r2;//定义小圆半径和大圆半径
printf("依次输入小圆半径和大圆半径:\n");
scanf("%d %d",&r1,&r2);
S(r1,r2);
return 0;
}
void S(int r1,int r2){
float PI=3.14,S;//圆周率和圆环面积
S=PI*(r2*r2-r1*r1);
printf("%.3f \n",S);
}
(2)
#include <stdio.h>
void M(int sum);
int main(){
int sum=0;
printf("1000以内的完数有:");
M(sum);
return 0;
}
void M(int sum){
for(int i=1;i<1000;i++){
for(int k=1;k<i;k++){
if(!(i%k)){
sum+=k;
}
}
if(sum==i){
printf("%d ",i);
}
sum=0;
}
}
(3)
#include <stdio.h>
int Zd(int m,int n);//最大公约数
int Zx(int m,int n);//最小公倍数
int main(){
int m,n,min,max;
printf("请输入m和n:\n");
scanf("%d %d",&m,&n);
max=Zd(m,n);
min=Zx(m,n);
printf("最大公约数为%d 最小公倍数%d",max,min);
return 0;
}
int Zd(int m,int n){
int a=0;
if(n>m){
a=m;
m=n;
n=a;
}
for(int i=n;i>0;i--){
if(n%i==0&&m%i==0){
a=i;
return a;
}
}
return -1;
}
int Zx(int m,int n){
int a=0;
if(n>m){
a=m;
m=n;
n=a;
}
for(int i=m;i>=0;i--){
if(m%i==0&&n%i==0){
a=m/i*n;
return a;
}
}
return -1;
}
(4)
#include <stdio.h>
int judge1(int m);
int judge2(int m);
int main(){
int m;
printf("请输入一位五位数m:\n");
scanf("%d",&m);
if(judge1(m)){
if (judge2(m)){
printf("%d是回文数字\n",m);
}
}else{
printf("%d不是回文数字\n",m);
}
return 0;
}
int judge1(int m){
int flag=0;
if(m%10==m/10000){
flag=1;
}
return flag;
}
int judge2(int m){
int flag=0;
if(m/1000%10 == m/10%10){
flag=1;
}
return flag;
}
(5)
#include <stdio.h>
void Dput( int m);
int main(){
int m;
printf("请输入一位数m:\n");//超过十位建议用char读入
scanf("%d",&m);
printf("逆序数为:\n");
Dput(m);
return 0;
}
void Dput( int m){
int x=0;
for(;m>0;m/=10){
x=m%10;
printf("%d ",x);
}
}
(6)1.输出如下
:var equal 0
:static var equal 0
:var equal 0
:static var equal 1
:var equal 0
:static var equal 2
2.输出如下
:the num equal 2
:the internal block num equal 1
:the num equal 3
:the internal block num equal 2
:the num equal 4
:the internal block num equal 3
第七章 数组
(1)
#include<stdio.h>
void Sort(float a[],int n);
int main()
{
float a[100];
int i,c=0;
char ch;
for(i=0;ch!='\n';i++){
scanf("%f",&a[i]);
ch=getchar();
c++;
}
Sort(a,c);
for(int j=0;j<c;j++){
printf("%f ",a[j]);
}
return 0;
}
void Sort(float a[],int n){
int temp,i,k;
float tmp;
temp=a[0];
for(i=0;i<n;i++){
temp=i;
for(k=i+1;k<n;k++){
if(a[k]<a[temp]){
temp=k;
}
}
if(temp!=i){
tmp=a[i];
a[i]=a[temp];
a[temp]=tmp;
}
}
}
(2)
#include<stdio.h>
#include<math.h>
#define N 10
float average(int a[]);
int cmp(int a[],float sum);
int main()
{
printf("请输入十个数:\n");
int a[N]={0};
int b=0;
float sum=0.0;
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
sum=average(a);
b=cmp(a,sum);
printf("平均值是%.2f,最接平均值的是%d",sum,a[b]);
return 0;
}
float average(int a[]){
float sum=0.0;
for(int i=0;i<N;){
sum+=a[i++];
}
return sum/N;
}
int cmp(int a[],float sum){
int temp=0,k;
float b[N]={0};
for(int i=0;i<N;i++){
b[i]=fabs(a[i]-sum);
}
for(k=0;k<N;k++){
if(b[temp]>b[k]){
temp=k;
}
}
return temp;
}
(3)
#include<stdio.h>
#define N 10
void minimum(int a[N][N],int min);
void maximum(int a[N][N],int max);
int main()
{
int a[N][N];
int max,min;
max=min=a[0][0];
minimum(a,min);
maximum(a,max);
return 0;
}
void minimum(int a[N][N],int min){
int row,con;
for(int i=0;i<=N;i++){
for(int k=0;k<N;k++){
if(a[i][k]<min){
min=a[i][k];
row=i;
con=k;
}
}
}
printf("最小值是%d,第%d行和第%d列\n",min,row,con);
}
void maximum(int a[N][N],int max){
int row,con;//定义行和列
for(int i=0;i<=N;i++){
for(int k=0;k<N;k++){
if(a[i][k]>max){
max=a[i][k];
row=i;
con=k;
}
}
}
printf("最大值是%d,第%d行和第%d列\n",max,row,con);
}
(4)
#include<stdio.h>
#define N 3
void row(int a[N][N]);
void con(int a[N][N]);
int main()
{
int a[N][N]={};
for(int i=0;i<N;i++){
for(int k=0;k<N;k++){
scanf("%d",&a[i][k]);
}
}
row(a);
printf("----------------\n");
con(a);
return 0;
}
void row(int a[N][N]){
int sum=0,count=1;
for(int i=0;i<N;i++){
for(int k=0;k<N;k++){
sum+=a[i][k];
}
printf("第%d行的值为%d\n",count,sum);
count++;
sum=0;
}
}
void con(int a[N][N]){
int sum=0,count=1;
for(int i=0;i<N;i++){
for(int k=0;k<N;k++){
sum+=a[k][i];
}
printf("第%d列的值为%d\n",count,sum);
count++;
sum=0;
}
}
(5)
#include<stdio.h>
#include<string.h>
int compare(char a[][100]);
int main()
{ printf("请输入三串字符:\n");
char a[3][100]={};
for(int i=0;i<3;i++){
gets(a[i]);
}
printf("最大的字符串是%s",a[compare(a)]);
return 0;
}
int compare(char a[][100]){
int max=0;
for(int i=0;i<3;i++){
if(strcmp(a[i],a[i+1])>0){
max=i;
}else{
max=i+1;
}
}
return max;
}
(6)
#include<stdio.h>
#include<string.h>
#define N 40
int mystrcpy(char a[],char b[]);
int main()
{
char s1[N]="I love you everday";
char s2[]="I love English";
if(mystrcpy(s1,s2)){
printf("复制成功,内容为%s",s1);
}else{
printf("复制失败");
}
return 0;
}
int mystrcpy(char a[],char b[]){
int i;
if(strlen(b)>strlen(a)){
return 0;
}
for(i=0;b[i]!='\0';i++){
a[i]=b[i];
}
a[i]='\0';
return 1;
}
(7)
#include<stdio.h>
#include<string.h>
void transform(long int sum,char a[100]);
int main()
{ printf("请输入一串数字:\n");
char a[100];
gets(a);
long int sum=0;//-2^31~2^31-1
transform(sum,a);
return 0;
}
void transform(long int sum,char a[100]){
int flag=0,i=0;
if(a[0]=='-'){
flag=1;
i++;
}
for(i=i;a[i]!='\0';i++){
sum=sum*10+(a[i]-'0');
}
if(flag){
printf("%ld ",sum*-1);
}else{
printf("%ld ",sum);
}
}
-----------------------------------------------------------7.5更新
第八章 指针
(1)
#include<stdio.h>
void swap(int *x,int *y);
int main()
{
int a,b;
printf("请输入a和b的值:\n");
scanf("%d %d",&a,&b);
swap(&a,&b);
printf("交换后:\na=%d b=%d",a,b);
return 0;
}
void swap(int *x,int *y){
int t;
t=*x;
*x=*y;
*y=t;
}
(2)
#include<stdio.h>
void max(int *p,int n);
void min(int *p,int n);
int main()
{
int a[10]={0};
int *p=a;
printf("请输入十个数字\n");
for(int i=0;i<10;i++){
scanf("%d",p++);
}
p=a;
max(p,10);
min(p,10);
return 0;
}
void max(int *p,int n){
int num=*p;
for(int i=0;i<n;i++){
if(num<*(p+i)){
num=*(p+i);
}
}
p=p-n;
printf("%d ",num);
}
void min(int *p,int n){
int num= *p;
for(int i=0;i<n;i++){
if(num>*(p+i)){
num=*(p+i);
}
}
p=p-n;
printf("%d ",num);
}
(3)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void max(int a[5][5],int n);//每一行最大值
void Smax(int (*p)[5],int n);//整个数组最大值
int main()
{
int a[5][5]={0,};
int (*p)[5]=a;
//int c=1;
srand(time(0));
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
*(*(p+i)+j)=rand()%100;//随机初始化数组
}
}
printf("初始化矩阵为:\n");
for(int i=0;i<5;i++){
for(int k=0;k<5;k++){
printf("%d\t",a[i][k]);
}
printf("\n");
}
max(a,5);
printf("\n");
Smax(p,5);
return 0;
}
void max(int a[5][5],int n){
int i,j;
int maxnum;
int count=1;
for(i=0;i<n;i++){
maxnum=a[i][0];
for(j=0;j<n;j++){
if(maxnum<a[i][j]){
maxnum=a[i][j];
}
}
printf("第%d行最大值是%d\n",count,maxnum);
count++;
}
}
void Smax(int (*p)[5],int n){
int i,j,count;
int maxnum;
maxnum=(*p)[0];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(maxnum<(*p)[j]){
maxnum=(*p)[j];
count=i+1;
}
}
p++;
}
printf("最大值第%d行是%d\n",count,maxnum);
}
(4)
#include<stdio.h>
#include<stdlib.h>
void Dele(char *str1,char *str2);
int main()
{
char a[100];
gets(a);
printf("输入的字符串为%s \n",a);
char *str1,*str2;
str1=str2=a;
Dele(str1,str2);
printf("删除后的字符串为%s \n",a);
return 0;
}
void Dele(char *str1,char *str2){
for(int i=0;*str1 !='\0';i++){
if((*str1>='a'&&*str1<='z') ||( *str1>='A'&&*str1<='Z')){
*str2=*str1;
str2++;
str1++;
}
else{
str1++;
}
}
*str2='\0';
}
(5)
#include<stdio.h>
#include<string.h>
char *strcopy(char *s1,char *s2);
int main()
{
char a[100];
char b[100];
gets(a);
printf("输入的字符串为%s \n",a);
char *s1=a,*s2=b,*str;
str=strcopy(s1,s2);
printf("复制的的字符串为%s \n",str);
return 0;
}
char *strcopy(char *s1,char *s2){
char *s=s2;
while(*s1!='\0'){
*(s2++)=*(s1++);
}
*s2='\0';
return s;
}
(6)
#include<stdio.h>
#include<string.h>
void Sort(char s[5][100]);
int main()
{
char a[5][100];
printf("输入五个字符串:\n");
int i=0;
while(i<5){
gets(a[i]);
i++;
}
Sort(a);
i=0;
printf("排序后字符串为:"\n");
while(i<5){
printf("%s\n",a[i]);
i++;
}
return 0;
}
void Sort(char s[5][100]){
char b[100];
char *a=b;
for(int i=1;i<5;i++){
for(int j=0;j<5-i;j++){
if(strcmp(s[j],s[j+1])>0){
strcpy(a,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],a);
}
}
}
}
------------------------------------------------------------------------7.7号更新
第九章 自定义数据类型
结构体实在是太难了 慢慢更新
(1)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct{
int year,month,day;
}date;
int count(int year,int month,int day);
int main(void)
{
date a;
int day=0;
printf("请输入年月日如2022-02-22:\n");
scanf("%d-%d-%d",&a.year,&a.month,&a.day);
day=count(a.year,a.month,a.day);
printf("是今年的第%d天",day);
return 0;
}
int count(int year,int month,int day){
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int flag=1;
int sum=0;
if((year%4==0&&year%100!=0)||year%400==0){
flag=0;
}
for(int i=1;i<month;i++){
sum+=d[i];
}
sum+=day;
if(flag){
return sum;
}else if(flag==0&&month>2){
return (sum+1);
}else{
return sum;
}
}
(2)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 10
typedef struct{
int fail;
char num[11];
char name[5];
char age[2];
float score[3];
float avgscore;
}studen;
void Sort(studen s[]);
void Fail(studen s[]);
void Print(studen *s);
int main(void)
{
studen s[N];
printf("请输入10位学生的学号、姓名和年龄以及三门成绩(用空格隔开):\n");
for(int i=0;i<N;i++){
s[i].avgscore=0.0;
scanf("%s%s%s",s[i].num,s[i].name,s[i].age);
for(int k=0;k<3;k++){
scanf("%f",&s[i].score[k]);
s[i].avgscore+=s[i].score[k];
}
s[i].avgscore/=3;
}
Sort(s);
Fail(s);
Print(s);
return 0;
}
void Sort(studen s[]){
studen a;
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
if(s[i].avgscore < s[j].avgscore){
a=s[i];
s[i]=s[j];
s[j]=a;
}
}
}
}
void Fail(studen s[]){
for(int i=0;i<N;i++){
s[i].fail=0;
for(int k=0;k<3;k++){
if(s[i].score[k]<60.0){
s[i].fail=1;
break;
}
}
}
printf("不及格的学生信息如下:\n");
printf("学号 姓名 年龄 三科成绩\n");
for(int k=0;k<N;k++){
if(s[k].fail){
printf("%s %s %s ",s[k].num,s[k].name,s[k].age);
for(int j=0;j<3;j++){
printf("%.2f ",s[k].score[j]);
}
printf("\n");
}
}
}
void Print(studen *s){
printf("排序学生信息如下:\n");
printf("学号 姓名 年龄 三科成绩\n");
for(int k=0;k<N;k++){
printf("%s %s %s ",s[k].num,s[k].name,s[k].age);
for(int j=0;j<3;j++){
printf("%.2f ",s[k].score[j]);
}
printf("\n");
}
}
(3)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 3
typedef struct a{
char num[11];
char name[5];
char age[2];
struct a *next;
}studen;
void Scan(studen s[],int n);
int main(void)
{
studen s[N];
studen *head,*p;
int i;
Scan(s,N);
head=&s[0];
for( i=0;i<N;i++){
s[i].next=&s[i+1];
}
s[i-1].next=NULL;//尾部标记一下为空
p=head;
while(p){
printf("%s %s %s\n",p->num,p->name,p->age);
p=p->next;
}
}
void Scan(studen s[],int n){
printf("请输入学号、姓名和年龄\n");
for(int i=0;i<n;i++){
scanf("%s%s%s",s[i].num,s[i].name,s[i].age);
}
}
(4)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
char num[11];
float score;
struct a *next;
}studen,*STU;
STU Create(int n);
int Find(studen *s);
void print(STU head);
int main(void)
{ STU head=NULL;
int n;
printf("请输入学生数目:\n");
scanf("%d",&n);
head=Create(n);
print(head);
Find(head);
return 0;
}
STU Create(int n){
int i=0;
studen *head=NULL,*p1,*p2;
while(i<n){
p1=(studen *)malloc(sizeof(studen));
p1->next=NULL;
printf("请输入第%d个学生的信息:\n",i+1);
scanf("%s %f",p1->num,&p1->score);
if(head==NULL){
head=p1;
p2=p1;
}else{
p2->next=p1;
p2=p1;
}
i++;
}
return head;
}
void print(STU head){
studen *p=head;
printf("录入学生信息如下:\n");
printf("学号 成绩\n");
while(p!=NULL){
printf("%s %.2f\n",p->num,p->score);
p=p->next;
}
}
int Find(studen *s){
char a[11];
float b;
printf("请输入要查找的学号和修改的信息:\n");
scanf("%s %f",a,&b);
for(;s!= NULL;s=s->next){
if(strcmp(a,s->num)==0){
printf("查找到学号为%s\n",s->num);
printf("已修改%.2f为%.2f\n",s->score,b);
s->score=b;
return 1;
}
}
printf("没有找到此学号\n");
return 0;
}
(5)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
char num[11];
int date;
struct a *next;
}studen,*stu;
stu create(void);
stu Intersection(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
stu head=NULL,L1,L2;
L1=create();
L2=create();
printf("第一个链表数据为:\n");
intput(L1);
printf("第二个链表数据为:\n");
intput(L2);
head=Intersection(L1,L2);
printf("交集链表数据为:\n");
intput(head);
}
stu create(void){
int n;
static int k=1;
printf("请输入要建立的第%d个链表大小\n",k);
k++;
scanf("%d",&n);
studen *head,*p,*q;
int i=0;
head=NULL;
while(i<n){
p=(stu)malloc(sizeof(studen));
p->next=NULL;
printf("请输入%d位的学号和成绩:",i+1);
scanf("%s%d",p->num,&p->date);
if(head==NULL){
head=p;
q=p;
}else{
q->next=p;
q=p;
}
i++;
}
return head;
}
stu Intersection(stu L1,stu L2){
studen *head,*p,*q,*s;
p=L1;q=L2;
if(p==NULL&&q==NULL){
return 0;
}
while(p!=NULL){
q=L2;
while(q!=NULL){
if(strcmp(p->num,q->num)==0){
if(head==NULL){
head=p;
s=p;
}else{
s->next=q;
s=q;
}
}
q=q->next;//需要考虑空间回收问题
}
p=p->next;
}
s->next=NULL;
return head;
}
void intput(studen *head){
studen *p;
p=head;
while(p){
printf("%s %d\n",p->num,p->date);
p=p->next;
}
}
(6)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
char num[11];
int date;
struct a *next;
}studen,*stu;
stu create(stu *L);//创建带头指针的链表
void DeleteNode(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
stu L1,L2;
create(&L1);//链表1
create(&L2);//链表2
printf("第一个链表数据为:\n");
intput(L1);
printf("第二个链表数据为:\n");
intput(L2);
DeleteNode(L1,L2);//删除1中含有2的数据
printf("删除后的第一个链表:\n");
intput(L1);
}
stu create(stu *L){
int n;
static int k=1;
printf("请输入要建立的第%d个链表大小\n",k);
k++;
scanf("%d",&n);
studen *p;
(*L)=(stu)malloc(sizeof(studen));//创建空间
(*L)->next=NULL;
int i=0;
while(i<n){//循环读入数据
p=(stu)malloc(sizeof(studen));
printf("请输入%d位的学号和成绩:",i+1);
scanf("%s%d",p->num,&p->date);
p->next=(*L)->next;
(*L)->next=p;
i++;
}
return 0;
}
void DeleteNode(stu L1,stu L2){
studen *temp,*p,*q,*s,*h,*p1;
p=(L1)->next;q=(L2)->next;h=(L1);s=p;
if(p==NULL&&q==NULL){
exit(0);
}
while(q!=NULL){
p=s;//回到起点迭代比较
while(p!=NULL){
if(strcmp(q->num,p->num)==0){
if(h->next==p){//头结点需要单独换算
h->next=p->next;
temp=p;
p=p->next;
free(temp);
}else{//释放掉找到节点
p1->next=p->next;
temp=p;
p=p->next;
free(temp);
}
}
if(p!=NULL){//链表是否为空
p1=p;
p=p->next;
}
}
q=q->next;
}
}
void intput(studen *head){//输出链表数据
studen *p;
p=head->next;
while(p){
printf("%s %d\n",p->num,p->date);
p=p->next;
}
}
----------------------------------------------------------------------------------------7.13就先到这里吧
(7)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
char num[11];
int date;
struct a *next;
}studen,*stu;
stu create(void);
stu Union(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
stu head=NULL,L1,L2;
L1=create();
L2=create();
printf("第一个链表数据为:\n");
intput(L1);
printf("第二个链表数据为:\n");
intput(L2);
head=Union(L1,L2);
printf("并集链表数据为:\n");
intput(head);
}
stu create(void){
int n;
static int k=1;
printf("请输入要建立的第%d个链表大小\n",k);
k++;
scanf("%d",&n);
studen *head,*p,*q;
int i=0;
head=NULL;
while(i<n){
p=(stu)malloc(sizeof(studen));
p->next=NULL;
printf("请输入%d位的学号和成绩:",i+1);
scanf("%s%d",p->num,&p->date);
if(head==NULL){
head=p;
q=p;
}else{
q->next=p;
q=p;
}
i++;
}
return head;
}
stu Union(stu L1,stu L2){
studen *head,*p,*q,*s;
p=L1;q=L2;
if(p==NULL&&q==NULL){
return 0;
}
while(q!=NULL&&p!=NULL){
if(strcmp(p->num,q->num)<0){
if(head==NULL){
head=p;
s=p;
}else{
s->next=p;
s=p;
}
p=p->next;
}
else if(strcmp(p->num,q->num)>0){
if(head==NULL){
head=q;
s=q;
}else{
s->next=q;
s=q;
}
q=q->next;
}
else{
if(head==NULL){
head=p;
s=p;
}else{
s->next=p;
s=p;
}
p=p->next;
q=q->next;
}
}
while(q){
s->next=q;
s=q;
q=q->next;
}
while(p){
s->next=p;
s=q;
p=p->next;
}
s->next=NULL;
return head;
}
void intput(studen *head){
studen *p;
p=head;
while(p){
printf("%s %d\n",p->num,p->date);
p=p->next;
}
}
(8)
#include <stdio.h>
#include <stdlib.h>
typedef struct StuInfo{
int date;
struct StuInfo *next;
}student,*stu;
stu create();
stu Numberoff(stu h);
int main(){
stu head;
head=create();
Numberoff(head);
return 0;
}
stu create(){
int n=1;
student *head,*p,*s;
head=NULL;
while(n<11){
p=(stu)malloc(sizeof(student));
p->next=NULL;
p->date=n;
if(head==NULL){
head=p;
s=p;
}else{
s->next=p;
s=p;
}
++n;
}
s->next=head;
return head;
}
stu Numberoff(stu h){
student *head,*p,*q;
head=h;q=head;//记录头结点和当前位置节点q
p=head;//让p等于头结点后面
int n=9,count=1;
while(n>0){
if(count%3!=0){
++count;
q=p;p=p->next;
}else{
q->next=p->next;
printf("淘汰编号%d\n",p->date);
free(p);
p=q->next;
--n;
count=1;
}
}
head=p;
printf("剩余节点%d\n",head->date);
}
-----------------------------------------------------------------7.14更新
第十章 文件
(1)略
(2)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char *p;
char a[20];
FILE *fp;
fp=fopen("2.1.txt","r");
if(fp==NULL){
printf("File can not be opened\n");
exit(0);
}
p=fgets(a,40,fp);
while(p != NULL){
printf("%s",p);;
p=fgets(a,40,fp);
}
fclose(fp);
return 0;
}
(3)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char p;
char b[20];
printf("请输入要创建的文件名\n");
scanf("%s",b);
strcat(b,".txt");
FILE *fp,*fq;
fp=fopen("3.1.txt","r");
fq=fopen(b,"w+");
if(fp==NULL||fq==NULL){
printf("File can not be opened\n");
exit(0);
}else{
printf("File created\n");
}
p=fgetc(fp);
while(p != EOF){
if(fputc(p,fq)==EOF){
printf("fail");
exit(0);
}
p=fgetc(fp);
}
printf("copy ok!");
fclose(fp);
fclose(fq);
return 0;
}
(4)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct a{
char name[10];
int age;
float Mscore;
float Escore;
float Yscore;
}stu;
int main(){
stu b;
//char *p;
FILE *fp;
fp=fopen("student.txt","w+");
if(fp==NULL){
printf("File can not be opened\n");
exit(0);
}
for(int i=1;i<=5;i++){
printf("请输入第%d个学生的信息(姓名 年龄 数学 英语 语文)\n",i);
scanf("%s %d %f %f %f",b.name,&b.age,&b.Mscore,&b.Escore,&b.Yscore);
fprintf(fp,"%s %d %.2f %.2f %.2f",b.name,b.age,b.Mscore,b.Escore,b.Yscore);
fprintf(fp,"\n");
}
fclose(fp);
return 0;
}
(5)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student {
float average; // 平均值
char name[10];
int age;
float Mscore; // 数学成绩
float Escore; // 英语成绩
float Yscore; // 语文成绩
} stu[5];
void selectionSort();
int main() {
FILE *fp = fopen("student.txt", "r");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
int i = 0, j;
while (fscanf(fp, "%9s %d %f %f %f", stu[i].name, &stu[i].age,
&stu[i].Mscore, &stu[i].Escore, &stu[i].Yscore) == 5) {
stu[i].average = (stu[i].Mscore + stu[i].Escore + stu[i].Yscore) / 3;
i++;
if (i >= 5) break; // 确保不会超过数组界限
}
fclose(fp);
selectionSort();
for (int i = 0; i < 5; i++) {
printf("%s %.2f\n", stu[i].name, stu[i].average);
}
return 0;
}
void selectionSort() {
struct Student temp;
int k;
for (int i = 0; i < 4; i++) {
k = i; // 假设当前位置是最小的
for (int j = i + 1; j < 5; j++) {
if (stu[j].average > stu[k].average) {
k = j; // 找到新的最大位置
}
}
if (i != k) {
// 交换当前位置与找到的最大位置
temp = stu[i];
stu[i] = stu[k];
stu[k] = temp;
}
}
}
(6)
#include <stdio.h>
#include <stdlib.h>
typedef struct a{
char name[10];
int pirce;//单价
int num;
float money;//金额
}goods;
int main(){
FILE *fp = fopen("goods.txt", "wb");
int n;
goods a;
printf("请输入要读入的商品个数\n");
scanf("%d",&n);
if(fp==NULL){
printf("File can not be opened\n");
exit(0);
}
for(int i=0;i<n;i++){
printf("按顺序输入 名字 单价 数量 金额\n");
scanf("%s %d %d %f",a.name,&a.pirce,&a.num,&a.money);
fwrite(&a,sizeof(goods),1,fp);
}
// fclose(fp);/*测试输出代码*/
// fp=fopen("goods.txt","rb");
// printf("商品信息\n");
// while(fread(&a,sizeof(goods),1,fp)==1){
// printf("%s %d %d %.2f\n",a.name,a.pirce,a.num,a.money);
// }
fclose(fp);
return 0;
}
(7)
#include<stdio.h>
#include<stdlib.h>
#define N 30
typedef struct a{
char name[10];
int pirce;//单价
int num;
float money;//金额
}goods;
void Sort(goods a[],int n);
int main(){
int i;
FILE *fp=fopen("goods.txt","rb");
goods a[N];
for( i=0;i<N;i++){
if(feof(fp)){
break;
}
fread(&a[i],sizeof(goods),1,fp);
}
Sort(a,i-1);
printf("产品排序如下:\n");
for(int j=0;j<i-1;j++){
printf("%s %d %d %.2f\n",a[j].name,a[j].pirce,a[j].num,a[j].money);
}
}
void Sort(goods a[],int n){
goods temp;
int flag=0;//判断两个金额是否相同
for(int i=0;i<n;i++){
flag=1;
for(int j=i+1;j<n;j++){
if(a[i].money<a[j].money){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
else if(flag&&a[i].pirce<a[j].pirce){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
----------------第一次尝试更新这种,还请大家看到错误多多包涵,谢谢大家,更新完毕!7.17