#include<stdio.h>
#include <string.h>
#include <math.h>
/*2.4.1有两个瓶子A和B,分别放醋和酱油,要求将他们互换*/
void swapaandb(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
/*一次将10个数输入,要求将将其中最大的数输出。*/
void printMax(){
int max,i;
int arr[10];
printf("请输入10个数:");
scanf("%d\n",&arr[0]);
max=arr[0];
for(i=1;i<10;i++){
scanf("%d\n",&arr[i]);
if(arr[i]>max){
max=arr[i];
}
}
printf("最大值为:%d",max);
}
/*(3)有3个数a b c,要求安大小顺序把他们输出。*/
void printFromMax2Min(int a,int b,int c){
int arr[3]={a,b,c};
int i,j,t;
for(i=0;i<2;i++){
for(j=1;j<3-i;j++){
if(arr[j]<arr[j-1]){
t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
}
}
}
for(j=2;j>=0;j--){
printf("%d\n",arr[j]);
}
}
/*求1+2+3+···+100*/
int sum100(){
return (1+100)*100/2;
}
/*(5)判断一个数n能否同时被3和5整除。0能,1不能*/
int is5and3(int n){
if(n%3==0 && n%5==0){
return 0;
}
return 1;
}
/*判断是否是素数*/
int isss(int n){
int len=sqrt(n),i=2;
for(;i<=len;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
/*将100~200之间的素数输出*/
void printSs(){
int i=100;
for(;i<=200;i++){
if(isss(i)) printf("%d,",i);
}
}
/*求两个数m和n的最大公约数。*/
int getMaxmandn(int n,int m){
int min=n,i;
if(m<n){
min=m;
}
for(i=min;i>0;i--){
if(n%i==0 && m%i==0){
return i;
}
}
return -1;
}
/*(7)求方程式ax2+bx+c的根。分别考虑:①有两个不等的实根;②有两个相等的实根。*/
void printGen(){
float a,b,c;
printf("请输入三个跟a b c\n");
scanf("%f,%f,%f",&a,&b,&c);
printf("%f,%f,%f\n",a,b,c);
float flag=pow(b,2)-4*a*c;
printf("1:%f",flag);
float f1=-b/(2*a);
printf("2:%f",f1);
float f2=sqrt(flag)/(2*a);
printf("3:%f",f2);
if(flag>(1e-6)){
printf("one:%f\n",f1+f2);
printf("two:%f\n",f1-f2);
}else if(flag<=(1e-6)){
printf("only one:%f one:%f\n",f1,f1);
}else{
printf("none!");
}
}
/*输出1900-----2000年中是闰年的年份,符合下面俩个条件之一的年份是闰年。
(一)能被4整除但不能被100整除 (二)能被100整除且能被400整除。*/
void printyear(){
int i=1900;
for(;i<=2000;i++){
if((i%4==0 && i%100!=0) || (i%400==0)){
printf("%d is ruinian",i);
}
}
}
/*要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,
经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。 */
void decodeScript(char str[]){
int i;
int len=strlen(str);
for(i=0;i<len;i++){
str[i]=str[i]+4;
}
}
/*设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 */
void cicle(){
float r,h,res;
printf("请输入圆的半径和圆柱高\n");
scanf("%f,%f",&r,&h);
printf("圆的周长为%.2f\n",2*3.14*r);
printf("圆面积为%.2f\n",3.14*r*r);
printf("圆球表面积为%.2f\n",4*3.14*r*r);
printf("圆球体积为%.2f\n",4/3*3.14*r*r*r);
printf("圆柱体积为%.2f\n",3.14*r*r*h);
}
void printChar(){
char c1,c2;
c1=getchar();
c2=getchar();
putchar(c1);
putchar(c2);
int c3,c4;
c3=getchar();
c4=getchar();
putchar(c3);
putchar(c4);
printf("c1=%d;c2=%d\n",c1,c2);
}
/*4.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。*/
void printMax(){
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
int max=a;
if(b>max){
max=b;
}
if(c>max){
max=c;
}
printf("max:%d\n",max);
}
void printSqrt(){
float a;
scanf("%f",&a);
while(a>=1000){
printf("请重新输入小于1000的数:\n");
scanf("%f",&a);
}
printf("平方根为:%.2f\n",sqrt(a));
}
/*给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。*/
void printBit(){
int a,c=0,arr[5];
printf("请输入一个正整数a:");
scanf("%d",&a);
while(a>0){
arr[c++]=a%10;
printf("顺序输出:第%d位数为%d\n",c,arr[c-1]);
a=a/10;
}
printf("这是一个%d位数\n",c);
for(;a<c;a++){
printf("%d",arr[a]);
}
}
/*4.10 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000<I≤200000)时,
其中10万元按10%提成,高于10万元的部分,可提成7.5% ;200000<I≤400000时,其中20万元仍按上述办法提成(下同),
高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按1.5%提成;
I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。
要求:(1)用if语句编程序;(2)用switch语句编程序。
解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。 */
void printBones(){
float bone[6]={0.1,0.075,0.05,0.03,0.015,0.01};
float ben[5]={1,1,2,2,4};
int b,i=0,offset=100000;
float res=0;
printf("请输入利润:");
scanf("%d",&b);
while(b>ben[i]*offset && i<5){
res+=bone[i]*ben[i]*offset;
b-=ben[i]*offset;
i++;
}
res+=bone[i]*b;
printf("应该发%.2f\n",res);
}
/*输入4个整数,要求按由大到小的顺序输出。*/
void print4NumByOrder(){
int arr[4];
int i,j,t;
printf("请输入4个数");
scanf("%d,%d,%d,%d",&arr[0],&arr[1],&arr[2],&arr[3]);
for(i=0;i<3;i++){
for(j=1;j<4-i;j++){
if(arr[j]<arr[j-1]){
t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
}
}
}
for(j=3;j>=0;j--){
printf("%d\n",arr[j]);
}
}
/*有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。
塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。*/
void printfH(){
int h=10,x,y;
printf("请输入一个坐标");
scanf("%d,%d",&x,&y);
int l1=pow(x-2,2)+pow(y-2,2);
int l2=pow(x+2,2)+pow(y-2,2);
int l3=pow(x-2,2)+pow(y+2,2);
int l4=pow(x+2,2)+pow(y+2,2);
if(l1>1 &&l2>1 &&l3>1 &&l4>1)h=0;
printf("高度为:%d",h);
}
/*5.3输入两个正整数m和n,求其最大公约数和最小公倍数。 */
void printMm(){
int a,b,i;
printf("请输入二个正整数:");
scanf("%d,%d",&a,&b);
int min=a;
int max=b;
if(b<a){
max=a;
min=b;
}
/*最大公约*/
for(i=min;i>0;i--){
if(a%i==0 && b%i==0){
printf("最大公约数为%d",i);
break;
}
}
/*最小公倍数*/
for(i=max;i<=a*b;i++){
if(i%a==0 && i%b==0){
printf("最小公倍数为:%d",i);
break;
}
}
}
/*5.4输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。*/
void countNum(){
char a;
int w=0,s=0,n=0,o=0;
printf("请输入一行字符:");
scanf("%c",&a);
while(a!='\n'){
if((a>='A' && a<='Z') ||(a>='a' && a<='z') ){
w++;
}else if(a==' '){
s++;
}else if(a>='0' && a<='9'){
n++;
}else{
o++;
}
scanf("%c",&a);
}
printf("英文字母%d,空格%d,数字%d,其他字符%d",w,s,n,o);
}
/*5.5求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。 */
void printSn(){
int n,i=2,c=1;
long t=i,sum=i;
printf("请输入:");
scanf("%d",&n);
while(c<n){
i=i*10;
t+=i;
sum+=t;
c++;
}
printf("Sn=%d\n",sum);
}
/*5.6求 ,(即求1!+2!+3!+4!+5!+…+20!) */
void printSNnN(){
int n,i;
long sum=0,t=1;
printf("请输入n:");
scanf("%d",&n);
for(i=1;i<=n;i++){
t=t*i;
sum+=t;
}
printf("Sn=%d",sum);
}
/*求1+2..+100+1+2平方...+50的平方+1+1/2+1/3...+1/10*/
void printfS3(){
int i;
float sum=0;
for(i=1;i<=100;i++){
sum+=i;
if(i<=10){
sum+=1/i;
}
if(i<=50){
sum+=pow(i,2);
}
}
printf("Sn=%.2f\n",sum);
}
/*打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。
例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 */
int isShuiXianHua(int i){
int t=i,sum=0;
while(t>0){
sum+=pow(t%10,3);
t=t/10;
}
if(sum==i){
return 1;
}
return 0;
}
void printShuixianhua(){
int i=100;
for(;i<1000;i++){
if(isShuiXianHua(i)){
printf("%d ",i);
}
}
}
/*一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。
编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1、2、3*/
int isWanshu(int n,int *arr){
int c=1,i=2,sum=1;
arr[0]=1;
for(;i<n;i++){
if(n%i==0){
arr[c++]=i;
sum+=i;
}
}
arr[c]=-1;
if(sum==n){
return 1;
}
return 0;
}
void printWs(){
int i,arr[100],c=1;
for(i=1;i<1000;i++){
if(isWanshu(i,arr)){
printf("%5d its factors are 1",i);
c=1;
while(arr[c]!=-1){
printf(",%d",arr[c++]);
}
printf("\n");
}
}
}
void printSum20(){
int i=0,n;
float sum=0,fz=2,fm=1,t;
scanf("%d",&n);
for(i=0;i<n;i++){
sum+=(fz/fm);
t=fz+fm;
fm=fz;
fz=t;
}
printf("sum=%f\n",sum);
}
/*5.11一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?*/
void printMh(){
int i,n;
float sum=100,h=100;
scanf("%d",&n);
for(i=1;i<n;i++){
h=h/2;
sum+=h*2;
}
printf("第%d次共经过%.2f米",n,sum);
printf("第%d次反弹%.2f米",n,h/2);
}
/*5.12猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。*/
void printHowMany(){
int i=1,sum=1;
for(;i<10;i++){
sum=(sum+1)*2;
}
printf("sum=%d\n",sum);
}
void printSqrt(){
float x0,x1,n;
scanf("%f",&n);
x1=n/2;
do{
x0=x1;
x1=(x0+n/x0)/2;
}while(fabs(x1-x0)>1e-5);
printf("平方根为:%f",x1);
}
/*用牛顿迭代法求方程在1.5附近的根。牛顿迭代法:https://www.matongxue.com/madocs/205.html*/
void printfGenByNd(){
float x=1.5,y;
do{
y=2*x*x*x-4*x*x+3*x-6;/*函数y的导数6*x*x-8*x+3 */
x=x-y/(6*x*x-8*x+3);/*切线y=0时候的x的值*/
}while(fabs(y)>1e-6);
printf("1.5附近的根为:%.2f\n",x);
}
/*用二分法求方程在(-10,10)之间的根
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。
接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,
在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)! */
void printGenBy2divid(){
float x1=-10,x2=10,y1,y2,x,y;
y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
if(y1*y2>0){
printf("无根\n");
return ;
}
do{
x=(x1+x2)/2;
y=2*x*x*x-4*x*x+3*x-6;
if(y1*y<0){
x2=x;
}else if(y2*y<0){
x1=x;
}
}while(fabs(y)>1e-6);
printf("-10,10之间的根为:%f",x);
printf("y为:%f",y);
}
void printfxingx(){
int n,i=1,j;
printf("请输入多少行:");
scanf("%d",&n);
for(;i<=n;i++){
for(j=0;j<n-i;j++)printf(" ");
for(j=0;j<(i*2-1);j++)printf("*");
printf("\n");
}
for(i=n-1;i>0;i--){
for(j=0;j<n-i;j++)printf(" ");
for(j=0;j<(i*2-1);j++)printf("*");
printf("\n");
}
}
int isSuShu(int n){
int i=2;
for(;i<=sqrt(n);i++){
if(n%i==0){
return 0;
}
}
return 1;
}
void printfShushu(){
int i,j,n;
printf("请输入求多少以内的素数:");
scanf("%d",&n);
for(i=1;i<n;i++){
if(isSuShu(i)){
printf("%d,",i);
}
}
}
/*选择排序*/
void sortSelect(int arr[],int len){
int i,j,min,index;
for(i=0;i<len-1;i++){
min=arr[i];
index=i;
for(j=i+1;j<len;j++){
if(arr[j]<min){
min=arr[j];
index=j;
}
}
arr[index]=arr[i];
arr[i]=min;
}
}
/*3、求一个3×3的整型矩阵对角线元素之和。*/
int get44Sum(int arr[4][4]){
int i,sum;
for(i=0;i<4;i++){
sum+=arr[i][i]+arr[i][3-i];
}
return sum;
}
void insert_arr(int arr[],int len,int n){
int res[len+1],index=0,i,flag=1;
for(i=0;i<len;i++){
if(flag && n<arr[i]){
res[index++]=n;
flag=0;
}
res[index++]=arr[i];
}
for(i=0;i<len+1;i++){
printf("%d,",res[i]);
}
}
/*5、将一个数组中的值按逆序重新存放。例如,原来顺序为8、6、5、4、1。要求改为1、4、5、6、8。*/
void reSort(int arr[],int len){
int s=0,e=len-1,t;
while(s<e){
t=arr[s];
arr[s]=arr[e];
arr[e]=t;
s++;e--;
}
}
void printYh(){
int n,i,j;
printf("请输入多少行:");
scanf("%d",&n);
int arr[n];
arr[0]=1;
for(i=0;i<n;i++){
for(j=i-1;j>0;j--){
arr[j]=arr[j]+arr[j-1];
}
arr[i]=1;
for(j=0;j<=i;j++){
printf("%3d",arr[j]);
}
printf("\n");
}
}
/*输出奇魔方矩阵
1.第一个元素放在第一行中间一列
2.下一个元素存放在当前元素的上一行、下一列。
3.如果上一行、下一列已经有内容,则下一个元素的存放位置为当前列的下一行。
在找上一行、下一行或者下一列的时候,必须把这个矩阵看成是回绕的。
例如:
8 1 6
3 5 7
4 9 2
*/
void printMagic(){
int n,nowr,nowl,i,t;
printf("请输入多少行");
scanf("%d",&n);
if(n%2==0){
return ;
}
int arr[n][n];
/*初始化为0*/
for(nowr=0;nowr<n;nowr++){
for(nowl=0;nowl<n;nowl++){
arr[nowr][nowl]=0;
}
}
arr[0][n/2]=1;
nowr=0;
nowl=n/2;
for(i=2;i<=n*n;i++){
t=(nowr==0)? n-1:(nowr-1)%n;
if(arr[t][(nowl+1)%n]==0){/*上一行,下一列,没内容*/
nowr=t;
nowl=(nowl+1)%n;
arr[nowr][nowl]=i;
}else{
nowr=(nowr+1)%n;/*当前列的下一行*/
arr[nowr][nowl]=i;
}
}
/*打印*/
for(nowr=0;nowr<n;nowr++){
for(nowl=0;nowl<n;nowl++){
printf("%3d",arr[nowr][nowl]);
}
printf("\n");
}
}
/*8、找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。*/
void findANpot(int arr[5][4]){
int i,j,max,min,res1[5],res2[4];
/*每一行的最大值*/
for(i=0;i<5;i++){
max=0;
for(j=1;j<4;j++){
if(arr[i][j]>arr[i][max]){
max=j;
}
}
res1[i]=max;/*arr[i][max]处的值为当前第i行的最大值*/
}
/*每一列的最小值*/
for(i=0;i<4;i++){
min=0;
for(j=1;j<5;j++){
if(arr[j][i]<arr[min][i]){
min=j;
}
}
res2[i]=min;/*arr[min][i]处的值最小*/
}
for(i=0;i<5;i++){
if(i==res2[res1[i]]){
printf("pot=%d\n",arr[i][res1[i]]);
return ;
};
}
}
/*有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值
。如果该数不在数组中,则输出“无此数”。*/
void findIndexBydivd2n(int arr[],int len){
int s=0,e,m,n;
printf("请输入要查找的数:");
scanf("%d",&n);
e=len-1;
while(s<=e){
m=(s+e)/2;
if(n>arr[m]){
s=m+1;
}else if(n<arr[m]){
e=m-1;
}else{
printf("%d为当前数组的第%d个元素\n",n,m);
return;
}
}
printf("无此数\n");
}
int main(){
int arr[]={1,4,6,9,13,16,19,28,40,100};
int len=sizeof(arr)/sizeof(*arr);
findIndexBydivd2n(arr,len);
/*int i;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
};*/
printf("end\n");
return 0;
}
/*11、输出以下图案:
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
*/
void printxingx(){
int i,j,n;
printf("请输入多少行:");
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<i;j++)printf(" ");
for(j=0;j<n;j++)printf("* ");
printf("\n");
}
}
/*12、有一行电文,已按下面规律译成密码:
A →Z a →z
B →Y b →y
C →X c →x
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。*/
void printMm(char arr[]){
int len=strlen(arr),i;
char res[len];
for(i=0;i<len;i++){
if(arr[i]>='a' && arr[i]<='z'){
res[i]='z'-arr[i]+'a';
}else if(arr[i]>='A' && arr[i]<='Z'){
res[i]='Z'-arr[i]+'A';
}else{
res[i]=arr[i];
}
}
printf("密码为:%s\n",arr);
printf("原码为:%s\n",res);
}
/*13、编一程序,将两个字符串连接起来,不要用strcat函数。*/
void strCatFT(char *str1,char *str2){
int len1=strlen(str1);
int len2=strlen(str2);
int i=0;
for(;i<len2;i++){
str1[len1+i]=str2[i];
}
}
/*14、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。
不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应的ASCII码的差值。
例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’和‘C’的ASCII码差值为2,因此应输出“-2”。
同理:“And”“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,因此应输出“5”。*/
int compareStr(){
char s1[100],s2[100];
printf("请输入s1:");
gets(s1);
printf("请输入s2:");
gets(s2);
int len1=strlen(s1);
int len2=strlen(s2),min=len1,i;
if(len2<min){
min=len2;
}
for(i=0;i<min;i++){
if(s1[i]==s2[i]){
continue;
}
return s1[i]-s2[i];
}
return s1[i]-s2[i];
}
/*编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,‘/0’后面的字符不复制。*/
void copyStrff(){
char s1[200],s2[200];
printf("请输入s2:");
scanf("%s",s2);
int i;
do{
s1[i]=s2[i];
}while(s2[i++]!='\0');
printf("s1=%s\n",s1);
}
/*求方程 的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。 */
void printGenOver0(float a,float b,float c){
float t=sqrt(pow(b,2)-4*a*c);
printf("x1=%.2f,x2=%.2f\n",(-b+t)/(2*a),(-b-t)/(2*a));
}
void printGenLow0(float a,float b,float c){
float ti=sqrt(4*a*c-pow(b,2))/(2*a);
float t=-b/(2*a);
printf("x1=%.2f+%.2fi,x2=%.2f+%.2fi\n",t,ti,t,ti);
}
void printGenEqual0(float a,float b,float c){
float t=sqrt(pow(b,2)-4*a*c);
printf("x1=%.2f,x2=%.2f\n",(-b+t)/(2*a),(-b-t)/(2*a));
}
/*7.4写一个函数,使给定的一个二维数组(4×4)转置,即行列互换。 */
void reversArrs(int arr[4][4]){
int i,j,t;
for(i=0;i<3;i++){
for(j=i+1;j<4;j++){
t=arr[i][j];
arr[i][j]=arr[j][i];
arr[j][i]=t;
}
}
}
/*7.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。*/
void reverseStr(char arr[]){
int e=strlen(arr)-1;
int s=0;
char t;
while(s<e){
t=arr[s];
arr[s]=arr[e];
arr[e]=t;
e--;s++;
}
}
/*7.10写一函数,输入一行字符,将此字符串中最长的单词输出。 */
void printWordLong(){
char str[100];
printf("请输入一行字符串:");
scanf("%[^\n]",str);
int i=0,t[2],max=0,s=0;
int len=strlen(str);
for(;i<len;i++){
if(str[i]==' '){
if(i-s>max){
max=i-s;
t[0]=s;
t[1]=i;
}
s=i;
}
}
/*最后一个单词*/
if(i-s>max){
max=i-s;
t[0]=s;
t[1]=i;
}
for(i=t[0];i<t[1];i++){
printf("%c",str[i]);
}
}
/*7.11写一函数用起泡法对输入的字符按由小到大的顺序排列。*/
void sort_bubble(char arr[]){
int len=strlen(arr),i=0,j=0;
char t;
for(i=0;i<len-1;i++){
for(j=1;j<len-i;j++){
if(arr[j-1]>arr[j]){
t=arr[j-1];
arr[j-1]=arr[j];
arr[j]=t;
}
}
}
}
/*用牛顿迭代法求根。方程为: ,系数a,b,c,d由主函数输入。求X在1附近的一个实根。求出后由主函数输出。*/
float getGenByNiuDun(float a,float b,float c,float d){
float x,y;
x=1;
do{
y=a*pow(x,3)+b*pow(x,2)+c*x+d;
x=x-y/(3*a*x*x+2*b*x+c);
}while(y>1e-6);
return x;
}
/*7.13用递归方法求n阶勒让德多项式的值递归公式为 */
float lrddn(int n,float x){
if(n==0){
return 1;
}
if(n==1){
return x;
}
return ((2*n-1)*x-lrddn(n-1,x)-(n-1)*lrddn(n-2,x))/n;
}
/*7.13用动态法求n阶勒让德多项式*/
float lrddnd(int n,float x){
int i;
float pn1=x,pn2=1,t;
for(i=2;i<=n;i++){
t=((2*i-1)*x-pn1-(i-1)*pn2)/i;
pn2=pn1;
pn1=t;
}
return pn1;
}
7.14输入10个学生5门课的成绩,分别用函数求:
①每个学生平均分;
②每门课的平均分;
③找出最高分所对应的学生和课程;
④求平均分方差:δ=[SXi2]/n-(SXi/n)2,xi为一学生的平均分
//①每个学生平均分;
void getStuAvg10(float arr[10][5],float stu[10]){
int i,j;
float sum;
for(i=0;i<10;i++){
sum=0;
for(j=0;j<5;j++){
sum+=arr[i][j];
}
stu[i]=sum/5;
}
}
/*②每门课的平均分;*/
void getCourseAvg5(float arr[10][5],float course[5]){
int i,j;
float sum;
for(j=0;j<5;j++){
sum=0;
for(i=0;i<10;i++){
sum+=arr[i][j];
}
course[j]=sum/10;
}
}
/*③找出所有50个分数中最高分所对应的学生和课程;*/
void getCoursMax(float arr[10][5]){
int i,j,cno,sno;
float maxPoint=0;
for(i=0;i<10;i++){
for(j=0;j<5;j++){
if(arr[i][j]>maxPoint){
maxPoint=arr[i][j];
cno=j;
sno=i;
}
}
}
printf("%d学生的%d课程为最高分%.2f\n",sno,cno,maxPoint);
}
/*④求平均分方差:δ=[SXi^2]/n-(SXi/n)^2,xi为一学生的平均分 */
float getFangcha(float arr[10][5]){
float stu[10],sum1=0,sum2=0;
getStuAvg10(arr,stu);
int i;
for(i=0;i<10;i++){
sum1+=stu[i];
sum2+=stu[i]*stu[i];
}
return sum2/10-pow((sum1/10),2);
}
int main(){
float arr[10][5]={{10,10 ,10,10 ,10},
{21,21 ,23,23 ,26},
{31,34 ,36,34 ,31},
{51,55 ,50,50 ,58},
{65,61 ,67,68 ,64},
{70,70 ,70,70 ,70},
{81,81 ,83,83 ,86},
{91,94 ,96,94 ,91},
{41,45 ,40,40 ,48},
{65,61 ,67,68 ,64}};
float stu[10];
float course[5];
getStuAvg10(arr,stu);
getCourseAvg5(arr,course);
getCoursMax(arr);
int i;
for(i=0;i<10;i++){
printf("%.2f,",stu[i]);
}
printf("\n没门课程的平均分为:");
for(i=0;i<5;i++){
printf("%.2f,",course[i]);
}
printf("\n方差为:%.2f\n",getFangcha(arr));
printf("end\n");
return 0;
}
7.15写几个函数:
①输10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
/* 结构体*/
typedef struct
{
int eno;
char name[20];
} Emp;
/*②按职工号由小到大顺序排序,姓名顺序也随之调整;*/
void sortByEno(Emp arr[10]){
int i,j;
Emp t;
/*插入排序*/
for(i=0;i<9;i++){
for(j=i+1;j>0;j--){
if(arr[j-1].eno>arr[j].eno){
t=arr[j-1];
arr[j-1]=arr[j];
arr[j]=t;
}else{
break;
}
}
}
}
/*③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。*/
void getNameByNum(int eno,Emp arr[10],char res[]){
int i=0,j=9,m;
while(i<=j){
m=(i+j)/2;
if(arr[m].eno<eno){
i=m+1;
}else if(arr[m].eno>eno){
j=m-1;
}else{
strcpy(res,arr[m].name);
break;
}
}
}
int main(){
Emp arr[10];
int i;
for(i=0;i<10;i++){
Emp e;
e.eno=1100-i;
sprintf(e.name,"员工_%d",i);
arr[i]=e;
}
sortByEno(arr);
for(i=0;i<10;i++){
printf("编号:%d,姓名:%s\n",arr[i].eno,arr[i].name);
}
char name[20];
getNameByNum(1094,arr,name);
printf("1094name=%s\n",name);
printf("end\n");
return 0;
}
7.16写一函数,输入一个十六进制数,输出相应的十进制数。 (各种进制转换)
/*7.16写一函数,输入一个十六进制数,输出相应的十进制数。*/
int hexToDec(char arr[]){
int i,len,c,res=0;
len=strlen(arr)-1;
for(i=len;i>=0;i--){
c=arr[i];
if(c>'9'){
c=10+c-'A';
}else{
c=c-'0';
}
res+=c*pow(16,len-i);
}
return res;
}
/*10进制转十六*/
void DecToHex(int n){
char arr[n];
int t,i=0;
while(n>0){
t=n%16;
if(t>9){
arr[i]='A'+t%10;
}else{
arr[i]='0'+t;
}
i++;
n=n/16;
}
i--;
for(;i>=0;i--){
printf("%c",arr[i]);
}
}
int main(){
char arr[100];
int t;
printf("请输入一个16进制:");
scanf("%[^\n]",arr);
t=hexToDec(arr);
printf("%s的十进制为%d\n16进制为:",arr,t);
DecToHex(t);
printf("end\n");
return 0;
}
/*二进制转10进制*/
int binary2Decimal(long n){
int res=0,i=0,oz=0;
while(n>0){
oz=n%10;
res=res+oz*pow(2,i++);
n=n/10;
printf("n为%d\n",n);
}
return res;
}
/*十进制转二进制*/
long long decimal2Bin(int n){
int res=0,i=1,oz=0;
while(n>0){
oz=n%2;
res+=oz*pow(10,i);
i++;
n=n/2;
}
return res;
}
/*八进制转十进制*/
int octal2decimal(long long n){
int res=0,i=0,oz=0;
while(n>0){
oz=n%10;
res+=oz*pow(8,i);
i++;
n=n/10;
}
return res;
}
/*十进制转八进制*/
long long decimal2octal(int n){
int res=0,i=1,oz=0;
while(n>0){
oz=n%8;
res+=pow(10,i)*oz;
n=n/8;
i++;
}
return res;
}
/*八进制转二进制*/
long long octal2bin(long long n){
int res=0,i=0,oz=0;
/*八转十*/
while(n>0){
oz=n%10;
res+=oz*pow(8,i);
n=n/10;
i++;
}
n=res;
res=0,i=1,oz=0;
/*十转二*/
while(n>0){
oz=n%2;
res+=oz*pow(10,i);
n=n/2;
i++;
}
return res;
}
/*二进制转八进制*/
long long bin2octal(long long n){
int res=0,i=0,oz=0;
/*二转十*/
while(n>0){
oz=n%10;
res+=oz*pow(2,i);
i++;
n=n/10;
}
n=res;
res=0,i=1,oz=0;
/*十转八*/
while(n>0){
oz=n%8;
res+=oz*pow(10,i);
i++;
n=n/8;
}
return res;
}
7.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。
/**/
int i=0;
void numToStr(unsigned long n,char arr[]){
if(n==0){
return ;
}
numToStr(n/10,arr);
arr[i++]=n%10+'0';
}
int main(){
unsigned long t;
char arr[100];
printf("请输入一个数:");
scanf("%d",&t);
numToStr(t,arr);
arr[i]='\0';
printf("%s",arr);
printf("end\n");
return 0;
}
7.18给出年、月、日,计算该日是该年的第几天。
/*判断是否是闰年1是*/
int isRunyear(int i){
if((i%4==0 && i%100!=0) || (i%400==0)) return 1;
return 0;
}
/*7.18给出年、月、日,计算该日是该年的第几天。 */
int getHowMany(int y,int m,int d){
int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(isRunyear(y)){
arr[1]=29;
}
int i=0,sum;
for(;i<m-1;i++){
sum+=arr[i];
}
sum+=d;
return sum;
}
int main(){
int y, m, d;
printf("请输入年:");
scanf("%d",&y);
printf("请输入月:");
scanf("%d",&m);
printf("请输入日:");
scanf("%d",&d);
printf("\n第%d天\n",getHowMany(y,m,d));
printf("end\n");
return 0;
}
8.1 输入三个整数,按由小到大的顺序输出。(第8章全部用指针实现)
/*10.1 输入三个整数,按由小到大的顺序输出。(冒泡泡实现)*/
void printFromMtoM(int *a,int *b,int *c){
int t;
if(*b<*a){
t=*a;*a=*b;*b=t;
}
if(*c<*b){
t=*c;*c=*b;*b=t;
}
if(*b<*a){
t=*a;*a=*b;*b=t;
}
printf("%d<%d<%d",*a,*b,*c);
}
int main(){
int a,b,c,*y, *m, *d;
printf("请输入三个数:");
scanf("%d,%d,%d",&a,&b,&c);
y=&a;
m=&b;
d=&c;
printFromMtoM(y,m,d);
printf("end\n");
return 0;
}
8.2 输入三个字符串,按由小到大的顺序输出
/**/
void printStrFromMtoM(char *a,char *b,char *c){
char *t;
if(strcmp(a,b)>0){
t=a;a=b;b=t;
}
if(strcmp(b,c)>0){
t=c;c=b;b=t;
}
if(strcmp(a,b)>0){
t=a;a=b;b=t;
}
printf("%s<%s<%s\n",a,b,c);
}
int main(){
char a[20],b[20],c[20];
printf("请输入三字符串:");
scanf("%s%s%s",a,b,c);
printStrFromMtoM(a,b,c);
printf("end\n");
return 0;
}
8.3 输入 10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写 三个函数,①输入 10个数,②进行处理,③输出10个数。
/**/
void changeArr(int *arr,int len){
int i=1,max=0,min=0;
if(len <=0){
return ;
}
for(;i<len;i++){
if(arr[i]>arr[max]){
max=i;
}else if(arr[i]<arr[min]){
min=i;
}
}
i=arr[max];
arr[max]=arr[len-1];
arr[len-1]=i;
i=arr[min];
arr[min]=arr[0];
arr[0]=i;
}
void changeArr(int *arr,int len){
if(len <=0){
return ;
}
int i=1,*max,*min;
max=arr,min=arr;
for(;i<len;i++){
if(arr[i]>*(max)){
max=arr+i;
}else if(arr[i]<*(min)){
min=arr+i;
}
}
i=*(max);
*(max)=*(arr+len-1);
*(arr+len-1)=i;
i=*(min);
*(min)=*(arr);
*(arr)=i;
}
int main(){
int arr[]={5,8,1,2,4,3,6,9,0,10,7};
int len=sizeof(arr)/sizeof(*arr);
printf("len=%d\n",len);
changeArr(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
};
printf("end\n");
return 0;
}
8.4 有 n 个整数,使前面各数顺序向后移 m个位置,最后 m个数变成前面 m个数
/*在主函数中输入 n个数和输出调整后的 n个数。*/
void changeArrIndex(int *arr,int n,int m){
int i=0,res[n];
for(;i<n;i++){
*(res+(i+m)%n)=*(arr+i);
}
for(i=0;i<n;i++){
*(arr+i)=*(res+i);
}
}
int main(){
int arr[]={5,8,1,2,4,3,6,9,0,10,7};
int len=sizeof(arr)/sizeof(*arr);
printf("len=%d\n",len);
changeArrIndex(arr,len,1);
int i;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
};
printf("end\n");
return 0;
}
8.5 有 n 人围成一圈,顺序排号。从第 1 个人开始报数,从 1 到 3 报数,凡报到 3 的人退 出圈子,问最后留下的是原来的第几号的那位。
/*约瑟夫问题
*/
int getLast(int n){
int arr[n],i=0,c=0,res,l=n;
while(l>1){
if(arr[i]!=-1){
if(c==2){
arr[i]=-1;
l--;
}else{
res=i;
}
c=(c+1)%3;
}
i=(i+1)%n;
}
return res+1;
}
int main(){
printf("last=%d\n",getLast(10));
printf("end\n");
return 0;
}
8.7有一字符串,包含 n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
/**/
void getCopyFromm(char *from,char *to,int m){
int len=strlen(from),i;
for(i=m;i<len;i++){
to[i-m]=from[i];
}
to[i-m]='\0';
}
int main(){
char *from="hello wojdh!",to[50];
getCopyFromm(from,to,5);
printf("to=%s\n",to);
printf("end\n");
return 0;
}
8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放在4个最小的元素(按从左到右,从上到下顺序依次从小到大存放),写一函数实现,用main函数调用
/*10.10*/
void changeArrs(int arr[5][5]){
int res[5],i,j,k,l=0,t,temp[25];
for(i=0;i<5;i++){
for(j=0;j<5;j++){
temp[l++]=arr[i][j];
}
}
/*冒泡排序*/
for(i=0;i<25;i++){
for(j=1;j<25-i;j++){
if(temp[j]<temp[j-1]){
t=temp[j];
temp[j]=temp[j-1];
temp[j-1]=t;
}
}
}
res[4]=temp[24];
printf("res=%d\n",res[4]);
for(i=0;i<4;i++)res[i]=temp[i];
/*按从左到右,从上到下顺序依次从小到大存放*/
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(arr[i][j]==res[0]){
t=arr[0][0];
arr[0][0]=res[0];
arr[i][j]=t;
res[0]=-1;
i=0,j=0;
}else if(arr[i][j]==res[1]){
t=arr[0][4];
arr[0][4]=res[1];
arr[i][j]=t;
res[1]=-1;
i=0,j=0;
}else if(arr[i][j]==res[2]){
t=arr[4][4];
arr[4][4]=res[2];
arr[i][j]=t;
res[2]=-1;
i=0,j=0;
}else if(arr[i][j]==res[3]){
t=arr[4][0];
arr[4][0]=res[3];
arr[i][j]=t;
res[3]=-1;
i=0,j=0;
}else if(arr[i][j]==res[4]){
t=arr[2][2];
arr[2][2]=res[4];
arr[i][j]=t;
res[4]=-1;
i=0,j=0;
}
}
}
}
int main(){
int array[5][5] ={{5,4,0,15,65},
{6,7,9,14,16},
{98,75,66,47,32},
{10,53,1,13,19},
{120,99,35,39,28}};
changeArrs(array);
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
printf("end\n");
return 0;
}
8.11在主函数中输入12个等长的字符串。用另一个函数对他们排序。然后在主函数输出这12个已排序好的字符串。
/**/
void sortArr(char arr[12][10]){
int i,j;
char t[10];
for(i=0;i<11;i++)
{
for(j=0;j<12-i;j++){
if(strcmp(arr[j],arr[j-1])<0){
strcpy(t,arr[j]);
strcpy(arr[j],arr[j-1]);
strcpy(arr[j-1],t);
}
}
}
}
int main(){
char str[12][10] = {"January","February","March","April",
"May","June","July","August","September","October",
"November","December"};
sortArr(str);
int i,j;
for(i=0;i<12;i++){
printf("%s\n ",str[i]);
}
printf("end\n");
return 0;
}
8.12 用指针数组处理上一题目,字符串不等长。
/**/
void sortArr(char *arr[12]){
int i,j;
char *t;//test
for(i=0;i<11;i++)
{
for(j=1;j<12-i;j++){
if(strcmp(arr[j],arr[j-1])<0){
t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
}
}
}
}
int main(){
char *str[12],*temp[12]={"January","February","March","April",
"May","June","July","August","September","October",
"November","December"};
int i,j;
for (i=0; i<12; i++){
str[i]=(char *)malloc(10*sizeof(char)); //为指针数组分配内存动态空间
str[i]=temp[i];
}
sortArr(str);
for(i=0;i<12;i++){
printf("%s\n ",str[i]);
}
printf("end\n");
return 0;
}
8.13用矩形法求定积分的通用函数,分别求 1.sinx, 2.cosx,3.e^x
/**/
double getJifen(double top,double bottom,int func){
double (*fun)(double);//定义函数指针
switch (func){
case 1:
fun=sin;
break;
case 2:
fun=cos;
break;
case 3:
fun=exp;
break;
}
double sum=0;
int i,offset=200000;
double o=(top-bottom)/offset;
double x=bottom;
for(i=1;i<=offset;i++){
x=x+o;
sum+=(*fun)(x)*o;
}
return sum;
}
int main(){
double pi = 3.141592;
printf("%f\n ",getJifen(pi,0,1));//2.000
printf("end\n");
return 0;
}
8.14将N个数按输入时顺序的逆序排列,用函数实现
/*8.14将N个数按输入时顺序的逆序排列,用函数实现*/
double backWardRank(int *arr,int n){
int i,t;
n--;
for(i=0;i<n;i++,n--){
t=*(arr+i);
*(arr+i)=*(arr+n);
*(arr+n)=t;
}
}
int main(){
int arr[]={5,8,1,2,4,3,6,9,0,10,7};
int len=sizeof(arr)/sizeof(*arr);
backWardRank(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
};
printf("end\n");
return 0;
}
输入一个字符串,内有数字和非数字字符。如A123X456Y7A,302ATB567BC,打印字符串中所有连续(指不含非数字字符)的数字所组成的整数。
/**/
int getNums(char *str,long long res[]){
char *t=str,nums[11];
int i,j=0;
long long num;
while(*t!='\0'){
i=0;
while(*t>='0' && *t<='9'){
nums[i++]=*t;
t++;
}
nums[i]='\0';
num = atol(nums);
if(num>0){//这里没有考虑0的情况
res[j++]=num;
}
t++;
}
return j;
}
int main(){
char *arr={"A123X456Y7A,302ATB567BC"};
long long res[100];
;
int i;
int len=getNums(arr,res);
for(i=0;i<len;i++){
printf("%d,",res[i]);
};
printf("end\n");
return 0;
}
实现strcpy
/*字符串复制:值复制*/
void stringcopy1(char *to,char *from){
int i;
for(;from[i]!='\0';i++){
to[i]=from[i];
}
to[i]='\0';
}
/*字符串复制:值复制*/
void stringcopy2(char *to,char *from){
int i;
for(;from[i]!='\0';i++){
*(to+i)=*(from+i);
}
to[i]='\0';
}
int main(){
char p[]="A123X456Y7A,302ATB567BC";
char *arr;
arr=p;
char res[100];
stringcopy1(res,arr);
printf("%s\n",res);
*(arr)='b';
stringcopy2(res,arr);
printf("%s\n",res);
printf("end\n");
return 0;
}
实现strcmp
/*17、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。
不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应的ASCII码的差值。
例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’和‘C’的ASCII码差值为2,因此应输出“-2”。
同理:“And”“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,因此应输出“5”。*/
int strcmp1(char *s1,char *s2){
int len1=strlen(s1);
int len2=strlen(s2);
int min=len1,i;
if(len1>len2){
min=len2;
}
for(i=0;i<min;i++){
if(s1[i]!=s2[i]){
break;
}
}
return s1[i]-s2[i];
}
int main(){
char *s1="A123X";
char *s2="A123X";
printf("%d\n",strcmp1(s1,s2));
printf("end\n");
return 0;
}
8.18编写一个程序,输入月份号,输出该月份号的英文名称。例如输入8,测输出“August”,要求用指针数组处理
/*8.18编写一个程序,输入月份号,输出该月份号的英文名称。例如输入8,测输出“August”,要求用指针数组处理。*/
void printfEn(int num){
char *str[12] = {"January","February","March","April",
"May","June","July","August","September","October",
"November","December"};
printf("%s\n",*(str+num-1));
}
int main(){
printfEn(12);
printf("end\n");
return 0;
}
习题 8.19(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间(2)释放free;
/*习题 8.19(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),
指向字符串开始的空间。new(n)表示分配n个字节的内存空间*/
char *news(int n){
char *p;
p=(char *)malloc(n*sizeof(char));
return p;
}
int main(){
char *t=news(12);
char s='a';
for(;s<'l';s++){
*t=s;
t++;
}
*t='\0';
printf("k=%c\n",*(t-1));
printf("str=%s\n",t-11);
free(t-11);//释放地址
printf("str=%s\n",t-11);
printf("end\n");
return 0;
}
用指向指针的方法对5个字符串排序并输出
/*用指向指针的方法对5个字符串排序并输出*/
void sortArr(char **str){
int len=12;
char *t,**p1,**p2;
for(p1=str;p1<str+len-1;p1++)//冒泡
{
for(p2=str+1;p2<str+len;p2++){
if(strcmp(*(p2),*(p2-1))<0){
t=*p2;
*p2=*(p2-1);
*(p2-1)=t;
}
}
}
}
int main(){
int i;
char str[12][10] = {"January","February","March","April",
"May","June","July","August","September","October",
"November","December"};
char *str1[12],**s;
for(i=0;i<12;i++){
str1[i]=str[i];
};
s=str1;
sortArr(s);
for(i=0;i<12;i++){
printf("%s,",*(s+i));
};
printf("end\n");
return 0;
}
8.21用指向指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和整数在主函数中输入。最后在主函数中输出。
/*8.21用指向指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和
整数在主函数中输入。最后在主函数中输出。
*/
void sortArrByPoint(int *arr,int len){
int t,*p1,*p2;
for(p1=arr;p1<arr+len-1;p1++)//冒泡
{
for(p2=arr+1;p2<arr+len;p2++){
if(*p2<*(p2-1)){
t=*p2;
*p2=*(p2-1);
*(p2-1)=t;
}
}
}
}
int main(){
int arr[]={5,8,1,2,4,3,6,9,0,10,7};
int len=sizeof(arr)/sizeof(*arr);
sortArrByPoint(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d,",arr[i]);
};
printf("end\n");
return 0;
}
9.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
/*9.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。*/
typedef struct{
int y;
int m;
int d;
}Data;
/*判断是否是闰年1是*/
int isRunyear(int i){
if((i%4==0 && i%100!=0) || (i%400==0)) return 1;
return 0;
}
/*计算该日在本年中是第几天,注意闰年问题。 */
int getHowMany(Data d){
int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(isRunyear(d.y)){
arr[1]=29;
}
int i=0,sum;
for(;i<d.m-1;i++){
sum+=arr[i];
}
sum+=d.d;
return sum;
}
int main(){
Data d;
d.y=2020;
d.m=12;
d.d=31;
printf("第%d天\n",getHowMany(d));
printf("end\n");
return 0;
}
编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录
/*9.3编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,
每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。
编写一个函数input,用来输入5个学生的数据记录。*/
typedef struct{
int num;
char name[20];
int score[3];
}stu;
void printfStu(stu *s,int len){
int i;
stu *p,t;
for(p=s;p<s+len;p++){
t=*p;
printf("学号:%d,姓名:%s,",t.num,t.name);
for(i=0;i<3;i++){
printf("第%d门成绩为%d",i+1,t.score[i]);
}
printf("\n");
}
}
void input1(stu *s,int len){
int i,j;
for(i=0;i<len;i++){
s[i].num=1000+i;
sprintf(s[i].name,"%s_0%d","学生",i);//学生_0i
for(j=0;j<3;j++){
s[i].score[j]=rand()%50+50;
}
}
}
int main(){
stu ss[10];
input1(ss,10);
printfStu(ss,10);
printf("end\n");
return 0;
}
有10个学生,每个学生的数据包括学号、姓名、3门课的成绩
/*9.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)*/
double *getAvgScore(stu *s,int len){
double *p;
p=(double *)malloc(3*sizeof(double));
int i,j;
for(i=0;i<len;i++){
for(j=0;j<3;j++){
p[j]+=s[i].score[j];
}
}
for(j=0;j<3;j++){
p[j]=p[j]/len;
}
return p;
}
int main(){
stu ss[10];
input1(ss,10);
double *p=getAvgScore(ss,10);
int j;
for(j=0;j<3;j++){
printf("%f\n",p[j]);
}
printf("end\n");
return 0;
}
9.7-9.9链表的增删改
/*9.7-9.9链表的增删改*/
struct Stu{//结构体
int no;
float score;
struct Stu *next;
}stu;
struct Stu * creatStu(int n){//创建具有n个节点的链表
struct Stu *head,*last,*t;
head=malloc(sizeof(stu));
last=head;
while(n>0){
t=malloc(sizeof(stu));
t->no=1100-n;
t->score=rand()%50+50;
last->next=t;
last=t;
n--;
}
return head;
}
void printfStu(struct Stu *s){//打印stu
struct Stu *t;
t=s->next;
while(t!=NULL){
printf("学号%d,分数%.2f\n",t->no,t->score);
t=t->next;
};
}
void addStu(struct Stu *s){//添加
struct Stu *t;
t=s;
while(t->next!=NULL){
t=t->next;
};
struct Stu *news=malloc(sizeof(stu));
news->no=t->no+1;
news->score=rand()%50+50;
t->next=news;
}
void delStu(struct Stu *s,struct Stu *del){//删除指定节点
struct Stu *t,*pre;
t=s->next;
pre=s;
printf("学号%d,分数%.2f\n",del->no,del->score);
while(t!=NULL){
if(t->no==del->no){
pre->next=t->next;
break;
}
pre=t;
t=t->next;
};
}
int main(){
int n=10;
struct Stu *s=creatStu(n),*t;
printfStu(s);
printf("end\n");
addStu(s);
struct Stu *news=malloc(sizeof(stu));
news->no=1098;
delStu(s,news);
printfStu(s);
printf("end\n");
return 0;
}
9.10合并两个链表,按照学号升序排列,s2合并给s1
/*按照学号升序排序*/
void sortLinkListAsc(struct Stu *s){
struct Stu *min,*news,*t;
int no;
float score;
news=s->next;
while(news!=NULL){//选择排序
min=news;
t=news->next;
while(t!=NULL){
if(t->no<min->no){
min=t;
}
t=t->next;
}
no=min->no;
score=min->score;
min->no=news->no;
min->score=news->score;
news->no=no;
news->score=score;
news=news->next;
}
}
/*9.10合并两个链表,按照学号升序排列,s2合并给s1*/
void mergeStuAndSort(struct Stu *s1,struct Stu *s2){
struct Stu *t;
t=s1;
while(t->next!=NULL){
t=t->next;
}
t->next=s2->next;
sortLinkListAsc(s1);
}
int main(){
int n=10;
struct Stu *s1=creatStu(n),*s2=creatStu(3);
mergeStuAndSort(s1,s2);
printfStu(s1);
printf("end\n");
return 0;
}
9.11有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点
/*9.11有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点*/
void delBfromA(struct Stu *a,struct Stu *b){
struct Stu *t1,*t2,*pre;
t1=a->next;
t2=b->next;
pre=a;
while(t1!=NULL){
t2=b->next;
while(t2!=NULL){
if(t1->no==t2->no){
pre->next=t1->next;
t1=pre;
break;
}
t2=t2->next;
}
pre=t1;
t1=t1->next;
};
}
int main(){
int n=10;
struct Stu *s1=creatStu(n),*s2=creatStu(3);
delBfromA(s1,s2);
printfStu(s1);
printf("end\n");
return 0;
}
9.12建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
/*9.12建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,
如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。*/
struct Student{//结构体
int no;
char name[10];
int sex;
int age;
struct Student *next;
}student;
struct Student * creatStu1(int n){//创建具有n个节点的链表,有头节点的链表
struct Student *head,*last,*t;
head=malloc(sizeof(student));
last=head;
while(n>0){
t=malloc(sizeof(student));
t->no=Total--;
sprintf(t->name,"%s_0%d","学生",n);//学生_0i
t->sex=rand()%2;
t->age=10+n%5;
last->next=t;
last=t;
n--;
}
return head;
}
void printfStu1(struct Student *s){//打印stu
struct Student *t;
t=s->next;
while(t!=NULL){
printf("学号%d,姓名%s,性别%d,年龄%d\n",t->no,t->name,t->sex,t->age);
t=t->next;
};
}
void delLinkedListByage(struct Student *s,int age){
struct Student *t,*pre;
t=s->next;
pre=s;
while(t!=NULL){
if(t->age==age){
pre->next=t->next;
t=pre;
}
pre=t;
t=t->next;
};
}
int main(){
int n=10;
struct Student *s1=creatStu1(n);
printfStu1(s1);
delLinkedListByage(s1,12);
printfStu1(s1);
printf("end\n");
return 0;
}
10.4从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘 文件“test”中保存。输入的字符串以“!”结束
/*10.4 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,
然后输出到一个磁盘 文件“test”中保存。输入的字符串以“!”结束。*/
void inputAllUpcase(char strs[]){
int i,len=strlen(strs);
while(strs[i]!='!'){
if(strs[i]>='a' && strs[i]<='z'){
strs[i]=strs[i]-32;
}
i++;
}
FILE *f;
f=fopen("./test","a+");
fputs(strs,f);
fclose(f);
}
void printfFile(FILE *f){
if(f==NULL){
printf("输入的文件不存在!");
exit(0);
}
fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
long size=ftell(f);//获取从文件头到文件指针处的的长度
char buff[size+1];
fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
buff[size]='\0';//加上结束符
printf("file content is:%s\n",buff);
fclose(f);
}
int main(){
char strs[100];
printf("请输入字符串于!结束");
scanf("%s",strs);//gets(strs);新的版本出错!
inputAllUpcase(strs);
FILE f=fopen("./test","r+");
printfFile(f);
printf("end\n");
return 0;
}
10.5 有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,输出到一个新文件”C”中。
void printfFile(FILE *f){
if(f==NULL){
printf("输入的文件不存在!");
exit(0);
}
fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
long size=ftell(f);//获取从文件头到文件指针处的的长度
char buff[size+1];
fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
buff[size]='\0';//加上结束符
printf("file content is:%s\n",buff);
fclose(f);
}
/*读取文件中的所有内容,返回字符串*/
char *getAllFileContent(FILE *f){
if(f==NULL){
printf("输入的文件不存在!");
exit(0);
}
fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
long size=ftell(f);//获取从文件头到文件指针处的的长度
char *buff=malloc((size+1)*sizeof(char));//在堆上分配内存,因为函数栈结束之后,局部变量中的数据分配在栈内存空间的,一旦函数结束之后,内存就被释放,会出现乱码,或者被分配给其他函数
fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
buff[size]='\0';//加上结束符
fclose(f);
return buff;
}
/*根据字母大小排序*/
sortByWord(char *str){
int i,j,len=strlen(str)-1;
char t;
for(i=0;i<len-1;i++){//冒泡
for(j=1;j<len-i;j++){
if(str[j]<str[j-1]){
t=str[j];
str[j]=str[j-1];
str[j-1]=t;
}
}
}
}
void merge2C(char *a,char *b){
int i=0,j=0;
char t;
FILE *f;
f=fopen("./C","a+");
while((a[i]!='\0' && a[i]!='\n') || (b[j]!='\n' && b[j]!='\0')){
if(a[i]>b[j] && b[j]!='\0' && b[j]!='\n' ){
t=b[j];
j++;
}else{
t=a[i];
i++;
}
fputc(t,f);
}
printfFile(f);
}
/*13.5 有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,
输出到一个新文件”C”中。*/
void mergeAndSortAndSave(){
FILE *fa,*fb;
fa=fopen("./A","r+");
fb=fopen("./B","r+");
char *a=getAllFileContent(fa);
char *b=getAllFileContent(fb);
sortByWord(a);
sortByWord(b);
printf("a is:%s\n",a);
printf("b is:%s\n",b);
merge2C(a,b);
free(a);//通过malloc分配的堆内存需要手动释放空间!
free(b);
}
int main(){
mergeAndSortAndSave();
printf("end\n");
return 0;
}
10.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据,包括学生号、姓名、三 门课成绩,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件 stud 中
/*10.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据,包括学生号、姓名、三 门课成绩,,
计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件 stud 中。 */
typedef struct{
int num;
char name[20];
int score[3];
}stu;
void inputStuData(stu s[],int len){
int i;
printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
for(i=0;i<len;i++){
scanf("%d %s %d %d %d",&s[i].num,&s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
}
}
void outPutFile(stu s[],int len){
int i;
float sum;
FILE *f;
f=fopen("./stud","a+");
fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
for(i=0;i<len;i++){
sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],sum/3);
}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
fclose(f);
}
int main(){
stu s[5];
inputStuData(s,5);
outPutFile(s,5);
printf("end\n");
return 0;
}
10.7 将上题 stud 文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一 个新文件 stu-sort 中
/*10.7 将上题 stud 文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一 个新文件 stu-sort 中*/
void readStud(stu s[]){
FILE *f;
char tmp[255];
int i=0;
f=fopen("./stud","r+");
fgets(tmp,255,f);
while(!feof(f)){
fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
i++;
}
fclose(f);
}
void sortByAvg(stu s[],int len){
int i,j;
stu t;
for(i=0;i<len-1;i++){
for(j=1;j<len-i;j++){
if(s[j].avg<s[j-1].avg){
t=s[j];
s[j]=s[j-1];
s[j-1]=t;
}
}
}
}
void outPutSortFile(stu s[],int len){
int i;
FILE *f;
f=fopen("./stu-sort","a+");
fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
for(i=0;i<len;i++){
fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
fclose(f);
}
int main(){
stu s[5];
readStud(s);
sortByAvg(s,5);
outPutSortFile(s,5);
printf("end\n");
return 0;
}
10.8 将上题以排序的学生成绩文件进行插入处理。插入一个学生的 3 门课成绩,程序先计算 新插入学生的平均成绩,然后将它按平均成绩由低到高的顺序插入,插入后建立一个新文件。
/*10.8 将上题以排序的学生成绩文件进行插入处理。插入一个学生的 3 门课成绩,程序先计算 新插入学生的平均成绩,
然后将它按平均成绩由低到高的顺序插入,插入后建立一个新文件。*/
typedef struct{
int num;
char name[20];
int score[3];
float avg;
}stu;
void inputStuData(stu s[],int len){
int i;
printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
float sum;
for(i=0;i<len;i++){
scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
s[i].avg=sum/3;
}
}
void readStud(stu s[],char *filename){
FILE *f;
char tmp[255];
int i=0;
f=fopen(filename,"r+");
fgets(tmp,255,f);
while(!feof(f)){
fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
i++;
}
fclose(f);
}
void outPutSortFile(stu s[],int len,char *filename){
int i;
FILE *f;
f=fopen(filename,"a+");
fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
for(i=0;i<len;i++){
fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
fclose(f);
}
void insertNew(stu ss[],stu s,int len){
int i;
len--;
for(i=0;i<len;i++){
if(s.avg<ss[i].avg){
while(i<len){
ss[len]=ss[len-1];
len--;
}
break;
}
}
ss[i]=s;
}
int main(){
stu s1[1],s[6];
char *fileName,*newFileName;
fileName="./stu-sort";
newFileName="./nstu-sort";
inputStuData(s1,1);//新添加学生信息
readStud(s,fileName);//读取文件里面的学生信息
/*插入*/
insertNew(s,s1[0],6);
outPutSortFile(s,6,newFileName);//存入新的文件
printf("end\n");
return 0;
}
10.9 上题结果仍存入原有的 stu_sort 文件而不另建立新文件。
/*10.9 上题结果仍存入原有的 stu_sort 文件而不另建立新文件。*/
typedef struct{
int num;
char name[20];
int score[3];
float avg;
}stu;
void inputStuData(stu s[],int len){
int i;
printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
float sum;
for(i=0;i<len;i++){
scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
s[i].avg=sum/3;
}
}
void readStud(stu s[],char *filename){
FILE *f;
char tmp[255];
int i=0;
f=fopen(filename,"r+");
fgets(tmp,255,f);
while(!feof(f)){
fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
i++;
}
fclose(f);
}
void outPutSortFile(stu s[],int len,char *filename){
int i;
FILE *f;
f=fopen(filename,"w");
fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
for(i=0;i<len;i++){
fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
fclose(f);
}
void insertNew(stu ss[],stu s,int len){
int i;
len--;
for(i=0;i<len;i++){
if(s.avg<ss[i].avg){
while(i<len){
ss[len]=ss[len-1];
len--;
}
break;
}
}
ss[i]=s;
}
int main(){
stu s1[1],s[6];
char *fileName,*newFileName;
fileName="./stu-sort";
inputStuData(s1,1);//新添加学生信息
readStud(s,fileName);//读取文件里面的学生信息
/*插入*/
insertNew(s,s1[0],6);
outPutSortFile(s,6,fileName);//存入新的文件
printf("end\n");
return 0;
}
10.12 从键盘输入若干行字符,每行长度不等,输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。
/*13.12 从键盘输入若干行字符,每行长度不等,输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。*/
void getStringAndSave(){
FILE *f;
f=fopen("./test","a+");
int flag=1;
char c;
char str[255];
while(flag==1){
printf("input string:\n");
gets(str);
fprintf(f,"%s ",str);
printf("continue?");
c=getchar();
if(c=='N' || c=='n'){
flag=0;
}
getchar();
}
fclose(f);
f=fopen("./test","r+");
int i;
while(!feof(f)){
fscanf(f,"%s",str);
for(i=0;str[i]!='\0';i++){
if(str[i]>='a' && str[i]<='z'){
str[i]=str[i]-32;
}
}
printf("%s\n",str);
}
fclose(f);
}
int main(){
getStringAndSave();
printf("end\n");
return 0;
}