C语言复习
1、编程在屏幕上输出三行信息,本人所在省市名称、身份证号和姓名。#include<stdio.h>int main() {printf("所在市:湖北黄石\n");printf("姓名:张三\n"); printf("身份证号:420203200004293471\n");return 0;}2、从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。#include<stdio
1 顺序结构
1、编程在屏幕上输出三行信息,本人所在省市名称、身份证号和姓名。
#include<stdio.h>
int main()
{
printf("所在市:湖北黄石\n");
printf("姓名:张三\n");
printf("身份证号:420203200004293471\n");
return 0;
}
2、从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。
#include<stdio.h>
int main()
{
float a,b;
scanf("%f %f",&a ,&b);
printf("两数之和为:%.2f\n",a+b);
printf("两数之差为:%.2f\n",a-b);
printf("两数之积为:%.2f\n",a*b);
return 0;
}
3、编写程序,输入一个三位数的整数,请分离出个位,十位,百位,并逆序输出。
#include <stdio.h>
main()
{
int x , b0, b1, b2;
printf("请输入一个三位数的整数:");
scanf("%d",&x);
b0 = x % 10;
x = x / 10;
b1 = x % 10;
x = x / 10;
b2 = x % 10;
printf("b0=%d, b1=%d, b2=%d\n", b0, b1, b2);
}
4、设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。
#include<stdio.h>
#include<math.h>
int main()
{
int n,capital;
float rate,deposit;
printf("请输入年利率:");
scanf("%f",&rate);
printf("请输入存款期:");
scanf("%d",&n);
printf("请输入本金:");
scanf("%d",&capital);
deposit=capital*pow(1+rate,n);
printf("%d年本利之和:",n);
printf("%.2f\n",deposit);
return 0;
}
5、编写一个程序,求出给定半径r和高h的圆柱体和圆锥体的表面积和体积,并且输出计算结果。r和h的值由用户输入。
#include<stdio.h>
#include<math.h>
int main()
{
//double const PI = acos(double(-1));
double PI = 3.1415926;
double r,h;
scanf("%lf %lf",&r,&h);
printf("圆柱体面积体积为:");
printf("S:%.2f V:%.2f\n",2.0*PI*r*h+2.0*PI*r*r,PI*r*r*h);
printf("圆锥体面积体积为:");
printf("S:%.2f V:%.2f\n",PI*r*sqrt(r*r+h*h)+PI*r*r,PI*r*r*h/3);
return 0;
}
6、由键盘输入1个字母,输出其ASCII码值。
#include<stdio.h>
void main(){
char ch;
scanf("%c",&ch);//输入
printf("%d\n",ch);//转换
}
7、编程从键盘输入一个小写字符,将其转换为大写字符显示并显示出它的十进制,十六进制的ASCII码。
#include<stdio.h>
void main()
{
char ch;
printf("请输入一个小写字母:");
scanf("%c",&ch);//输入
printf("该字母的大写字母为:");
printf("%c\n",ch-32);//转换
printf("该大写字母的十进制ASCII码为:");
printf("%d\n",ch-32);//转换
printf("该大写字母的十六进制ASCII码为:");
printf("%x\n",ch-32);//转换
}
8、已知三角形的三边长,编程求三角形的面积。
解题思路:假设给定的三个边符合构成三角形的条件,求三角形面积的公式为:

#include <stdio.h>
#include <math.h>
int main ( )
{
double a,b,c,s,area; // 定义各变量,均为double型
printf("please input a,b,c:\n"); //提示用户输入
scanf("%lf%lf%lf",&a,&b,&c);
s=(a+b+c)/2; // 计算s
area=sqrt(s*(s-a)*(s-b)*(s-c)); // 计算area
printf("a=%f\tb=%f\t%f\n",a,b,c); // 输出三边a,b,c的值
printf("area=%f\n",area); // 输出面积area的值
return 0;
}
9、已知一元二次方程的三个系数,编程求ax2+bx+c=0方程的根,系数a,b,c的值由键盘输入,假设a,b,c的值,使得 b2-4ac≥0成立。
解题思路:一元二次方程有两个实根:

#include <stdio.h>
#include<math.h>
main()
{
float a,b,c,disc,x1,x2,p,q;
printf("please input a,b,c:\n"); //提示用户输入
scanf("%f,%f,%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;
x2=p-q;
printf("x1=%5.2f\nx2=%5.2f\n",x1,x2);
}
2 选择结构
1、输入一个某年的纪年数(如:1981),输出该年是否闰年。
#include <stdio.h>
void main()
{
int year;
printf("请输入年:");
scanf("%d",&year);
//闰年的判定标准:能被4整除但不能被100整除,或者能被400整除
if(year%4==0 && year%100!=0 || year%400==0)
printf("%d年是闰年\n",year);
else
printf("%d不是闰年!\n",year);
}
2、 给一个不多于5位的正整教,要求输出它是几位数。
#include<stdio.h>
void main()
{
int number;
printf("请输入一个不多于5位的正整教:");
scanf("%d",&number);
//根据取值范围判断一个正整数位数,如3位数取值范围:100-999
if(number>=10000)
printf("%d是五位数\n",number);
else if(number>=1000)
printf("%d是四位数\n",number);
else if(number>=100)
printf("%d是三位数\n",number);
else if(number>=10)
printf("%d是二位数\n",number);
else
printf("%d是一位数\n",number);
}
3、输入一个字符,判断该字符是否为大写英文字母,如果是输出其对应的小写字母。
3、输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出"space";如果不是上述情况,输出"other"。
#include <stdio.h>
void main()
{
char ch;
printf("请输入一个字符:");
scanf("%c",&ch);
//英文字母大小写的判定标准及其转换,大写变小写ch+32
if(ch>='A' && ch<='Z')
printf("是大写英文字母,其小写为:%c\n",ch+32);
else
printf("不是大写英文字母!\n");
}
4、输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第6个小写字母。所谓循环排序,是指a,b,c,……,x,y,z排成一个圆圈,即z后面是a。
解法一:
#include <stdio.h>
void main()
{
char ch;
printf("请输入一个字符:");
scanf("%c",&ch);
//循环+t算法:最后t个字母变换ch+t-26,前面的字母变换ch+t
if(ch>='a' && ch<='z'-6)
printf("是小写英文字母,循环加6为:%c\n",ch+6);
else if(ch>'z'-6 && ch<='z')
printf("是小写英文字母,循环加6为:%c\n",ch-26+6);
else printf("不是小写字母!\n");
}
解法二:
#include<stdio.h>
#include<stdlib.h>
void main()
{
char ch;
printf("请输入一个字符:");
scanf("%c",&ch);
if(ch>='a'&&ch<='z')
printf("该字母为小写字母,循环加6为%c\n",(ch-’a’+6)%26+’a’);
else
printf("该字母不是小写字母\n");
system("pause");
}
5、有一函数:

编写一程序,用嵌套的if语句实现要求输入x的值,输出y的值。
#include<stdio.h>
#include<math.h>
int main()
{
float x;
printf("输入x的值\n");
scanf("%f",&x);
if(x>1)
printf("y=%.2f\n",exp(sqrt(x))-1);
else
{
if(x<-1)
printf("y=%.2f\n",sin(x*x));
else
printf("y=%.2f\n",fabs(x)+2);
}
return 0;
}
6、编写一个C程序,求a、b、c、d四个数中的最大者。
解法一:
void main()
{
int a,b,c,d,max;
printf("请输入四个数字:");
scanf("%d%d%d%d",&a,&b,&c,&d);
max = a;
if(b > max)
max = b;
if(c > max)
max = c;
if(d > max)
max = d;
printf("其中的最大值为:%d",max);
system("pause");
}
解法二:
#include<stdio.h>
void main()
{
int a,b,c,d,t;
printf("请输入四个数字:");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a > b)
{t=a; a=b; b=t;}
if(a > c)
{t=a; a=c; c=t;}
if(a > d)
{t=a; a=d; d=t;}
printf("其中的最小值为:%d",a);
system("pause");
}
解法三:
#include<stdio.h>
void main()
{
int a,b,c,d,t;
printf("请输入四个数字:");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a > b)
{t=a; a=b; b=t;}
if(b > c)
{t=a; a=c; c=t;}
if(c > d)
{t=a; a=d; d=t;}
printf("其中的最大值为:%d",d);
system("pause");
}
7、输入4个整数,要求按由小到大顺序输出。
解法一:
#include<stdio.h>
int main()
{
int a,b,c,d,t;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b) {t=a;a=b;b=t;}
if(a>c) {t=a;a=c;c=t;}
if(a>d) {t=a;a=d;d=t;}
if(b>c) {t=b;b=c;c=t;}
if(b>d) {t=b;b=d;d=t;}
if(c>d) {t=c;c=d;d=t;}
printf("a,b,c,d按照从小到大的顺序排列为:");
printf("%d,%d,%d,%d\n",a,b,c,d);
system("pause");
return 0;
}
解法二:
#include<stdio.h>
int main()
{
int a,b,c,d,t;
printf("请输入四个整数");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b) { t=a; a=b; b=t; }
if(b>c) { t=b; b=c; c=t; }
if(c>d) { t=c; c=d; d=t; }
if(a>b) { t=a; a=b; b=t;}
if(b>c) { t=b; b=c; c=t; }
if(a>b) { t=a; a=b; b=t; }
printf("四个数按从小到大排列为%d,%d,%d,%d",a,b,c,d);
return 0;
}
8、编程序,输入一个百分制的成绩t后,按下式输出它的等级,用switch语句实现。85~100为“A”,80~84 为“B”,70~79为“C”,60~69 为“D”,0~59 为“E”。
#include <stdio.h>
int main()
{
int score;
scanf("%d",&score);
printf("数学课成绩为%d\n",score);
switch(score/10)
{
case 10:
case 9:
case 8: printf("这门课成绩为A等!\n");break;
case 7: printf("这门课成绩为B等!\n");break;
case 6: printf("这门课成绩为C等!\n");break;
default: printf("这门课成绩为D等!\n");
}
return 0;
}
9、给一个不多余5位的正整数,要求如下:
1)求出它是几位数
2)分别输出每一位数字
3)按逆序输出各位数字,例如原数为321,应输出123
解答:
解法一:
#include<stdio.h>
#include<math.h>
void main()
{
long int num;
int a,b,c,d,e,place;
printf("please input a number(0--99999):\n");
scanf("%ld",&num);
if(num>=10000)
place=5;
else if(num>=1000)
place=4;
else if(num>=100)
place=3;
else if(num>=10)
place=2;
else
place=1;
printf("输入数的位数是:%d\n",place);
printf("每位数字为:");
e=num/10000;
d=(int)(num-e*10000)/1000;
c=(int)(num-e*10000-d*1000)/100;
b=(int)(num-e*10000-d*1000-c*100)/10;
a=(int)(num-e*10000-d*1000-c*100-b*10);
if(place == 5)
{
printf("%d,%d,%d,%d,%d",e,d,c,b,a);
printf("\n反序数字为:");
printf("%d,%d,%d,%d,%d\n",a,b,c,d,e);
}
if(place == 4)
{
printf("%d,%d,%d,%d",d,c,b,a);
printf("\n反序数字为:");
printf("%d,%d,%d,%d\n",a,b,c,d);
}
if(place == 3)
{
printf("%d,%d,%d",c,b,a);
printf("\n反序数字为:");
printf("%d,%d,%d\n",a,b,c);
}
if(place == 2)
{
printf("%d,%d",b,a);
printf("\n反序数字为:");
printf("%d,%d\n",a,b);
}
if(place == 1)
{
printf("%d",a);
printf("\n反序数字为:");
printf("%d\n",a);
}
system("pause");
}
解法二:
#include<stdio.h>
int main()
{
int n,y,x1,x2,x3,x4,x5;
printf("请输入一个不多于五位的数");
scanf("%d",&n);
y=n;
x1=y%10;
y=y/10;
x2=y%10;
y=y/10;
x3=y%10;
y=y/10;
x4=y%10;
y=y/10;
x5=y%10;
if(n>9999)
{
printf("为五位数");
printf("个位为%d,十位为%d,百位为%d,千位为%d,万位为%d",x1,x2,x3,x4,x5);
printf("逆序输出为%d%d%d%d%d",x1,x2,x3,x4,x5);
}
else if(n>999)
{
printf("为四位数");
printf("个位为%d,十位为%d,百位为%d,千位为%d",x1,x2,x3,x4);
printf("逆序输出为%d%d%d%d",x1,x2,x3,x4);
}
else if(n>99)
{
printf("为三位数");
printf("个位为%d,十位为%d,百位为%d",x1,x2,x3);
printf("逆序输出为%d%d%d",x1,x2,x3);
}
else if(n>9)
{
printf("为二位数");
printf("个位为%d,十位为%d",x1,x2);
printf("逆序输出为%d%d",x1,x2);
}
else
{
printf("为一位数");
printf("个位为%d",x1);
}
return 0;
}
10、要求对输入的数字1~7转换成文字星期几,对其它数字不转换。例如,输入5时,程序应该输出Friday。
解答:
#include <stdio.h>
int main()
{
int day;
printf("请输入一个数字(0~6)");
scanf("%d",&day);
switch(day)
{case 0:printf("Sunday");break;
case 1:printf("Monday");break;
case 2:printf("Tuesday");break;
case 3:printf("Wednesday");break;
case 4:printf("Thurday");break;
case 5:printf("Friday");break;
case 6:printf("Saturday");break;
default: printf("你输入了错误的数字");
}
system("pause");
return 0;
}
11、用switch语句编写一个简单的四则运算程序。
解答:
#include<stdio.h>
#include<math.h>
int main()
{
double a,b;
char c;
scanf("%lf%c%lf",&a,&c,&b);
switch(c)
{
case '+':printf("%f%c%f=%f",a,c,b,a+b);break;
case '-':printf("%f%c%f=%f",a,c,b,a-b); break;
case '*':printf("%f%c%f=%f",a,c,b,a*b); break;
case '/':
if(b==0)
printf("error\n");
else
printf("%f%c%f=%f",a,c,b,a/b); break;
}
return 0;
}
12、输入某年某月某日,判断这一天是这一年的第几天?要考虑这一年是否是闰年。
解答:
#include<stdio.h>
int main()
{
int a,b,c,d,num=0;
printf("请输入年月日");
scanf("%d%d%d",&a,&b,&c);
if((a%4==0 && a%100!=0) || a%400==0)
{
printf("%d年是闰年\n",a);
d=1;
}
else
printf("该年不是闰年\n");
switch(b-1)
{
case 12:num +=31;
case 11:num+=30;
case 10:num+=31;
case 9:num+=30;
case 8:num+=31;
case 7:num+=31;
case 6:num+=30;
case 5:num+=31;
case 4:num+=30;
case 3:num+=31;
case 2:
if(d==1)
num+=29;
else
num+=28;
case 1:num+=31;
}
printf("这天是今年的%d天",num+c);
return 0;
}
3 循环结构
1、编写程序,求 1!+ 2!+ 3!+ …+N!的值,N的值由键盘输入。
//方法1
#include <stdio.h>
void main()
{
int i,n;
long p=1,sum=0;
printf("Please enter n:");
scanf("%d",&n);
//数列法,第n项等于n乘以第n-1项,第1项等于1
for(i=1;i<=n;i++)
{
p *= i;
sum += p;
printf("%d!=%ld\n",i,p); //分行显示各阶乘的值
}
printf("sum=%ld\n",sum);
}
2、编程序按下列公式计算 e 的值(精度为 1e-6): e=1+1/1!+1/2!+1/3!+…+1/n!
//方法1
#include <stdio.h>
void main()
{
int i;
long p=1;
double sum=1.0;
//数列法,掌握精度作为循环条件
for(i=1;1.0/p>=1e-6;i++)
{
p *= i;
sum += 1.0/p;
}
printf("e=%.2lf\n",sum);
}
3、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,… 。求出这个数列的前20项之和。
#include <stdio.h>
#define N 20
void main()
{
int i;
float sum=0,fz=1,fm=1,t;
//数列的关键是找出各项之间的规律,fz表示分子,fm表示分母
for(i=0;i<N;i++)
{
t=fz;
fz += fm;
fm=t;
sum += fz/fm;
}
printf("sum=%.2f\n",sum);
}
4、编写程序,输入以下9个数-5,13,5,-4,-7,0,83,-66,-10,计算它们的和以及所有正数之和及所有负数之和,并分别打印出来。
#include <stdio.h>
#define N 9
void main()
{
int num,sum=0,zsum=0,fsum=0;
int i;
printf("input number:");
//循环输入与求和
for(i=0;i<N;i++)
{
scanf("%d",&num);
sum += num;
if(num[i]>0)
zsum += num;
else
fsum += num;
}
printf("总和为%d\n正数之和为%d\n负数之和为%d\n",sum,zsum,fsum);
}
5、输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。
#include <stdio.h>
void main()
{
int letter=0,space=0,digit=0,other=0;
char ch;
//字母、数字、空格、其它字符的判定方法
while((ch=getchar())!='\n')
{
if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
letter++;
else if(ch == ' ')
space++;
else if(ch >= '0' && ch <= '9')
digit++;
else other++;
}
printf("字母有%d个,空格有%d个,数字有%d个,其他字符有%d个\n",letter,space,digit,other);
}
6、若一个3 位整数的各位数字的立方之和等于这个整数,称之为“水仙花数”。例如:153 是水仙花数,因为

,求1000以内所有的水仙花数。
#include <stdio.h>
int main()
{
int n,a,b,c;
//掌握水仙花数算法,关键在于提取百位、十位、个位的方法
for(n=100;n<1000;n++)
{
a=n/100; //提取百位
b=n/10%10; //提取十位
c=n%10; //提取个位
if(n==a*a*a+b*b*b+c*c*c)
printf("%d ",n);
}
printf("\n");
}
7、一个数如果恰好等于它的因子之和,这个数就称为完数。 例如,6的因子为1、2、3,而6=1+2+3,因此,6是完数。编程找出1000之内的所有完数。
#include <stdio.h>
void main()
{
int i,n,sum;
//完数等于因子之和,因子包括质数和1
for(n=1;n<=1000;n++)
{
sum=0;
for(i=1;i<n;i++)
if(0 == n%i)
sum += i;
if(sum == n)
printf("%d ",n);
}
printf("\n");
}
8、编写程序,打印以下图形:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include <stdio.h>
void main()
{
int i,j,k;
//利用循环画图,关键是找到空格和星号的变化规律,分上下2段
for(i=0;i<4;i++) //画上4行
{
for(j=3-i;j>0;j--) //画每一行的空格
printf(" ");
for(k=0;k<2*i+1;k++) //画每一行的星号
printf("*");
printf("\n");
}
for(i=0;i<3;i++) //画下3行
{
for(j=0;j<i+1;j++)
printf(" ");
for(k=5-2*i;k>0;k--)
printf("*");
printf("\n");
}
}
9、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
//方法1 递归法
#include <stdio.h>
long fun(int n);
void main()
{
int i;
for(i=1;i<=12;i++)
printf("第%d月:%ld\n",i,fun(i));
}
//兔子问题也称斐波那契数列(Fibonacci sequence),
//其算法是从第3项开始,每一项都等于前两项之和。
long fun(int n)
{
if(n==1 || n==2)
return 2;
else
return fun(n-1)+fun(n-2);
}
//方法2
#include <stdio.h>
void main()
{
int i;
long f1=2,f2=2;
for(i=1;i<=11;i+=2)
{
printf("第%d月:%ld\n",i,f1);
printf("第%d月:%ld\n",i+1,f2);
f1=f1+f2; //当前项是前2项之和
f2=f1+f2; //后一项是当前项和前一项之和
}
}
10、公鸡五元一只,母鸡三元一只,小鸡一元三只,一百元要买一百只鸡,且须包含公鸡、母鸡和小鸡。请编写程序,输出所有可能的方案。
#include <stdio.h>
void main()
{
int x,y,z;
//百钱百鸡,使用穷举法
for(x=1;x<100/5;x++)
for(y=1;y<100/3;y++)
{
z=100-x-y;
if(x*5+y*3+z/3==100)
printf("公鸡:%2d 母鸡:%2d 小鸡:%2d\n",x,y,z);
}
}
4 数组
1、编写程序,使之具有如下功能:输入10个整数,按每行4个数输出这些整数,最后输出10个整数的平均值。
解答:
#include<stdio.h>
#define N 10
main()
{
int a[N],i,j,s=0;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
s=s+a[i];
}
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
if((i+1))%4==0)
{
printf("\n");
}
}
printf("\n平均分:%d\n",s/N);
return 0;
}
2、输入 20 个整数,请使用数组编写程序求其中最大值和次大值。
//方法1,打擂台法
#include <stdio.h>
#define N 20
void main()
{
int i,j,a[N],max1,max2;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
//打擂台法求最大值,大的当擂主
max1=a[0];
for(i=1;i<N;i++)
if(a[i]>max1)
{
max1=a[i];
j=i; //提取擂主的下标
}
for(i=j;i<N-1;i++) //去除擂主
a[i]=a[i+1];
//继续打擂台,求次大值
max2=a[0];
for(i=1;i<N-1;i++)
if(a[i]>max2)
max2=a[i];
printf("最大值为%d,次大值为%d\n",max1,max2);
}
//方法2,打擂台法
#include <stdio.h>
#define N 20
void main()
{
int i,j,a[N],max1,max2;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
//打擂台法,第1大的当擂主1, 第2大的当擂主2
max1=a[0];
max2=a[0];
for(i=1;i<N;i++)
{
if(a[i]>max1)
{
max2= max1;
max1=a[i];
}
else
if(a[i]>max2)
{
max2= a[i];
}
}
printf("最大值为%d,次大值为%d\n",max1,max2);
}
3、下面程序的功能是输入10个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的10个整数。
解答:
#include<stdio.h>
#define N 10
main()
{
int i,a[N],max,min,t;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
max= 0;
min= 0;
for(i=0;i<=N-1;i++)
{
if(a[i]>a[max])
{
max=i;
}
}
printf("最大值:%d,下标:%d\n",a[max],max);
for(i=0,b=0;i<=N-1;i++)
{
if(a[i]<min)
{
min=i;
}
}
printf("最小值:%d,下标:%d\n",a[min],min);
t = a[max]; a[max] = a[min] ; a[min]=t;
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
4、将一个数组中的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。
解法一:
#include<stdio.h>
#define N 5
main()
{
int i,a[N],t;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i=0;i<=N/2;i++)
{
t=a[i];a[i]=a[N-1-i];a[N-1-i]=t;
}
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
解法二:
#include<stdio.h>
#define N 5
main()
{
int i, j,a[N],t;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i=0, j=N-1 ;i<j; i++, j--)
{
t=a[i];a[i]=a[j];a[j]=t;
}
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
5、数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。对查找的结果给出相应的说明,如果找到该数值,则输出“Found”信息,并给出该数是数组中的第几个元素。如果该数值不在数组中,则输出“Not found”信息。
#include<stdio.h>
#define N 10
main()
{
int i,x,t,a[10]={12,24,35,49,57,63,72,84,91,107};
scanf("%d",&x);
for(i=0;i<=N-1;i++)
{
if(x==a[i])
{
t=i;
break;
}
}
if(i<N)
{printf("元素%d的下标:%d\n",x,t);}
else
printf("NOT FOUND\n");
return 0;
}
6、折半查找,有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。
解答:
#include<stdio.h>
#define N 15
main()
{
int high,i,x,low,mid,a[N]={100,98,84,75,64,51,42,33,28,19,17,16,14,9,4};
low=0;
high=N-1;
for(i=0;i<=N-1;i++)
{
printf("%d\t",a[i]);
}
scanf("%d",&x);
if((x<a[N-1])||(x>a[0]))
printf("%d找不到\n",x);
else
{
while(low<=high)
{
mid=(low+high)/2;
if(x==a[mid])
{
printf("%d是第%d个数\n",x,mid+1);
break;
}
else
if(x>a[mid])
high=mid-1;
else
low=mid+1;
}
if(low>high)
printf("%d不在数组内\n",x);
}
return 0;
}
7、编写程序,任意输入10个从小到大的整数的数列,然后输入一个整数插入到数列中,使数列保持从小到大的顺序。
解法一:
#include <stdio.h>
#define N 9
void main()
{
int i,j,t,a[N+1];
for(i=0;i<N;i++) //输入数组
scanf("%d",&a[i]);
printf("Please enter a number:");
scanf("%d", &t);
for(i=0;i<N;i++ ) //查找插入位置i
if(t < a[i])
break;
for(j=N-1;j>=i;j--) //i后面的数后移一位,腾出位置
a[j+1]=a[j];
a[i]=t; //插入数据到i位
for( i=0;i<N+1;i++) //输出数组
printf("%d ",a[i]);
printf("\n");
}
解法二:
#include<stdio.h>
#define N 11
main()
{
int a[N]={1,14,25,36,48,51,62,73,89,97};
int i,x,t;
printf("原排序:");
for(i=0;i<=N-2;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
scanf("%d",&x);
for(i=9;i>=0;i--)
{
if(a[i]>x)
{
a[i+1]=a[i];
}
else
{
break;
}
}
a[i+1]=x;
for(i=0;i<=N-1;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
8、输入十个互不相同的实数并存在数组中,找出最大元素,并删除。
解答:
#include<stdio.h>
#define N 10
main()
{
int a[N],i,t,max;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
max=0;
for(i=0;i<=N-1;i++)
{
if(a[i]>a[max])
{
max=i;
}
}
for(i=max+1;i<=N-1;i++)
{
a[i-1]=a[i];
}
for(i=0;i<=N-2;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
9、以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。
解答:
#define N 1000
int main()
{
int s[N],i,sum=0,a,c=0;
printf("输入成绩:");
for(i=0; i<N; )
{
scanf("%d",&s[i]);
if(s[i]<0)
{ break; }
if(s[i]>100)
{
printf("请重新输入\n");
continue;
}
sum=sum+s[i];
i++;
c++;
}
if(c!=0)
{ a=sum/c;
printf("平均分是%d\n",a);
printf("低于平均分的学生成绩是:\n");
for(i=0;i<c;i++)
{
if(s[i]<a)
{
printf("\t%d",s[i]);}
}
}
else
printf("输入了0个分数\n");
return 0;
}
10、全校学生的年龄在16到30岁之间,请编写程序用来统计各年龄的人数。请用数组元素作为计数器来统计每一年龄的人数。
#include <stdio.h>
#define N 15
void main()
{
int i,age,a[N]={0};
printf("请输入16至30之间的年龄,-1结束!\n");
scanf("%d",&age);
while(age != -1) //-1退出循环
{
a[age-16]++; //16岁用a[0]计数,以此类推,30岁用a[14]计数
scanf("%d",&age);
}
for(i=0;i<15;i++)
{
printf("%d岁:%d ",i+16,a[i]);
if((i+1)%5==0)printf("\n"); //每5个元素换一行
}
}
11、将两个有序的数组合并成一个有序数组。
解答:
#include<stdio.h>
#define N 20
main()
{
int i=0,j=0,k=0,anum=8,bnum=5,c[N+N];
int a[N]={1,5,14,26,48,50,55,60};
int b[N]={4,26,29,37,78};
while(i<anum&&j<bnum)
{
if(a[i]<=b[j])
{
c[k]=a[i];
k++;
i++;
}
else
{
c[k]=b[j];
k++;
j++;
}
}
if(i<anum)
{
c[k]=a[i];
i++;
k++;
}
if(j<bnum)
{
c[k]=b[j];
j++;
k++;
}
for(k=0;k<anum+bnum;k++)
{
printf("%d\t",c[k]);
}
printf("\n");
return 0;
}
12、编程实现交换数组a和数组b中的对应元素。
解答:
#include<stdio.h>
#define N 20
main()
{
int a[N],b[N],*p,*q,m=0,n=0,k,x,t,i;
printf("请输入数组a的元素个数\n");
scanf("%d",&m);
for( i=0; i<m; i++ )
scanf("%d",& a[i]);
printf("请输入数组b的元素个数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",& b[i]);
if(m>=n)
{
for( i=0 ; i<n ; i ++ )
{
t = a[i]; a[i] = b[i]; b[i] = t;
}
for( ; i<m ; i++)
{
b[i]=a[i];
}
}
else
{
for( i=0 ; i<m ; i ++ )
{
t = a[i]; a[i] = b[i]; b[i] = t;
}
for( ; i<n ; i++)
{
a[i] = b[i];
}
}
printf("交换后数组a的元素为:\n");
for( i=0 ; i<n ; i ++ )
{
printf("%d\t",a[i] );
}
printf("\n");
printf("交换后数组b的元素为:\n");
for( i=0 ; i<m ; i ++ )
{
printf("%d\t",b[i] );
}
printf("\n");
return 0;
}
13、用冒泡法对n个整数排序。
解答:
#include<stdio.h>
#define N 6
main()
{
int i,j,t,a[N];
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N;i++)
{
for(j=0;j<N-i;j++)
{
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t; }
}
}
for(i=0;i<N;i++)
{
printf("%d,",a[i]);
}
printf("\n");
return 0;
}
14、用选择法对n个整数排序。
#include<stdio.h>
#define s 100
main()
{
int i,j,k,t,n,a[s];
printf("输入数字个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[k])
k=j;
}
if(k!=i)
{t=a[i];a[i]=a[k];a[k]=t; }
}
printf("\n");
for(i=0;i<n;i++)
{
printf("%d,",a[i]);
}
printf("\n");
return 0;
}
15、有一个3行4列的矩阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。要求矩阵的值从键盘输入。
解答:
#include<stdio.h>
#define m 3
#define n 4
main()
{
int i,j,a[m][n],max,r=0,l=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
max=a[0][0];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>max)
{max=a[i][j];r=i,l=j; }
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
printf("max=%d,行:%d,列:%d\n",max,r+1,l+1);
return 0;
}
16、输出杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
解法一:用一维数组实现
#include<stdio.h>
int main()
{
int a[20];
int i,j;
int n;
scanf("%d",&n);//所需输出的行数
if(n==1)//只有一行,输出即可
printf("1\n");
else
{
a[0]=a[1]=a[2]=1;
printf("1\n1 1\n"); //两行的话直接输出
for(i=3;i<=n;i++)//从第三行开始计算
{
a[i-1]=1;//每行的最后一个数字都是1
for(j=i-2;j>0;j--)//倒着计算出每一行的数值
a[j]=a[j]+a[j-1];
a[0]=1;//每行的第一个数字都是1
for(j=0;j<i;j++)//计算完一行,输出一行。
printf("%-5d",a[j]);
printf("\n");
}
}
return 0;
}
解法二:使用二维数组并利用每个系数等于其肩上两系数之和
#include<stdio.h>
#define N 100
void main()
{
int a[N][N],i,j,n;
printf("请输入打印行数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(i=0;i<n;i++)
{
for(j=1;j<i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
17、输入m*n阶矩阵A和B,编程计算并输出A和B之和。
#include <stdio.h>
#define M 10
#define N 10
void main()
{
int a[M][N],b[M][N],sum[M][N];
int i,j,m,n;
printf("input m<%d,n<%d:",M,N);
scanf("%d%d",&m,&n); //确定行列数
printf("input A:\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]); //二维数组的输入
printf("input B:\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
scanf("%d",&b[i][j]);
sum[i][j]=a[i][j]+b[i][j]; //矩阵加法
}
printf("A+B=\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d\t",sum[i][j]); //二维数组的输出
printf("\n");
}
}
18、定义一个二维数组,存入10个学生的数学、语文、英语、物理、化学5门课程的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩。
#include<stdio.h>
#define M 10
#define N 5
main()
{
int i,j,a[M][N];
float n;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("数学\t语文\t英语\t物理\t化学\t平均分\n");
for(i=0;i<M;i++)
{
n=0;
for(j=0;j<N;j++)
{
printf("%d\t",a[i][j]);
n=n+a[i][j];
}
printf("%f\n",n/N);
}
printf("课程平均分:\n");
for(j=0;j<M;j++)
{
n=0;
for(i=0;i<N;i++)
{
n=n+a[i][j];
}
printf("%.1f\t",n/N);
}
printf("\n");
return 0;
}
5 指针
1、从键盘输入3个数,使用指针方法找到3个数中最大和最小的数并输出。
解答:
(1)源代码:
#include<stdio.h>
#define M 3
main()
{
int a[M],i;
int *max,*min;
for(i=0 ;i<M; i++)
{
scanf("%d",&a[i]);
}
max = &a[0];
min = &a[0];
for(i=0 ;i<M; i++)
{
if(a[i] > *max)
max = &a[i];
if(a[i] < *min)
min = &a[i];
}
printf("max=%d,min=%d\n",*max,*min);
return 0;
}
2、使用指针,输入10个整数,找出最大数和最小数所在的地址,并把二者对调,然后输出调整后的10个整数。
解答:
#include<stdio.h>
#define N 10
main()
{
int i,a[N],*max,*min,t;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
max= &a[0];
min= &a[0];
for(i=0;i<=N-1;i++)
{
if(a[i]>*max)
{
max=&a[i];
}
}
printf("最大值:%d,地址:%d\n",*max,max);
for(i=0,b=0;i<=N-1;i++)
{
if(a[i]<*min)
{
min=&a[i];
}
}
printf("最小值:%d,地址:%d\n",*min,min);
t = *max; *max = *min ; *min=t;
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
3、使用指针编写一个程序,将输入的10个整数逆置后输出。
解答:
#include<stdio.h>
#define N 5
main()
{
int *i, *j,a[N],t;
for(t=0;t<=N-1;t++)
{
scanf("%d",&a[t]);
}
printf("\n");
for( i = &a[0], j = &a[N-1] ;i < j; i++, j--)
{
t=*i; *i=*j; *j=t;
}
for(t=0;t<N;t++)
{
printf("%d\t",a[t]);
}
printf("\n");
return 0;
}
4、编写程序使用指针实现输入输出数组中的全部元素,并求数组的平均值和数组元素之积。
解答:
(1)源代码:
#include<stdio.h>
#define N 5
main()
{
int a[N],c;
int *p;
float b;
b=0;
c=1;
for(p=a; p<a+N; p++)
{
scanf("%d",p);
b=b+(*p);
c=c*(*p);
}
for(p=a;p<a+N;p++)
{
printf("%d\t",*p);
}
printf("\n平均值:%.2f\t积:%d\n",b/N,c);
return 0;
}
5、使用指针编写一个程序,将输入的10个整数按从小到大的顺序排列,并输出结果
解答:
(1)源代码:
#include<stdio.h>
#define N 10
main()
{
int a[N],*p,t,*q,*min;
for( p=a; p < a+N; p++)
{
scanf("%d",p);
}
for(p=a; p < a + N-1; p++)
{
min = p;
for(q = p+1; q < a+N; q++)
{
if( *q < *min)
min=q;
}
t=*p; *p=*min; *min=t;
}
for(p=a; p < a+N; p++)
{
printf("%d\t",*p);
}
printf("\n");
return 0;
}
6、将两个有序的数组合并成一个有序数组。
解答:
#include<stdio.h>
#define N 20
main()
{
int anum=8,bnum=5,c[N+N];
int a[N]={1,5,14,26,48,50,55,60};
int b[N]={4,26,29,37,78};
int *pi=a, *pj=b,*pk=c,
while( pi<a+anum && pj< b+bnum)
{
if( *pi < *pj )
{
*pk =*pi;
pk++;
pi++;
}
else
{
*pk = *pj;
pk++;
pj++;
}
}
while( pi<a+anum)
{
*pk =*pi;
pi++;
pk++;
}
while( pj<b+bnum)
{
*pk =*pj;
pj++;
pk++;
}
for( k=c; k<c+anum+bnum; k++)
{
printf("%d\t",*k);
}
printf("\n");
return 0;
}
7、编程实现交换数组a和数组b中的对应元素。
解答:
#include<stdio.h>
#define N 20
main()
{
int a[N],b[N],*p,*q,m=0,n=0,k,x,t,i;
printf("请输入数组a的元素个数\n");
scanf("%d",&m);
for( i=0; i<m; i++ )
scanf("%d",& a[i]);
printf("请输入数组b的元素个数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",& b[i]);
f(m>=n)
{
for(p=a ,q=b ; q<b+n ; p ++ ,q++)
{
t = *p; *p = *q; *q = t;
}
for( ; p<a+m ; p++, q++)
{
*q=*p;
}
}
else
{
for(p=a ,q=b ; p<a+m ; p ++ ,q++)
{
t = *p; *p = *q; *q = t;
}
for( ; q<b+n ; p++, q++)
{
*p=*q;
}
}
printf("交换后数组a的元素为:\n");
for( i=0 ; i<n ; i ++ )
{
printf("%d\t",a[i] );
}
printf("\n");
printf("交换后数组b的元素为:\n");
for( i=0 ; i<m ; i ++ )
{
printf("%d\t",b[i] );
}
printf("\n");
return 0;
}
8、利用指向行的指针变量求3 * 5数组各行元素之和
方法一:
#include<stdio.h>
#define N 3
#define M 5
void main()
{
int a[N][M];
int (*p)[M];
int i,j,sum;
printf("input number:");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
}
p=a;
for(i=0;i<N;i++)
{
sum=0;
for(j=0;j<M;j++)
{
sum+=p[i][j] );
}
printf("第%d行和为:%d\n",i,sum);
}
}
方法二:
#include<stdio.h>
#define N 3
#define M 5
void main()
{
int a[N][M];
int (*p)[M];
int i,j,sum;
printf("input number:");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<N;i++)
{
p=&a[i];
sum=0;
for(j=0;j<M;j++)
{
sum+=*(*p+j);
}
printf("第%d行和为:%d\n",i,sum);
}
}
方法三:
#include<stdio.h>
#define N 3
#define M 5
int main()
{
int a[N][M];
int (*p)[M];
int *q;
int i,j,sum;
printf("input number:");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<N;i++)
{
p = a[i];
sum=0;
for(q = p; q < p+1;q++)
{
sum+=*(q);
}
printf("第%d行和为:%d\n",i+1,sum);
}
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
return 0;
}
6 函数
1、请编写函数fun,它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。
#include<stdio.h>
float fun(int n)
{
int i;
float s=0;
for(i=1;i<=n;i++)
{
if((i%5==0)||(i%9==0))
s=s+1/(float)i;
}
return s;
}
main()
{
int x;
scanf("%d",&x);
printf("%f\n",fun(x));
return 0;
}
2、请编写阶乘函数Fact,利用它计算并输出1!+2!+3!+……+n!的值。
#include<stdio.h>
int fact(int x);
void main()
{
int sum=0,n;
int i;
printf("input number:");
scanf("%d",&n);
sum=fact(n);
printf("sum=%d\n",sum);
}
int fact(int x)
{
int i,m=1,t=0;
for(i=1;i<=x;i++)
{
m *= i;
t += m;
}
return t;
}
3、请编写函数fun,其功能是:计算并输出下列多项式值:例如,若主函数从键盘给n输入50后,则输出为S=1.960784。s=1+1/(1+2)+1/(1+2+3)+ ...+1/(1+2+3+...+50)
#include<stdio.h>
float fun(int x)
{
float i,a=0,b=0;
for(i=1;i<=x;i++)
{
a+=i;
b+=1/a;
}
return(b);
}
main()
{
int m;
scanf("%d",&m);
printf("%f\n",fun(m));
return 0;
}
4、编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n。p=m!/n!(m-n)!。例如:m=12,n=8时,运行结果为495.000000。
#include <stdio.h>
float fun(int x);
void main()
{
int m,n;
float p;
do{
printf("input m,n:");
scanf("%d%d",&m,&n);
}while(m<n);
p=fun(m,n);
printf("p=%f\n",p);
}
int fun(int m,int n)
{
int p;
p=fact(m)/( fact (n)* fact (m-n));
return p;
}
float fact(int x)
{
int i;
float term=1;
for(i=1;i<=x;i++)
{
term*=i;
}
return term;
}
5、请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。例如,当a=45,b=12,调用该函数后c=2415。
#include<stdio.h>
#define N 4
int fun(int x,int y);
void main()
{
int a,b,c;
printf("input a,b:");
scanf("%d%d",&a,&b);
c=fun(a,b);
printf("c=%d\n",c);
}
int fun(int x,int y)
{
int a[N],c;
a[0]=x/10;
a[1]=y/10;
a[2]=x%10;
a[3]=y%10;
c=a[3]*1000+a[0]*100+a[1]*10+a[2];
return c;
}
6、编写函数fun(int m, int *k, int xx[]),其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k返回。
#include<stdio.h>
#define N 20
void fun(int m, int *k, int xx[]);
void main()
{
int m,n=0,xx[N];
printf("input m:");
scanf("%d",&m);
fun(m,&n,xx);
printf("非素数个数为%d\n",n);
}
void fun(int m, int *k, int xx[])
{
int i,j;
for(i=3;i<=m;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
{
xx[*k]=i;
(*k)++;
break;
}
}
}
}
7、请编写函数fun (int *a, int *n),它的功能是: 求出 1 到 1000 之间能被 7 或11整除、但不能同时被 7 和 11 整除的所有整数并将它们放在a所指的数组中,通过 n 返回这些数的个数。
#include<stdio.h>
#define N 1000
void fun(int *a,int *n);
void main()
{
int a[N],n=0;
fun(a,&n);
printf("符合条件的数有:");
for(i=0;i<N;i++)
printff("%d,",a[i]);
printf("\n");
printf("共有%d个\n",n);
}
void fun(int *a,int *n)
{
int i,k=0;
for(i=1;i<=N;i++)
{
if(i%7==0 && i%11!=0 || i%7!=0 && i%11==0)
{
a[k]=i;
k++;
}
}
*n=k;
}
8、使用指针编写一个程序,将输入的整数逆序排列后输出
#include<stdio.h>
#define N 20
void fun(int *p,int n);
void main()
{
int a[N];
int i,n;
printf("input n:");
scanf("%d",&n);
printf("input number:");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
fun(a,n);
printf("逆序排列后为:");
for(i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}
void fun(int *p,int n)
{
int i,j,t;
for(i=0,j=n-1;i<j;i++,j--)
{
t=p[i];p[i]=p[j]; p[j]=t;
}
}
9、使用指针编写一个程序,将输入的10个整数按从小到大的顺序排列,并输出结果
#include<stdio.h>
#define N 10
void sort(int *p,int n);
void swap(int *p1,int *p2);
void main()
{
int a[N];
int i;
printf("input number:");
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
sort(a,N);
printf("排序后为:");
for(i=0;i<N;i++)
{
printf("%d,",a[i]);
}
printf("\n");
}
void sort(int *p,int n)
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(p[j]>p[j+1])
{
swap(&p[j],&p[j+1]);
}
}
}
}
void swap(int *p1,int *p2)
{
int t;
t=*p1; *p1=*p2; *p2=t;
}
10、输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数实现程序:1.输入10个数。2.进行处理。3.输出10个数。所有函数的参数均使用指针
#include<stdio.h>
#define N 10
void swap(int *a,int *b);
void getmaxmin(int *p,int n);
void input(int *p,int n);
void output(int *p,int n);
void main()
{
int a[N];
input(a,10);
getmaxmin(a,10);
output(a,10);
}
void getmaxmin(int a[],int n)
{
int i,max=0,min=0;
for(i=0;i<n;i++)
{
if(a[i]>a[max])
{
max=i;
}
}
swap(&a[max],&a[0]);
for(i=0;i<n;i++)
{
if(a[i]<a[min])
{
min=i;
}
}
swap(&a[min],&a[n-1]);
}
void swap(int *a,int *b)
{
int p;
p=*a; *a=*b; *b=p;
}
void input(int *p,int n)
{
int i;
printf("input number:\n");
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
}
void output(int *p,int n)
{
int i;
printf("output number:\n");
for(i=0;i<n;i++)
{
printf("%d,",p[i]);
}
printf("\n");
}
11、编写一个函数,使用指针交换数组a和数组b中的对应元素
#include<stdio.h>
#define N 20
void swap(int *a, int *b);
void main()
{
int i,n=0,m=0,x;
int a[N],b[N];
printf("请输入数组a,以-1结束:\n");
scanf("%d",&x);
while( x!=-1)
{ a[n++]=x;
scanf("%d",&x);
}
printf("请输入数组b,以-1结束:\n");
scanf("%d",&x);
while( x!=-1)
{ b[m++]=x;
scanf("%d",&x);
}
for(i=0; i<n || i<m; i++)
{
swap(&a[i], &b[i]);
}
printf("数组a中所有元素:\n");
for(i=0; i<m; i++)
{
printf("%d,",a[i]);
}
printf("\n");
printf("数组b中所有元素:\n");
for(i=0; i<n; i++)
{
printf("%d,",b[i]);
}
printf("\n");
}
void swap(int *a, int *b)
{
int t;
t=*a; *a=*b; *b=t;
}
12、设有一个数列包含10个数,已经按升序排好。现要求编写一程序,它能够从指定位置开始的n个数按逆序,重新排列并输出新的完整数列。进行逆序处理时要求使用指针方法(例如原数列为2,4,6,8,10,12,14,16,18,20,若要求从第4个数开始的5个数按逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20)
方法一:
#include<stdio.h>
#define N 10
int fun(int *p,int n,int m);
void swap(int *a,int *b);
void main()
{
int i,n,m;
int a[N];
printf("输入数组元素:\n");
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
printf("请输入开始位置:");
scanf("%d",&n);
printf("请逆序处理的元素个数:");
scanf("%d",&m);
if( fun(a,n,m) )
printf("输出处理后的数组元素:\n");
else
printf("数组元素:\n");
for(i=0; i<N; i++)
{
printf("%d,", a[i]);
}
printf("\n");
}
int fun(int *p,int n,int m)
{
int i,j,t;
if(n<1||n>N)
{
printf("开始位置参数n不合法\n");
return 0;
}
if( m<1 || m>N || n+m > 11)
{
printf("逆序处理的元素个数参数m不合法\n");
return 0;
}
for(i=n-1,j=n+m-2;i<j;i++,j--)
{
swap(&p[i],&p[j]);
}
return 1;
}
void swap(int *a,int *b)
{
int p;
p=*a; *a=*b; *b=p;
}
方法二:
#include <stdio.h>
#define N 10
void method(int *a,int n,int m);
void swap(int *a,int *b);
int main()
{
int a[N]={2,4,6,8,10,12,14,16,18,20},i;
int m,n;
printf("请输入开始位置:");
scanf("%d",&n);
printf("请逆序处理的元素个数:");
scanf("%d",&m);
method(a,n,m);
for( i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
void method(int *a,int n,int m)
{ int *p,*q;
if(n<1||n>N)
{
printf("开始位置参数n不合法\n");
return ;
}
if( m<1 || m>N || n+m > 11)
{
printf("逆序处理的元素个数参数m不合法\n");
return ;
}
p=a+n-1;
q=a+n+m-2;
for( ;p<q; p++,q-- )
{
swap(p,q);
}
}
void swap(int *a,int *b)
{
int p;
p=*a; *a=*b; *b=p;
}
13、请编写函数fun,将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。例如,若二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应是:33 33 33 33 44 44 44 44 55 55 55 55
#include <stdio.h>
#define M 3
#define N 4
void fun(int x[][N],int *y,int m,int n )
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
y[i*n+j] = x[i][j];
}
}
}
void main()
{
int a[M][N] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;
int b[M+N] = {0} ;
printf("The matrix:\n") ;
for(i = 0 ; i < M ; i++)
{
for(j = 0 ; j < N ; j++)
printf("%6d",a[i][j]) ;
printf("\n") ;
}
fun(a,b,M,N) ;
printf("The array:\n") ;
for(i=0;i<M+N;i++)
{
printf("%d ",b[i]);
}
printf("\n") ;
}
14、编写函数fun,它的功能是:先从键盘上输入一个3行、5列的矩阵的各个元素的值,然后输出所有元素之和。
#include<stdio.h>
#define M 3
#define N 5
void fun(int a[][N]);
void main()
{
int a[M][N];
fun(a);
}
void fun(int a[][N])
{
int i,j;
int sum=0;
printf("input number:");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&a[i][j]);
sum+=a[i][j];
}
}
printf("sum=%d\n",sum);
}
15、编写一个函数(参数用指针)将一个3 * 3的矩阵转置
#include<stdio.h>
#define M 3
void move(int *pointer);
int main()
{
int a[M][M];
int *p,i,j;
printf("input matrix:\n");
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
}
printf("Before transposition matrix:\n");
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
p=&a[0][0];
move(p);
printf("Now,matrix:\n");
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
return 0;
}
void move(int *pointer)
{
int i,j,t;
for(i=0;i<M;i++)
{
for(j=i;j<M;j++)
{
t=*(pointer+M*i+j);
*(pointer+M*i+j)=*(pointer+M*j+i);
*(pointer+M*j+i)=t;
}
}
}
7 字符串
1、编写一个函数,求字符串的长度
#include<stdio.h>
#define N 20
int mystrlen(char ch[]);
void main()
{
char ch[N];
printf("请输入字符串:\n");
gets(ch);
printf("长度为:%d\n",mystrlen(ch));
}
int mystrlen(char ch[])
{
int i;
for(i=0;ch[i]!='\0';i++);
return i;
}
2、若字符串中包含数字与字符,编写一个函数删除数字后输出剩下的字符
方法一:
#include<stdio.h>
#define N 100
void fun(char ch[],char t[]);
void main()
{
char ch[N],t[N];
printf("请输入字符串:");
gets(ch);
fun(ch,t);
puts(t);
}
void fun(char ch[],char t[])
{
int i,j;
for(i=0,j=0;ch[i]!='\0';i++)
{
if(ch[i]<'0' || ch[i]>'9')
{
t[j]=ch[i];
j++;
}
}
t[j]='\0';
}
方法二:
#include<stdio.h>
#define N 100
int fun(char a[]);
void main()
{
char ch[N];
printf("请输入字符串:");
gets(ch);
printf("共删除了%d个数字\n",fun(ch));
printf("删除数字后字符串:");
puts(ch);
}
int fun(char a[])
{
int m=0;
char *q=a;
char *p=a;
do
{
if(*p>='0'&&*p<='9')
{
m++;
}
else
{
*q=*p;
q++;
}
p++;
}while(*p !='\0');
*q='\0';
return m;
}
3、不使用库函数将字符串转换为数字,例如字符串“1234”转换为1234
#include<stdio.h>
#define N 5
int fun(char ch[]);
void main()
{
char ch[N];
printf("请输入字符串:");
gets(ch);
printf("%d\n",fun(ch));
}
int fun(char ch[])
{
int i,x=0;
for(i=0;ch[i]!='\0';i++)
{
if(ch[i]<='0' || ch[i]>='9')
{
continue;
}
else
{
x=x*10+ch[i]-'0';
}
}
return x;
}
4、编写一个函数revstr(char *string),将函数字符串中的字符反转输出
#include<stdio.h>
char* revers(char s[] ) ;
int main()
{
char s[81],*p,*q,ch;
printf("Input a string:\n");
gets(s);
printf("s=%s\n", revers(s));
return 0;
}
char* revers(char s[] )
{
char *p,*q,ch;
for(q = s; *q; q++);
q--;
p = s;
while (p < q)
{
ch = *p; *p = *q; *q = ch;
p++;
q--;
}
return (s);
}
5、将字符串赋给一个字符数组,然后从第一个字母开始间隔地输出字符串,用指针实现该程序
#include<stdio.h>
#define N 50
void fun(char *p);
void main()
{
char a[N];
printf("请输入字符串:");
gets(a);
fun(a);
}
void fun(char *p)
{
int n=0;
while((*p)!='\0')
{
printf("%c",*p);
if( *(p+1)=='\0')
break;
p=p+2;
}
printf("\n");
}
6、使用指针编写函数atoi,将字符串s转化为整型数返回,注意负数处理方法。
#include<stdio.h>
#define N 20
int atoi(char *p);
void main()
{
char ch[N];
printf("请输入字符串:");
gets(ch);
printf("%d\n",atoi(ch));
}
int atoi(char *p)
{
int i=0,x=0;
if(p[i]=='-' || p[i]=='+')
{
i++;
}
for( ;p[i]!='\0';i++)
{
if(p[i]<='9' && p[i]>='0')
{
x=x*10+p[i]-'0';
}
}
if(p[0]=='-')
{
x=-x;
}
return x;
}
7、输入一个字符串,在每个字符之间插入一个空格并输出,如原来的字符串为“abcd”,新产生的字符串为“a b c d”
#include<stdio.h>
#include<string.h>
void Insert(char *p)
{
int i;
/*结束为止应该在1位置,下标从0开始*/
for (i = strlen(p); i > 0; --i)
{
*(p + 2 * i) = *(p + i);
*(p + 2 * i - 1) = ' ';
}
}
int main()
{
char s[100];
printf("Please input s:");
gets(s);
Insert(s);
printf("the new string:%s", s);
return 0;
}
8、使用指针编写函数itoa,将整型数转化为字符串s返回
#include<stdio.h>
#define N 20
void fun(int num,char *p);
void main()
{
int num;
char ch[N];
printf("input number:");
scanf("%d",&num);
fun(num,ch);
puts(ch);
}
void fun(int num,char *p)
{
int i,j,sign;
char temp;
if( (sign=num) < 0 ) //记录符号
num=-num; //使num成为正数
for(i=0;num!=0;i++)
{
p[i]=num%10+'0';
num=num/10;
}
if(sign<0)
p[i++]='-';
p[i]='\0';
for(j=0,i=i-1;i>=j;i--,j++)
{
temp=p[i]; p[i]=p[j]; p[j]=temp;
}
}
9、不使用库函数将数字转换为字符串,例如数字1234转换为“1234”。
#include<stdio.h>
#define N 10
void fun(int p,char ch[]);
void main()
{
int num;
char ch[N];
printf("input number:");
scanf("%d",&num);
fun(num,ch);
puts(ch);
}
void fun(int p,char ch[])
{
int i,j;
char t;
for(i=0;p!=0;i++)
{
ch[i]=p%10+'0';
p=p/10;
}
ch[i]='\0';
for(j=0,i=i-1; j<i ; j++, i--)
{
t=ch[j]; ch[j]=ch[i]; ch[i]=t;
}
}
10、请编写函数fun ( char *p )的功能是:在p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH。
#include<stdio.h>
#define N 20
void fun(char *p);
void main()
{
char ch[N];
printf("请输入字符串:");
gets(ch);
fun(ch);
printf("调用后字符串中的内容为:");
puts(ch);
}
void fun(char *p)
{
int max; char t;
int i,k;
max=0;
for(i=1;p[i]!='\0';i++)
{
if(p[i]>p[max])
{
max=i;
}
}
for(k=max;k>0;k--)
{
t=p[k]; p[k]=p[k-1]; p[k-1]=t;
}
}
11、实现一个字符串大小比较函数,若有两个字符串s1和s2,s1与s2相等返回0,s1>s2返回1,s1<s2返回-1
#include<stdio.h>
#define N 20
int mystrcmp(char ch1[],char ch2[]);
void main()
{
char ch1[N],ch2[N];
printf("请输入两个字符串:\n");
gets(ch1);
gets(ch2);
printf("返回值为:%d\n",mystrcmp(ch1,ch2));
}
int mystrcmp(char ch1[],char ch2[])
{
int i=0,j=0,k=0;
do
{ k=ch1[i++]-ch2[j++];
}while ( k==0 && (str1[i]!='\0' || str2[j]!='\0') );
return k;
}
12、编写一个程序将两个字符串连接起来并输出结果
#include<stdio.h>
#define N 20
char * mystrcat(char ch1[],char ch2[]);
void main()
{
char ch1[N],ch2[N];
printf("请输入字符串:\n");
gets(ch1);
gets(ch2);
printf("连接后为:%s\n", mystrcat(ch1,ch2));
}
char * mystrcat(char ch1[],char ch2[])
{
int i,j;
for(i=0;ch1[i]!='\0';i++);
for(j=0;ch2[j]!='\0';j++,i++)
{
ch1[i]=ch2[j];
}
ch1[i]='\0';
return ch1;
}
13、请编写一个函数void fun(char *tt,int pp[]),统计在字符串中'a'到'z'26个字母各自出现的次数,并依次放在pp所指数组中。例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.
#include<stdio.h>
#define N 100
void fun(char *tt,int pp[]);
void main()
{
char a[N];
int pp[26]={0},i=0;
printf("请输入字符串:");
gets(a);
fun(a,pp);
printf("'a'到'z'26个字母各自出现的次数:\n");
for(i=0;i<26;i++)
{
printf("%3d",pp[i]);
}
printf("\n");
}
void fun(char *tt,int pp[])
{ char c;
while(*tt)
{
c=*tt;
pp[c-'a']++;
tt++;
}
}
14、编写程序,移动字符串中的内容,移动的规则如下:把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后,字符串中的内容应该是DEFGHIJKABC。
方法一:
#include<stdio.h>
#define N 100
void fun(char ch[],int m);
void main()
{
char ch[N];
int m;
printf("请输入字符串:");
gets(ch);
printf("请输入m:");
scanf("%d",&m);
fun(ch,m);
puts(ch);
}
void fun(char ch[],int m)
{
char ch1[N],ch2[N];
int i,j=0;
for(i=0;i<m;i++)
{
ch1[i]=ch[i];
}
ch1[i]='\0';
for(i=m;ch[i]!='\0';i++)
{
ch[i-m]=ch[i];
}
for(j=0;ch1[j]!='\0';j++,i++)
{
ch[i-m]=ch1[j];
}
ch[i]='\0';
}
方法二:
#include<stdio.h>
#include<string.h>
#define N 100
void fun (char * ptr,int m);
void main()
{
char ch[N];
int m;
printf("请输入字符串:");
gets(ch);
printf("请输入m:");
scanf("%d",&m);
fun(ch,m);
puts(ch);
}
void fun (char * ptr,int m)
{
int lenth=strlen(ptr)-1;
int i;
int j;
//将第1个到第m字符与最后交换
for(i=0,j=lenth;i<m;i++)
{
char tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
j--;
}
//反转lenth-m+1到lenth的部分
for(i=lenth-m+1,j=lenth;i < j;i++,j--)
{
char tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
//反转0到lenth-m的部分
for(i=0,j=lenth-m; i < j;i++,j--)
{
char tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
//反转0到lenth-m-m的部分
for(i=0,j=lenth-m-m;i < j;i++,j--)
{
char tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
}
15、有一个字符串包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成另一个字符串并输出
#include<stdio.h>
#include<string.h>
#define N 50
void mystrcpy(char *p1,char *p2,int m);
void main()
{
int n,m;
char str1[N],str2[N];
printf("输入第一个字符串:");
gets(str1);
printf("输入m的值:");
scanf("%d",&m);
n=strlen(str1);
if(n<m)
{
printf("错误");
}
else
{
mystrcpy(str1,str2,m);
puts(str2);
}
}
void mystrcpy(char *p1,char *p2,int m)
{
int n;
n=0;
while( p1 && (n<m-1) )
{
n++;
p1++;
}
while(*p1!='\0')
{
*p2=*p1;
p1++;
p2++;
}
*p2='\0';
}
16、设计函数char *insert(s1, s2, n),用指针实现在字符串s1中的指定位置n处插入字符串s2,s1字符串有足够的空间存放s2字符串。
#include <stdio.h>
#include <string.h>
#define N 50
char * insert(char s1[],char s2[],int n);
void main()
{
int n;
char ch1[N+N],ch2[N];
printf("请输入字符串:");
gets(ch1);
printf("请输入插入字符串:");
gets(ch2);
printf("请输入插入位置:");
scanf("%d",&n);
printf("输出字符串为:");
puts(insert(ch1,ch2,n));
}
char * insert(char s1[],char s2[],int n)
{
int i,j,n1,n2;
n1=strlen(s1);
n2=strlen(s2);
if( n<1||n>n1+1)
{
printf("插入位置不合法\n:");
return NULL;
}
for(i=n1;i>=n-1;--i)
{
s1[i+n2]=s1[i];
}
n--;
for(i=0;i<n2;++i)
{
s1[n++]=s2[i];
}
return s1;
}
17、编写函数fun(char *s, int *t),其功能是:统计形参s所指字符串中数字字符出现的次数,并存放在形参t所指的变量中,最后在主函数中输出。例如,形参s所指的字符串为:abcdef35adgh3kjsdf7。输出结果为:4。
#include<stdio.h>
#define N 20
void fun(char *s,int *t);
void main()
{
char s[N];
int t=0;
printf("请输入字符串:");
gets(s);
fun(s,&t);
printf("数字有:%d个\n",t);
}
void fun(char *s,int *t)
{
int i;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>=48 && s[i]<=57)
{
(*t)++;
}
}
return ;
}
18、使用指针编写一个程序,输入星期,输出该星期的英文名,用指针数组处理
#include"stdio.h"
#define N 7
void main()
{
int d;
char p[N]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
printf("input day:");
scanf("%d",&d);
if(d>=1 && d<=7)
{
printf("%s\n",p[d-1]);
}
else
{
printf("Illegal day\n");
}
}
19、使用指针编写一个程序,将输入的3个字符串按从小到大的顺序排列,并输出结果
#include<stdio.h>
#include<string.h>
#define N 3
#define M 20
void swap(char *p1,char *p2);
void main()
{
char ch[N][M];
int i,j;
printf("请输入%d个字符串:",N);
for(i=0;i<N;i++)
{
gets(ch[i]);
}
for(i=0;i<N-1;i++)
{
for(j=0;j<N-1-i;j++)
{
if(strcmp(ch[j],ch[j+1])>0)
{
swap(ch[j],ch[j+1]);
}
}
}
printf("排序后为:\n");
for(i=0;i<N;i++)
{
puts(ch[i]);
}
}
void swap(char *p1,char *p2)
{
char t[M];
strcpy(t,p1); strcpy(p1,p2); strcpy(p2,t);
}
8 结构体、共用体、枚举
1、定义一个结构类型变量(包括年、月、日),实现输入一个日期显示它是该年第几天。
#include<stdio.h>
typedef struct date
{
int year;
int month;
int day;
}DATE;
void main()
{
DATE today;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i,sum=0;
printf("请输入日期:");
scanf("%d%d%d",&today.year,&today.month,&today.day);
if(today.year%4==0 && today.year%100!=0 || today.year%400==0)
{
m[2]=29;
}
for(i=1;i<today.month;i++)
{
sum+=m[i];
}
sum+=today.day;
printf("它是%d年的第%d天\n",today.year,sum);
}
2、定义一个结构类型数组(包括年、月、日),实现输入十个日期,按日期从大到小排序输出。
#include<stdio.h>
#define N 10
typedef struct date
{
int year;
int month;
int day;
}DATE;
void temp(DATE *p1,DATE *p2);
void main()
{
DATE today[N];
int i,j;
for(i=0;i<N;i++)
{
printf("请输入日期:");
scanf("%d%d%d",&today[i].year,&today[i].month,&today[i].day);
}
for(i=0;i<N;i++)
{
for(j=0;j<N-1-i;j++)
{
if(today[j].day<today[j+1].day)
{
temp(&today[j],&today[j+1]);
}
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N-1-i;j++)
{
if(today[j].month<today[j+1].month)
{
temp(&today[j],&today[j+1]);
}
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N-1-i;j++)
{
if(today[j].year<today[j+1].year)
{
temp(&today[j],&today[j+1]);
}
}
}
for(i=0;i<N;i++)
{
printf("%d年%d月%d日\n",today[i].year,
today[i].month,today[i].day);
}
}
void temp(DATE *p1,DATE *p2)
{
DATE t;
t=*p1; *p1=*p2; *p2=t;
}
3、编写程序,用结构体类型实现复数的加、减、乘、除运算,每种运算用函数完成。
方法一:
#include<stdio.h>
typedef struct complex
{
float real;
float imag;
}COMPLEX;
void add(COMPLEX *str,COMPLEX str1,COMPLEX str2);
void sub(COMPLEX *str,COMPLEX str1,COMPLEX str2);
void mul(COMPLEX *str,COMPLEX str1,COMPLEX str2);
void div(COMPLEX *str,COMPLEX str1,COMPLEX str2);
void main()
{
COMPLEX str,str1,str2;
char ch;
printf("请输入复数的实部,虚部及运算:");
scanf("%f%f %c%f%f",&str1.real,&str1.imag,&ch,&str2.real,&str2.imag);
switch(ch)
{
case '+':
add(&str,str1,str2);
break;
case '-':
sub(&str,str1,str2);
break;
case '*':
mul(&str,str1,str2);
break;
case '/':
div(&str,str1,str2);
break;
default:
printf("无效运算符\n");
break;
}
if(str.imag>0)
{
printf("%0.1f+%0.1fi\n",str.real,str.imag);
}
else
{
printf("%0.1f%0.1fi\n",str.real,str.imag);
}
}
void add(COMPLEX *str,COMPLEX str1,COMPLEX str2)
{
str->real=str1.real+str2.real;
str->imag=str1.imag+str2.imag;
}
void sub(COMPLEX *str,COMPLEX str1,COMPLEX str2)
{
str->real=str1.real-str2.real;
str->imag=str1.imag-str2.imag;
}
void mul(COMPLEX *str,COMPLEX str1,COMPLEX str2)
{
str->real=str1.real*str2.real-str1.imag*str2.imag;
str->imag=str1.real*str2.imag+str1.imag*str2.real;
}
void div(COMPLEX *str,COMPLEX str1,COMPLEX str2)
{
str->real=(str1.real*str2.real+str1.imag*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);
str->imag=(str1.imag*str2.real-str1.real*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);
}
方法二:
#include<stdio.h>
typedef struct complex
{
float real;
float imag;
}COMPLEX;
COMPLEX add(COMPLEX str1,COMPLEX str2);
COMPLEX sub(COMPLEX str1,COMPLEX str2);
COMPLEX mul(COMPLEX str1,COMPLEX str2);
COMPLEX div(COMPLEX str1,COMPLEX str2);
void main()
{
COMPLEX str,str1,str2;
char ch;
printf("请输入复数的实部,虚部及运算:");
scanf("%f%f %c%f%f",&str1.real,&str1.imag,&ch,&str2.real,&str2.imag);
switch(ch)
{
case '+':
str=add(str1,str2);
break;
case '-':
str=sub(str1,str2);
break;
case '*':
str=mul(str1,str2);
break;
case '/':
str=div(str1,str2);
break;
default:
printf("无效运算符\n");
break;
}
if(str.imag>0)
{
printf("%0.1f+%0.1fi\n",str.real,str.imag);
}
else
{
printf("%0.1f%0.1fi\n",str.real,str.imag);
}
}
COMPLEX add(COMPLEX str1,COMPLEX str2)
{ COMPLEX str;
str.real=str1.real+str2.real;
str.imag=str1.imag+str2.imag;
return str;
}
COMPLEX sub(COMPLEX str1,COMPLEX str2)
{ COMPLEX str;
str.real=str1.real-str2.real;
str.imag=str1.imag-str2.imag;
return str;
}
COMPLEX mul(COMPLEX str1,COMPLEX str2)
{ COMPLEX str;
str.real=str1.real*str2.real-str1.imag*str2.imag;
str.imag=str1.real*str2.imag+str1.imag*str2.real;
return str;
}
COMPLEX div(COMPLEX str1,COMPLEX str2)
{ COMPLEX str;
str.real=(str1.real*str2.real+str1.imag*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);
str.imag=(str1.imag*str2.real-str1.real*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);
return str;
}
4、定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:
struct date
{ int month;
int day;
int year;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
1)定义输入单个学生信息的函数Input(struct stu *a) ;
2)定义输出单个学生信息的函数Output(struct stu a) ;
3)定义输入一批学生信息的函数Inputarray(struct stu a[ ],int n);
4)定义输出一批学生信息的函数Outputarray(struct stu a[ ],int n));
5)请编写按姓名进行查找的函数Searchname,若找到,返回表示该学生的信息,不排除有有同名同姓的情况;否则,返回 查无此人。
6)请编写函数Sortname,它的功能是:按每个学生的名字由小到大输出学生的记录。
编程建立的结构体数组通过输入输入存放全班(最多50人)学生信息,按学生的姓名从到大排序,输出学生的所有信息。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
struct date
{ int year;
int month;
int day;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
void input(struct stu *s);
void output(struct stu s);
void inputarray(struct stu s[],int n);
void outputarray(struct stu s[],int n);
void Searchname(struct stu *tp,int n);
void Sortname(struct stu *tp,int n);
main()
{
int n;
struct stu s[50];
n=3; //假设1班有3名学生
printf("请输入本班共%d个学生信息:\n",n);
inputarray(s,n); //从键盘输入学生数据
printf("本班共%d个学生信息:\n",n);
outputarray(s,n);
Searchname(s,n);
printf("排序后的学生信息:\n");
outputarray(s,n);
printf("\n");
}
void input(struct stu *s)
{ int j;
printf("请输入学生学号:");
scanf("%d",&(*s).num);
printf("请输入学生姓名:");
scanf("%s",(*s).name);
printf("请输入学生性别:");
scanf(" %c",&(*s).sex);
printf("请输入学生的出生年月日: ");
scanf("%d%d%d",&(*s).birthday.year,&(*s).birthday.month,
&(*s).birthday.day);
printf("请输入学生的4科成绩: ");
(*s).ave=0;
for(j=0;j<4;j++)
{
scanf("%f",&(*s).score[j]);
(*s).ave+=(*s).score[j];
}
(*s).ave =(*s).ave/4.0;
}
void output(struct stu s)
{
int j;
printf("学号:%d\n姓名:%s\n性别:%c\n",s.num,s.name,s.sex,s.score);
printf("出生年月日:%d-%d-%d\n", s.birthday.year, s.birthday.month,
s.birthday.day);
printf("成绩:");
for(j=0;j<4;j++)
{
printf("%6.1f\t",s.score[j]);
}
printf("%6.1f\n",s.ave);
}
void inputarray(struct stu *s,int n)
{ int i,j;
for(i=0;i<n;i++)
{
printf("请输入学生学号:");
scanf("%d",&(s[i]).num);
printf("请输入学生姓名:");
scanf("%s",(s[i]).name);
printf("请输入学生性别:");
scanf(" %c",&(s[i]).sex);
printf("请输入学生的出生年月日: ");
scanf("%d%d%d",&(s[i]).birthday.year,&(s[i]).birthday.month,
&(s[i]).birthday.day);
printf("请输入学生的4科成绩: ");
(s[i]).ave=0;
for(j=0;j<4;j++)
{
scanf("%f",&(s[i]).score[j]);
(s[i]).ave+=(s[i]).score[j];
}
(s[i]).ave =(s[i]).ave/4.0;
}
}
void outputarray(struct stu s[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);
printf("出生年月日:%d-%d-%d\n", s[i].birthday.year, s[i].birthday.month,
s[i].birthday.day);
printf("成绩:");
for(j=0;j<4;j++)
{
printf("%6.1f\t",s[i].score[j]);
}
printf("%6.1f\n",s[i].ave);
}
}
void Searchname(struct stu *tp,int n)
{
int i,flag=0;
char f[N];
printf("请输入要查找的学生姓名:");
getchar();
gets(f);
for(i=0;i<n;i++)
{
if((strcmp(tp[i].name,f))==0)
{
output(tp[i]);
flag=1;
}
}
if(flag==0)
printf("查无此人\n");
printf("\n");
}
void Sortname(struct stu *tp,int n)
{
int i,j;
struct stu p;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if((strcmp(tp[j].name,tp[j+1].name))>0)
{
p=tp[j];
tp[j]=tp[j+1];
tp[j+1]=p;
}
}
}
}
5、已知一无符号的整数占用了4个字节的内存空间,现欲从低位存储地址开始,将其每个字节作为单独的一个ASCII码字符输出,试用共同体类型实现上述转换。
#include<stdio.h>
union change
{
int a;// 共用内存空间
char b[4];//表示a的四个字节
};
void main ()
{
union change nm;
int i;
scanf("%d",&nm.a);
for(i = 0; i<sizeof(int);i++)
printf("第%d个字节为:%d\n ",i+1,nm.b[i]);
printf("\n");
}
6、已知一长度为2个字节的整数,现欲将其高位字节与低位字节相互交换后输出,试用共同体类型实现这一功能。
#include<stdio.h>
union number
{
short int num;
char ch[2];
};
void main()
{
char temp;
union number a;
scanf("%d",&a.num);
temp=a.ch[0]; //交换高低位字节
a.ch[0] = a.ch[1];
a.ch[1] = temp;
printf("高低位字节交换后为:%d\n",a.num);
}
7、 现在有教师(姓名、单位、住址、职称)和学生(姓名、班级、住址、入学成绩)的信息。请在输入10名教师和学生的信息后,按姓名进行排序,最后按排序后的顺序进行输出,对于教师要输出姓名、单位、住址和职称,对学生要输出姓名、班级、住址和入学成绩。请编程实现。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
union categ1
{
int score; //入学成绩
char title[20]; //职称
};
union categ2
{
char grade[20]; //班级
char position[20]; //部门
};
typedef struct information
{
char name[20]; //成员姓名
char addr[20];
char job;
union categ1 category1;
union categ2 category2;
}PERSON;
void output(PERSON per[],int n);
void input(PERSON per[],int n);
void sort(PERSON per[],int n);
int main()
{
PERSON person[N];
int n;
printf("有多少成员: ");
scanf("%d",&n);
input(person,n);
printf("老师和学生的信息:\n");
output(person,n);
printf("排序后老师和学生的信息:\n");
sort(person,n);
output(person,n);
}
void input(PERSON per[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请问输入的是老师还是学生的信息(s或t)\n");
scanf(" %c",&per[i].job);
if(per[i].job=='s')
{ printf("请输入学生的姓名:\n");
scanf("%s",per[i].name);
printf("请输入学生的班级:\n");
scanf("%s",per[i].category2.grade);
printf("请输入学生的住址:\n");
scanf("%s",per[i].addr);
printf("请输入学生的入学成绩:\n");
scanf("%d",&( per[i].category1.score) );
}
else if(per[i].job=='t')
{
printf("请输入老师的姓名:\n");
scanf("%s",per[i].name);
printf("请输入老师的单位:\n");
scanf("%s",per[i].category2.position );
printf("请输入老师的住址:\n");
scanf("%s",per[i].addr);
printf("请输入老师的职称:\n");
scanf("%s", per[i].category1.title );
}
else
printf("输入有误\n");
}
printf("\n");
}
void output(PERSON per[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(per[i].job=='s')
{
printf("学生\t");
printf("%s\t",per[i].name);
printf("%s\t",per[i].category2.grade);
printf("%s\t",per[i].addr);
printf("%d\n", per[i].category1.score );
}
else if(per[i].job=='t')
{
printf("老师\t");
printf("%s\t",per[i].name);
printf("%s\t",per[i].category2.position );
printf("%s\t",per[i].addr);
printf("%s\n", per[i].category1.title );
}
}
printf("\n");
}
void sort(PERSON per[],int n)
{
int i,j;
PERSON temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(per[i].name,per[j].name)<0)
{
temp=per[i];
per[i]=per[j];
per[j]=temp;
}
}
}
}
8、请定义枚举类型score,用枚举元素代表成绩的等级,如:90分以上为优(excellent),80—89分之间为良(good),60-79分之间为中(general),60分以下为差(fail),通过键盘输入一个学生的成绩,然后输出该生成绩的等级。
#include<stdio.h>
enum score
{
excellent=90,good=80,general=60,fail=0
};
main()
{
int n;
printf("please input:");
scanf("%d",&n);
if(n>=excellent)
printf("等级为优\n");
else
{
if(n>=good)
printf("等级为良\n");
else
{
if(n>=general)
printf("等级为中\n");
else
printf("等级为差\n");
}
}
}
9、请定义枚举类型money,用枚举元素代表人民币的面值。包括1,2,5分;1,2,5角;1,2,,5,10,50,100元。从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量,要求显示100元、50元、10元、5元、2元、1元、1角、5分、1分各多少张。
#include<stdio.h>
typedef enum money
{
fen1=1,fen2,fen5,jiao1,jiao2,jiao5,yuan1,yuan2,yuan5,yuan10,yuan50,yuan100
}MONEY;
void main()
{
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;
int n;
double m;
printf("请输入金额:");
scanf("%lf",&m);
for( ; ; )
{
if(m>=100)
{
n=12;
m=m-100;
}
else if(m>=50)
{
n=11;
m=m-50;
}
else if(m>=10)
{
n=10;
m=m-10;
}
else if(m>=5)
{
n=9;
m=m-5;
}
else if(m>=2)
{
n=8;
m=m-2;
}
else if(m>=1)
{
n=7;
m=m-1;
}
else if(m>=0.1)
{
n=4;
m=m-0.1;
}
else if(m>=0.05)
{
n=3;
m=m-0.05;
}
else if(m>=0.01)
{
n=1;
m=m-0.01;
}
switch(n)
{
case yuan100:
a++;
break;
case yuan50:
b++;
break;
case yuan10:
c++;
break;
case yuan5:
d++;
break;
case yuan2:
e++;
break;
case yuan1:
f++;
break;
case jiao1:
g++;
break;
case fen5:
h++;
break;
case fen1:
i++;
break;
default:
printf("input error\n");
break;
}
if(m<0.01)
{
i++;
break;
}
}
printf("100元有%d张\n",a);
printf("50元有%d张\n",b);
printf("10元有%d张\n",c);
printf("5元有%d张\n",d);
printf("2元有%d张\n",e);
printf("1元有%d张\n",f);
printf("1角有%d张\n",g);
printf("5分有%d张\n",h);
printf("1分有%d张\n",i);
}
9 动态内存分配
1、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个整数,然后求这10个整数中的最大值。
#include<stdio.h>
#include<stdlib.h>
main()
{
int i, n, *p; //p是一个指向int型变量的指针变量
n=10;
if( ( p=(int *) malloc(n*sizeof(int)) ) == NULL)
{
printf("不能成功分配存储空间。\n");
exit(0);
}
for (i=0;i<n;i++) //给数组赋值
scanf(“%d”,p+i); // p+i等价于 &p[i]
max=p[0];
for(i=1; i<n ;i++)
{
if( *(p+i) > max)
max= *(p+i); //*(p+i) 等价于p[i]
}
for(i=0; i<n;i++) /*打印数组元素*/
printf(“%2d”,p[i]);
printf(“\nmax=%d\n”,max);
free(p);
}
2、定义一个动态数组,长度为变量n,用随机函数给数组各元素赋值。然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void sort(int *a,int n);
void swap(int *p1,int *p2);
void main()
{
int *p=NULL;
int i,n;
printf("input n:");
scanf("%d",&n);
if((p=(int *) malloc (n*sizeof(int)))==NULL)
{
printf("不能成功分配内存单元\n");
exit(0);
}
srand(time(NULL));
for(i=0;i<n;i++)
{
p[i]=rand() % 100 + 1;
}
sort(p,n);
printf("排序后为:");
for(i=0;i<n;i++)
{
printf("%d,",p[i]);
}
printf("\n");
}
void sort(int *a,int n)
{
int i,j;
int temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
swap(&a[j],& a[j+1]);
}
}
}
}
void swap(int *p1,int *p2)
{
int t;
t=*p1; *p1=*p2; *p2=t;
}
3、用头插法创建一个存放整数的单链表,以输入-1做结束标志,并打印输出单链表。
#include <stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
} ;
typedef struct node LNode;
typedef struct node * LinkList;
void CreateHeadList (LinkList L);
void OutputList(LinkList L);
void DestroyList(LinkList L);
main()
{
LinkList head; //定义一个LinkList 型的变量head
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{
printf("申请空间失败!");
exit(0);
}
head ->next=NULL; //新建了一个空的单链表head
CreateHeadList ( head); //用头插法输入数据创建各结点
OutputList(head); //输出以head为头的链表各结点的值
DestroyList (head); //销毁以head为头的链表各结点
}
/*定义头插法创建带头结点的单链表的函数*/
void CreateHeadList(LinkList L)
{ LNode *p;
int x, flag=-1;
scanf("%d",&x);
while (x != flag)
{
if( ( p =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{
printf("申请空间失败!");
exit(0);
}
p->data=x; //x的数据类型为int型
p->next=L->next;
L->next=p;
scanf("%d",&x);
}
}
/*定义输出带头结点的单链表的函数*/
void OutputList(LinkList head)
{
struct node *p;
p=head->next ; //取得链表的头指针
while(p!=NULL) //只要p指向的结点非空
{
printf("%d\t",p->data); //p->data数据类型为int型
p=p->next; //p指向该结点的下一个结点
}
printf("\n");
}
/*定义销毁带头结点的单链表的函数*/
void DestroyList (LinkList head)
{
struct node *p, *q;
p=head; //取得链表的头指针
while(p!=NULL) //只要p指向的结点非空
{
q=p->next; //将p的下一个结点的地址保存在q中
free(p); //释放p指向的结点
p=q;
}
}
4、用尾插法创建一个存放整数的单链表,以输入-1做结束标志,并打印输出单链表。然后求这批整数中的最大值。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int ElemType;
struct node
{
ElemType data; //数据成员data类型为ElemType类型
struct node * next;
} ;
typedef struct node LNode;
typedef struct node * LinkList;
void input(ElemType *s);
void output(ElemType s);
int compare(ElemType a,ElemType b);
void CreateTailList (LinkList L);//用头插法创建一个单链表L
void OutputList (LinkList L);//输出以L为头的单链表各结点的值
LNode * searchmax(LinkList L);
void DestroyList (LinkList L);
int main()
{
LNode * max;
LinkList head; //head是保存单链表的表头结点地址的指针
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{ printf("申请空间失败!");
exit(0);
}
head->next=NULL;
CreateTailList(head);
printf("创建的单链表:\n");
OutputList(head);
max=searchmax(head);
printf("最大值:\n");
output(max->data );
printf("\n");
DestroyList (head);
}
//用尾插法创建带头结点的单链表
void CreateTailList(LinkList L)
{
ElemType flag=-1,x;
LNode *p,* tail;
int i=0;
tail=L; //设置尾指针,方便插入
input(&x); //x为char型变量;
while ( compare(x,flag)!=0)
{
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
printf("申请空间失败!");
exit(0);
}
p->data=x; //x的实际数据类型为struct stu
p->next=NULL;
tail->next=p;
tail=p;
input(&x);
}
}
void OutputList (LinkList head)//输出以head为头的链表各结点的值
{
struct node *p;
p=head->next ;//取得链表的头指针
while(p!=NULL)//只要是非空表
{
output(p->data); //调用output(p->data)输出结点的数据
p=p->next; //p指向下一个结点
}
printf("\n");
}
void DestroyList (LinkList head)//输出以head为头的链表各结点的值
{
struct node *p,*q;
p=head; //取得链表的头指针
while(p!=NULL) //只要是非空表
{
q=p->next;
free(p);
p=q;
}
}
void input(ElemType *s)
{
scanf("%d",&(*s));
}
void output(ElemType s)
{
printf("%d\t",s);
}
int compare(ElemType a, ElemType b)
{
if (a==b)
return 0;
else
if (a<b)
return -1;
else
return 1;
}
LNode * searchmax (LinkList list)
{
LinkList p = list->next;//上一个节点的指针
LNode * max ;//当前节点
max=p ;
while(p)
{
if(compare(p->data ,max->data)>0)
{
max=p ;
}
p = p->next;
}
return max;
}
5、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个字符串,然后求10个字符串的最大值。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char max[20],**cs; //假设输入的字符串最大长度为19
int i,n;
n=10;
if( ( cs=( char ** ) malloc( n*sizeof(char*) ) ) == NULL)
//申请长度为n的指针数组
{
printf(“不能成功分配存储空间。\n”);
exit(1);
}
for(i=0;i<n;i++)
{ //循环申请长度为20的字符数组
//并将每次申请的字符数组的地址存放在相应的指针数组元素里
if( ( cs[i] = (char *) malloc(20*sizeof(char) )) == NULL )
{
printf(“不能成功分配存储空间。\n”);
exit(1);
}
}
fflush(stdin); //清空输入缓冲区
printf("input n string:\n");
for(i=0;i<n;i++)
{
gets(cs[i]);
}
printf("\n");
strcpy(max,cs[0]);
for(i=1;i<n;i++)
{
if( strcmp(cs[i],max)>0)
strcpy(max,cs[i]);
}
printf(“输入的%d字符串如下:\n”,n);
for(i=0;i<n;i++)
{
puts(cs[i]);
}
printf(“最大的字符串是:%s\n”,max);
printf("\n");
for(i=0;i<n;i++)
{
free(cs[i]);
}
free(cs);
return 0;
}
6、已知head指向一个带头结点的单向链表,链表中每个结点包含字符型数据域(data)和指针域(next)。请编写程序实现如图所示链表的逆置。
|
若原链表为: |
|||||||||||||||
|
head |
// |
a |
b |
c |
d |
^ |
|||||||||
|
head |
// |
d |
c |
b |
a |
^ |
|||||||||
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
struct node
{
ElemType data; //数据成员data类型为ElemType类型
struct node * next;
} ;
typedef struct node LNode;
typedef struct node * LinkList;
void input(ElemType *s);
void output(ElemType s);
int compare(ElemType a,ElemType b);
void CreateTailList (LinkList L);
void OutputList (LinkList L);
void reverse (LinkList L);
void DestroyList (LinkList L);
int main()
{
LinkList head;
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{
printf("申请空间失败!");
exit(0);
}
head->next=NULL;
CreateTailList(head);
printf("创建的单链表:\n");
OutputList(head);
printf("逆置后单链表:\n");
reverse(head);
OutputList(head);
DestroyList (head);
return 0;
}
//用尾插法创建带头结点的单链表
void CreateTailList(LinkList L)
{
ElemType flag='\n',x;
LNode *p,* tail;
int i=0;
tail=L; //设置尾指针,方便插入
input(&x); //x为char型变量;
while ( compare(x,flag)!=0)
{
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
printf("申请空间失败!");
exit(0);
}
p->data=x; //x的实际数据类型为struct stu
p->next=NULL;
tail->next=p;
tail=p;
input(&x);
}
}
void OutputList (LinkList head)
{
struct node *p;
p=head->next ;
while(p!=NULL)
{
output(p->data); //调用output(p->data)输出结点的数据
p=p->next; //p指向下一个结点
}
printf("\n");
}
void DestroyList (LinkList head)//输出以head为头的链表各结点的值
{
struct node *p,*q;
p=head;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
void input(ElemType *s)
{
scanf("%c",&(*s));
}
void output(ElemType s)
{
printf("%c\t",s);
}
int compare(ElemType a, ElemType b)
{
if (a==b)
return 0;
else
if (a<b)
return -1;
else
return 1;
}
void reverse (LinkList L)
{ //逆置head指针所指向的单循环链表
LNode *p, *q;
p=L->next;
L->next = NULL;
while (p!=NULL) //当表不为空时,逐个结点逆置
{
q = p->next;
p->next = L->next;
L->next = p;
p=q;
}
}
7、已知head指向一个带头结点的单向链表,链表中每个结点包含字符串数据域(data)和指针域(next)。请编写程序实现如图所示链表的逆置。
|
若原链表为: |
|||||||||||||||
|
head |
// |
Shanghai |
Beijing |
Hangzhou |
Guangzhou |
^ |
|||||||||
|
head |
// |
Guangzhou |
Hangzhou |
Beijing |
Shanghai |
^ |
|||||||||
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType[20];
struct node
{
ElemType data; //数据成员data类型为ElemType类型
struct node * next;
} ;
typedef struct node LNode;
typedef struct node * LinkList;
void input(ElemType *s);
void output(ElemType s);
int compare(ElemType a,ElemType b);
void CreateTailList (LinkList L);
void OutputList (LinkList L);
void reverse (LinkList L);
void DestroyList (LinkList L);
int main()
{
LinkList head;
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{
printf("申请空间失败!");
exit(0);
}
head->next=NULL;
CreateTailList(head);
printf("创建的单链表:\n");
OutputList(head);
printf("逆置后单链表:\n");
reverse(head);
OutputList(head);
DestroyList (head);
return 0;
}
//用尾插法创建带头结点的单链表
void CreateTailList(LinkList L)
{
ElemType flag="stop",x;
LNode *p,* tail;
int i=0;
tail=L; //设置尾指针,方便插入
input(&x); //x为char[20]类型
while ( compare(x,flag)!=0)
{
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
printf("申请空间失败!");
exit(0);
}
strcpy(p->data,x); //x的实际数据类型为char[20]
p->next=NULL;
tail->next=p;
tail=p;
input(&x);
}
}
void OutputList (LinkList head)
{
struct node *p;
p=head->next ;
while(p!=NULL)
{
output(p->data); //调用output(p->data)输出结点的数据
p=p->next; //p指向下一个结点
}
printf("\n");
}
void DestroyList (LinkList head)
{
struct node *p,*q;
p=head; //取得链表的头指针
while(p!=NULL) //只要是非空表
{
q=p->next;
free(p);
p=q;
}
}
void input(ElemType *s)
{
scanf("%s",(*s));
}
void output(ElemType s)
{
printf("%s\t",s);
}
int compare(ElemType a, ElemType b)
{
if (strcmp(a,b)==0 )
return 0;
else
if ( strcmp(a,b)<0 )
return -1;
else
return 1;
}
void reverse (LinkList L)
{ //逆置head指针所指向的单循环链表
LNode *p, *q;
p=L->next;
L->next = NULL;
while (p!=NULL) //当表不为空时,逐个结点逆置
{
q = p->next;
p->next = L->next;
L->next = p;
p=q;
}
}
8、用尾插法创建一个存放字符串的单链表,以输入"stop"做结束标志,并打印输出单链表。然后求这批字符串的最大值。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType[20];
struct node
{
ElemType data; //数据成员data类型为ElemType类型
struct node * next;
} ;
typedef struct node LNode;
typedef struct node * LinkList;
void input(ElemType *s);
void output(ElemType s);
int compare(ElemType a,ElemType b);
void CreateTailList (LinkList L);//用头插法创建一个单链表L
void OutputList (LinkList L);//输出以L为头的单链表各结点的值
LNode * searchmax(LinkList L);
void DestroyList (LinkList L);
int main()
{
LNode * max;
LinkList head; //head是保存单链表的表头结点地址的指针
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{ printf("申请空间失败!");
exit(0);
}
head->next=NULL;
CreateTailList(head);
printf("创建的单链表:\n");
OutputList(head);
max=searchmax(head);
printf("最大值:\n");
output(max->data );
printf("\n");
DestroyList (head);
}
//用尾插法创建带头结点的单链表
void CreateTailList(LinkList L)
{
ElemType flag="stop",x;
LNode *p,* tail;
int i=0;
tail=L; //设置尾指针,方便插入
input(&x); //x为char型变量;
while ( compare(x,flag)!=0)
{
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
printf("申请空间失败!");
exit(0);
}
strcpy( p->data,x); //x的实际数据类型为char [20]
p->next=NULL;
tail->next=p;
tail=p;
input(&x);
}
}
void OutputList (LinkList head)//输出以head为头的链表各结点的值
{
struct node *p;
p=head->next ;//取得链表的头指针
while(p!=NULL)//只要是非空表
{
output(p->data); //调用output(p->data)输出结点的数据
p=p->next; //p指向下一个结点
}
printf("\n");
}
void DestroyList (LinkList head)//输出以head为头的链表各结点的值
{
struct node *p,*q;
p=head; //取得链表的头指针
while(p!=NULL) //只要是非空表
{
q=p->next;
free(p);
p=q;
}
}
void input(ElemType *s)
{
scanf("%s",(*s));
}
void output(ElemType s)
{
printf("%s\t",s);
}
int compare(ElemType a, ElemType b)
{
if ( strcmp(a,b)==0)
return 0;
else
if (strcmp(a,b)<0)
return -1;
else
return 1;
}
LNode * searchmax (LinkList list)
{
LinkList p = list->next;//上一个节点的指针
LNode * max ;//当前节点
max=p ;
while(p)
{
if(compare(p->data ,max->data)>0)
{
max=p ;
}
p = p->next;
}
return max;
}
9、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个学生数据,学生信息包含学号,姓名,性别,出生日期、分数,然后输出这10个学生中的平均分最高的学生的全部信息。定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:
struct date
{ int month;
int day;
int year;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct date
{ int year;
int month;
int day;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
void output(struct stu s)
{
int j;
printf("学号:%d\n姓名:%s\n性别:%c\n",s.num,s.name,s.sex,s.score);
printf("出生年月日:%d-%d-%d\n", s.birthday.year, s.birthday.month,
s.birthday.day);
printf("成绩:");
for(j=0;j<4;j++)
{
printf("%6.1f\t",s.score[j]);
}
printf("%6.1f\n",s.ave);
}
void input(struct stu *s)
{ int j;
printf("请输入学生学号:");
scanf("%d",&(*s).num);
printf("请输入学生姓名:");
scanf("%s",(*s).name);
printf("请输入学生性别:");
scanf(" %c",&(*s).sex);
printf("\n请输入学生的出生年月日: ");
scanf("%d%d%d",&(*s).birthday.year,&(*s).birthday.month,
&(*s).birthday.day);
printf("\n请输入学生的4科成绩: ");
(*s).ave=0;
for(j=0;j<4;j++)
{
scanf("%f",&(*s).score[j]);
(*s).ave+=(*s).score[j];
}
(*s).ave =(*s).ave/4.0;
}
main()
{
int i,k,n;
struct stu *ps;
printf("请输入动态数组的大小:\n");
scanf("%d",&n);
ps=(struct stu*)malloc(n*sizeof(struct stu));
if(ps == NULL)
{
printf("不能成功分配存储空间。\n");
exit(1);
}
for(i=0;i<n;i++)
{
input(ps+i); //从键盘输入学生数据
}
k=0;
for(i=0;i<n;i++)
{
if( ps[k].ave < ps[i].ave )
{
k=i;
}
}
printf("本班共%d个学生信息:\n",n);
for(i=0;i<n;i++)
{
output(ps[i]);
}
printf("本班%d个学生中的分数最高的学生是第%d个学生:\n",n,k+1);
output(ps[k]);
printf("\n");
free(ps);
}
10、请编写程序,利用malloc函数开辟动态存储单元,链式存放输入的10个学生数据,学生信息包含学号,姓名,性别,出生日期、分数,然后输出这10个学生中的平均分最高的学生的全部信息。定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:
struct date
{ int month;
int day;
int year;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct date
{
int year;
int month;
int day;
}DATE;
struct stu
{
int num;
char name[20];
char sex;
DATE birthday;
float score;
};
typedef struct stu ElemType;
struct node
{
ElemType data; //数据成员data类型为ElemType类型
struct node * next;
};
typedef struct node LNode;
typedef struct node * LinkList;
void Input(ElemType *s);
void output(ElemType s);
int compare(ElemType a,ElemType b);
void CreateTailList (LinkList L); //用头插法创建一个单链表L
void OutputList (LinkList L); //输出以L为头的单链表各节点的值
void DeleteList (LinkList L);
int main()
{
LinkList head; //head是保存单链表的表头结点地址的指针
if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL)
{
printf("申请空间失败!");
exit(0);
}
head->next=NULL;
CreateTailList(head); //把所新建的单链表表头地址赋给head
OutputList(head);
DeleteList(head);
return 0;
}
/*用尾插法创建带头结点的单链表*/
void CreateTailList(LinkList L)
{
LNode *p,* tail;
ElemType x,flag={0,"",'\0',0};
tail=L; //设置尾指针,方便插入
Input(&x);
while ( compare(x,flag)!=0)
{
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
printf("申请空间失败!");
exit(0);
}
p->data=x; //当x的数据类型为字符数组时,要调用字符串拷贝函数strcpy()
p->next=NULL;
tail->next=p;
tail=p;
Input(&x);
}
}
/*输出以head为头的链表各节点的值*/
void OutputList (LinkList head)
{
struct node *p;
p=head; //取得链表的头指针
while(p!=NULL) //只要是非空表
{
output(p->data); //不论data成员为什么类型,都可调用output(p->data)输出节点的数据
p=p->next; //p指向下一个节点
}
}
/*输出以head为头的链表各节点的值*/
void DeleteList (LinkList head)
{
struct node *p,*q;
p=head; //取得链表的头指针
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
void Input(ElemType *s)
{
printf("请输入学生学号:");
scanf("%d",&(*s).num);
printf("请输入学生姓名:");
scanf("%s",(*s).name);
printf("请输入学生性别:");
scanf(" %c",&(*s).sex);
printf("请输入学生出生日期:");
scanf("%d%d%d",&(*s).birthday.year,& (*s).birthday.month,
&(*s).birthday.day);
printf("请输入学生成绩:");
scanf("%f",&(*s).score);
}
void output(ElemType s)
{
printf("学号:%d\n姓名:%s\n性别:%c\n出生日期:%d年%d月%d日\n成绩:%6.1f\n",
s.num,s.name,s.sex,s.birthday.year,s.birthday.month,
s.birthday.day,s.score);
}
int compare(ElemType a, ElemType b)
{
if (a.num==b.num)
return 0;
else
if (a.num<b.num)
return -1;
else
return 1;
}
10 文件
1、根据程序提示从键盘输入一个已存在的文本文件的完整文件名,并再输入一个新文本文件的完整文件名,然后编程将已存在文本文件中的内容全部拷贝到新文本文件中去,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。
#include <stdio.h>
#include <stdlib.h>
int main( )
{
FILE *in,*out;
char ch,infile[40],outfile[40];
printf("输入读入文件的名字:"); //输入已存在的文件名
scanf("%s",infile);
if((in=fopen(infile,"r"))==NULL) //文件指针in指向读入文件
{ printf("无法打开此文件\n");
exit(0 ); //如果文件打开失败,退出系统
}
printf("输入输出文件的名字:"); //输入要创建的文件名
scanf("%s",outfile);
if((out=fopen(outfile,"w"))==NULL) //文件指针out指向输出文件
{ printf("无法打开此文件\n");
exit(0);
}
while(!feof(in)) //检查输入文件当前文件位置指针是否移到文件末尾
{ ch=fgetc(in); //从读入文件中读出一个字符
fputc(ch,out); //将此字符写入到输出文件
putchar(ch); //将此字符输出到显示器
}
putchar(10); //输出换行符
fclose(in); //关闭读入文件
fclose(out); //关闭输出文件
return 0;
}
2、根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将源文本文件的内容追加到目的文本文件的原内容之后,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
int main( )
{
FILE *p,*q;
char ch,file1[40],file2[40];
printf("输入源文件的名字:");
scanf("%s",file1);
if((p=fopen(file1,"r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
printf("输入目的文件的名字:");
scanf("%s",file2);
if((q=fopen(file2,"a+"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
printf("源文件的内容:\n");
while(!feof(p)) /*检查当前文件位置指针是否移到文件末尾*/
{
ch=fgetc(p);
printf("%c",ch);
fputc(ch,q);
}
rewind(q);
printf("\n目的文件的内容:\n");
while( !feof(q) )
{
ch = fgetc(q);
printf("%c",ch);
}
fclose(p);
fclose(q);
return 0;
}
3、编写一个程序,把一个文件的内容复制到另一个文件上,在复制时把大写字母改为小写字母,其它字符保持不变,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
int main( )
{
FILE *p,*q;
char ch,file1[40],file2[40];
printf("输入源文件的名字:");
scanf("%s",file1);
if((p=fopen(file1,"r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
printf("输入目的文件的名字:");
scanf("%s",file2);
if((q=fopen(file2,"w"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
printf("源文件的内容:\n");
while(!feof(p)) /*检查当前文件位置指针是否移到文件末尾*/
{
ch=fgetc(p);
printf("%c",ch);
if( islower(ch) )
ch -=32;
fputc(ch,q);
}
fclose(p);
fclose(q);
if((q=fopen(file2,"r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
printf("\n目的文件的内容:\n");
while( !feof(q) )
{
ch = fgetc(q);
printf("%c",ch);
}
fclose(q);
return 0;
}
4、根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将源文本文件的内容追加到目的文本文件的原内容之前,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。
#include <stdio.h>
#include <stdlib.h>
int main( )
{
FILE *in1,*out,*in2;
char ch,file1[20],file2[20];
printf("输入源文件的名字:");
scanf("%s",file1);
if((in1=fopen(file1,"r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
printf("输入要目的文件的名字:");
scanf("%s",file2);
if((in2=fopen(file2,"r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
if((out=fopen("temp.txt","w"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
while(!feof(in2))
{
ch=fgetc(in2);
fputc(ch,out);
}
fclose(in2);
fclose(out);
if((out=fopen(file2,"w"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
if((in2=fopen("temp.txt","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
printf("源文件的内容:\n");
while(!feof(in1)) /*检查当前文件位置指针是否移到文件末尾*/
{
ch=fgetc(in1);
fputc(ch,out);
putchar(ch);
}
while(!feof(in2)) /*检查当前文件位置指针是否移到文件末尾*/
{
ch=fgetc(in2);
fputc(ch,out);
}
fclose(in1);
fclose(in2);
fclose(out);
printf("\n目的文件内容:\n");
if((in1=fopen(file2,"r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
while( !feof(in1) )
{
ch = fgetc(in1);
putchar(ch);
}
fclose(in1);
return 0;
}
5、请编写一个程序,比较两个文件,如果相等则返回0;否则返回1。
#include <stdio.h>
#include<stdlib.h>
int CompareFile( char * f1, char* f2)
{
int result = 0;
long size1=0,size2= 0 ;
char ch1,ch2 ;
FILE *p,*q;
if( (p=fopen(f1,"r") )==NULL)
{
printf("无法打开文件1");
exit(0);
}
if( (q=fopen(f2,"r") )==NULL)
{
printf("无法打开文件2");
exit(0);
}
fseek(p, 0, 2);
size1= ftell(p);
fseek(p, 0, 0);
fseek(q, 0, 2);
size2= ftell(q);
fseek(q, 0, 0);
if(size1 != size2)
{ result = 1;
return result;
}
while( !feof(p) && !feof(q) )
{
ch1 = fgetc(p);
ch2 = fgetc(q);
if(ch1!=ch2)
{
result = 1;
break;
}
}
if( ch1!=EOF || ch2!=EOF )
{ result = 1;
}
fclose(p);
fclose(q);
return result;
}
main()
{
char f1[40],f2[40];
int resule;
printf("请输入文件1的名字: ");
scanf("%s",f1);
printf("请输入文件2的名字: ");
scanf("%s",f2);
resule=CompareFile(f1,f2);
if(resule==0)
printf("两个文件相等\n");
else
printf("两个文件不相等\n");
}
6、编写一个程序,交替地读取两个文件的正文行,并把它们送到stdout文件上。如果一个文件读完,那么就把另一个文件余下的内容全部复制到stdout上。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main( )
{
FILE *f1,*f2;
char ch[1024];
char file1[40],file2[40];
printf("输入文件1的名字:");
scanf("%s",file1);
if((f1=fopen(file1,"r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
printf("输入文件2的名字:");
scanf("%s",file2);
if((f2=fopen(file2,"r"))==NULL)
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
while(!feof(f1) && !feof(f2) )
{
fgets(ch,1023,f1);
puts(ch);
fgets(ch, 1023,f2);
puts(ch);
}
while(!feof(f1))
{ fgets(ch, 1023,f1);
puts(ch);
}
while(!feof(f2))
{
fgets(ch, 1023,f2);
puts(ch);
}
fclose(f1);
fclose(f2);
return 0;
}
7、设文件number.dat中存放了一组整数。请编程统计并输出文件中正整数、零和负整数的个数。
#include <stdio.h>
#include <stdlib.h>
int main( )
{
FILE *p;
int num;
int n1=0,n2=0,n3=0;
p=fopen("number.dat","r");
if(p == NULL)
{
printf("打开文件失败\n");
exit(0);
}
while(!feof(p))
{
fscanf(p,"%d",&num);//以%d的格式代开文件,存放到num中
if(num>0)
n1++;
else if(num<0)
n2++;
else
n3++;
}
printf("正整数的个数为 =%d\n",n1);
printf("负整数的个数为=%d\n",n2);
printf("0的个数为=%d\n",n3);
fclose(p);
return 0;
}
8、有两个磁盘文件“A.txt”和“B.txt”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,输出到一个新文件“C.txt”中。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main( )
{
FILE *f1,*f2,*f3;
char ch1[1024],ch2[500],ch;
int i,j,n;
if((f1=fopen("A.txt","r"))==NULL) /*以只读的方式打开读入文件*/
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
if((f2=fopen("B.txt","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
if((f3=fopen("C.txt","w"))==NULL)
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
i=0;
while(!feof(f1))
{
ch1[i]=fgetc(f1);
i++;
}
ch1[i-1] = '\0';
j=0;
while(!feof(f2))
{
ch2[j]=fgetc(f2);
j++;
}
ch2[j-1] = '\0';
strcat(ch1,ch2);
n=i+j-2;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(ch1[i]>ch1[j])
{
ch = ch1[i];
ch1[i] = ch1[j];
ch1[j] = ch;
}
}
}
fputs(ch1,f3);
fclose(f1);
fclose(f2);
fclose(f3);
if((f3=fopen("C.txt","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0); /*如果文件打开失败,退出系统*/
}
printf("C.txt文件的内容为:\n");
while(!feof(f3))
{
ch = fgetc(f3);
printf("%c",ch);
}
printf("\n");
return 0;
}
9、设文件student.dat中存放着一年级全部学生的基本情况,定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:
struct date
{ int year;
int month;
int day;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
请编程序,从文件读出一年级学生的信息,在显示器输出学生信息。
#include <stdio.h>
#include <string.h>
struct date
{ int year;
int month;
int day;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
void load_txt (struct stu s[],int *n);
void outputarray (struct stu s[],int n);
void main()
{
struct stu s[100]; //假设全班人数不超过100
int n;
load_txt (s,&n);
outputarray(s,n);
}
void load_txt (struct stu s[],int *n)
{
FILE *fin;
int i, j ,k ,size;
*n=0 ;
if((fin=fopen("class.txt","r"))==NULL) //以只读方式打开文件class.txt
{
printf("Can not open the file!\n ");
exit(0);
}
/*读取文件数据*/
fseek(fin,0,2);
size=ftell(fin);
fseek(fin,0,0);
i=0;
while( ! ( size == ftell (fin) )) //判断文件位置指针是否到了文件尾部
{
fscanf(fin,"%d",&s[i].num);
fscanf(fin,"%s", s[i].name);
fscanf(fin," %c",& s[i].sex); fscanf(fin,"%d%d%d",&(s[i].birthday.year),&(s[i].birthday.month),
&(s[i].birthday.day));
fscanf(fin,"%f",& s[i].score[0]);
fscanf(fin,"%f",& s[i].score[1]);
fscanf(fin,"%f",& s[i].score[2]);
fscanf(fin,"%f",& s[i].score[3]);
s[i].ave=(s[i].score[0]+s[i].score[1]+s[i].score[2]+s[i].score[3])/4;
i++;
}
*n=i;
fclose(fin); //关闭文件
}
void outputarray (struct stu s[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);
printf("出生年月日:%d-%d-%d\n", s[i].birthday.year,
s[i].birthday.month,s[i].birthday.day);
printf("成绩:");
for(j=0;j<4;j++)
{
printf("%6.1f\t",s[i].score[j]);
}
printf("%6.1f\n",s[i].ave);
}
return;
}
10、设文件student.dat中存放着一年级全部学生的基本情况,定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:
struct date
{ int month;
int day;
int year;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
请编程序,从文件中读出一年级学生的信息,在显示器输出学生信息,再将学生的名字由小到大排序,将排序后学生信息在显示器输出,并且将排序后学生的信息写入另一个文件studentsort.dat中。
#include <stdio.h>
#include <string.h>
struct date
{ int year;
int month;
int day;
};
struct stu
{
int num;
char name[20];
char sex;
struct date birthday;
float score[4];
float ave;
};
void load_txt (struct stu s[],int *n);
void outputarray (struct stu s[],int n);
void stu_sort(struct stu s[],int n);
void save_txt(struct stu s[], int n);
void main()
{
struct stu s[100]; //假设全班人数不超过100
int n;
load_txt (s,&n);
printf("\n原始学生信息为:\n");
outputarray(s,n);
stu_sort(s, n);
printf("\n排序后的学生信息为:\n");
outputarray(s,n);
save_txt(s, n);
}
void load_txt (struct stu s[],int *n)
{
FILE *fin;
int i, j ,k ,size;
*n=0 ;
if((fin=fopen("student.dat","r"))==NULL)
{ printf("Can not open the file!\n ");
exit(0);
}
/*读取文件数据*/
fseek(fin,0,2);
size=ftell(fin);
fseek(fin,0,0);
i=0;
while( ! ( size == ftell (fin) / /判断文件位置指针是否到了文件尾部
{
fscanf(fin,"%d",&s[i].num);
fscanf(fin,"%s", s[i].name);
fscanf(fin," %c",& s[i].sex);
fscanf(fin,"%d%d%d",&(s[i].birthday.year),
&(s[i].birthday.month),&(s[i].birthday.day);
fscanf(fin,"%f",& s[i].score[0]);
fscanf(fin,"%f",& s[i].score[1]);
fscanf(fin,"%f",& s[i].score[2]);
fscanf(fin,"%f",& s[i].score[3]);
s[i].ave= (s[i].score[0]+ s[i].score[1]+s[i].score[2]+s[i].score[3])/4;
i++;
}
*n=i;
fclose(fin); //关闭文件
}
void outputarray (struct stu s[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);
printf("出生年月日:%d-%d-%d\n", s[i].birthday.year,
s[i].birthday.month,s[i].birthday.day);
printf("成绩:");
for(j=0;j<4;j++)
{
printf("%6.1f\t",s[i].score[j]);
}
printf("%6.1f\n",s[i].ave);
}
return;
}
void stu_sort(struct stu s[],int n)
{
struct stu t;
int i,j,k;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if( strcmp(s[j].name,s[k].name)<0 )
{
k=j;
}
}
if(k!=i)
{
t=s[i]; s[i]=s[k]; s[k]=t;
}
}
return ;
}
void save_txt(struct stu s[], int n)
{
FILE *fout;
int i ;
if((fout=fopen("studentsort.dat","w"))==NULL)
{
printf("Can not open the file!\n ");
exit(0);
}
for(i=0;i<n;i++)
{
fprintf(fout,"学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);
fprintf(fout,"%d-%d-%d\n",s[i].birthday.year,s[i].birthday.month,
s[i].birthday.day);
fprintf(fout,"成绩:%6.1f\t",s[i].score[0]);
fprintf(fout,"%f\t",s[i].score[1]);
fprintf(fout,"%f\t",s[i].score[2]);
fprintf(fout,"%f\t",s[i].score[3]);
fprintf(fout,"%f\n", s[i].ave);
}
fclose(fout); //关闭文件
}
更多推荐


所有评论(0)