期末复习C语言练题——哈工大平台

1.
我的做法:

#include <stdio.h>
#include <stdlib.h>
#define LONG 100
void inverse(char str[],int m,int n);
int main()
{
    char str[LONG];
    int m,n;
    printf("input m,n:");
    scanf("%d,%d",&m,&n);
    getchar();
    printf("input the string:");
    gets(str);
    inverse(str,m-1,n);
    puts(str);
    return 0;
}

void inverse(char str[],int m,int n)
{
    char temp[LONG];
    int i;
    char *move;
    move=str;
    for(i=0;i<m;i++)
    {
        move++;
    }
    for(i=0;i<n;i++)
    {
        temp[i]=*move;
        move++;
    }
    for(i=0;i<n;i++)
    {
        str[n+m-1-i]=temp[i];
    }
}

结果截图:

他人的做法:

#include<stdio.h>

void inverse (char str[], int m, int n);

int main (void)
{
    char str[50];
    int m, n;

    printf("input m,n:");
    scanf("%d,%d", &m, &n);
    getchar();

    printf("input the string:");
    gets(str);

    inverse(str, m, n);

    printf("the inverse string:%s", str);

    return 0;
}

void
inverse (char str[], int m, int n)
{
    int i, j;

    for (i = m - 1, j = n + m - 2; i < n / 2 + m - 1; i ++, j --)
    {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

2.

我的做法:

#include <stdio.h>
#include <stdlib.h>
#define M 10
#define N 10
void Transpose(int (*a)[N],int (*at)[M],int m,int n);
void InputMatrix(int (*a)[N],int m,int n);
void PrintMatrix(int (*at)[M],int n,int m);
int main()
{
    int m,n;
    printf("Input m,n:");
    scanf("%d,%d",&m,&n);
    int a[m][n],at[n][m];//行指针只是访问数组的一个工具,没有定义和表示数组的功能,数组要单独定义
    InputMatrix(a,m,n);
    Transpose(a,at,m,n);
    PrintMatrix(at,n,m);
    return 0;
}

void Transpose(int (*a)[N],int (*at)[M],int m,int n)
{
    int i,j;
     for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            *(at[j]+i)=*(a[i]+j);
        }
    }

}
void InputMatrix(int (*a)[N],int m,int n)
{
    int i,j;
    printf("Input %d*%d matrix:\n",m,n);
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",a[i]+j);
        }
    }
}
void PrintMatrix(int (*at)[M],int n,int m)
{
    int i,j;
    printf("The transposed matrix is:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d\t",*(at[i]+j));
        }
        printf("\n");//换行符不要落下,否则输出的形式不是一个二维数组
    }
}

结果截图:

他人的做法:

#include <stdio.h>
#include <stdlib.h>
#define N 10
#define M 10
 
 
void InputMatrix(int (*a)[N], int m, int n);
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
 
int main()
{
    int m,n;
    int a[10][10];
    int at[10][10];
    printf("Input m, n:");
    scanf("%d,%d",&m,&n);
    printf("Input %d*%d matrix:\n",m,n);
    InputMatrix(a,m,n);
    Transpose(a,at,m,n);
    printf("The transposed matrix is:\n");
    PrintMatrix(at,n,m);
}
 
void InputMatrix(int (*a)[N], int m, int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
}
 
void Transpose(int (*a)[N], int (*at)[M], int m, int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            at[j][i]=a[i][j];
        }
    }
}
 
void PrintMatrix(int (*at)[M], int n, int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d\t",at[i][j]);
        }
        printf("\n");
    }
}

3.


他人的做法:

#include <math.h>
#include <stdio.h>
 
#define  CONST 1e-6
#define  SIZE 20
 
void InputMatrix (double a[][SIZE], int n);
double DeterminantValue(double a[][SIZE], int n);
void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row, int col);
void PrintMatrix(double a[][SIZE], int n);
int main(void)
{                        
    double  a[SIZE][SIZE];
    int     n;
    double  result;
    printf("Please enter matrix size n(1<=n<%d):", SIZE);
    scanf("%d", &n);
    printf("Please input matrix line by line:\n");
    InputMatrix(a, n);
    printf("matrix a:\n");
    PrintMatrix(a, n);
    printf("\n");
    result = DeterminantValue(a, n);
    printf("result = %f\n", result);
    return 0;
}                        
//  函数功能: 输入一个n×n矩阵的元素
void InputMatrix (double a[][SIZE], int n)
{                        
    int i, j;
    for (i = 0; i < n; i++)
    {                        
        for (j = 0; j < n; j++)
        {                        
            scanf("%lf", &a[i][j]);
        }
    }
}                        
//  函数功能: 计算n×n矩阵的行列式的值
double DeterminantValue(double a[][SIZE], int n)
{                        
    int    i = 0, j = 0;
    double temp, result, b[SIZE][SIZE];
    if (n == 1)
    {                        
        result = a[0][0];
    }
    else if (n == 2)
    {                        
        result = a[0][0] * a[1][1] - a[0][1] * a[1][0];
    }
    else
    {                        
        result = 0.0;
        for (j = 0; j < n; j++)
        {                        
            SubMatrix(a, b, n, i, j);
            printf("Submatrix:\n");
            PrintMatrix(b, n - 1);
            temp = DeterminantValue(b, n - 1);
            result += pow(-1, i + j) * a[0][j] * temp;
            printf("DValue of the Submatrix is %6.1f\n", temp);
        }
    }
    return result;
}                        
//  函数功能: 计算n×n矩阵a中第row行col列元素的(n-1)×(n-1)子矩阵b
void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row,
               int col)
{                        
    int i, j, ii = 0, jj = 0;
    for (i = 0; i < n; i++)
    {                        
        jj = 0;
        for (j = 0; j < n; j++)
        {                        
            if (i != row && j != col)
            {                        
                b[ii][jj] = a[i][j];
                jj++;
            }
        }
        if (i != row && j != col)
        {                        
            ii++;
        }
    }
}                        
//  函数功能: 输出一个n×n矩阵的元素
void PrintMatrix(double a[][SIZE], int n)
{                        
    int i, j;
    for (i = 0; i < n; i++)
    {                        
        for (j = 0; j < n; j++)
        {                        
            printf("%6.1f\t", a[i][j]);
        }
        printf("\n");
    }
}                       

4.

我的做法:

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
float calculate(int x,int n);
int main(void)
{
    int n;
    double x;
    printf("Enter X and N:");
    scanf("%lf%d",&x,&n);
    printf("px=%f\n",calculate(x,n));
}

float calculate(int x,int n)
{
    if(n==1)
    {
        return x;
    }
    else if(n>1)
    {
        return calculate(x,n-1) + pow(-1,n-1)*pow(x,n);
    }
    else
    {
        exit(0);
    }
}


结果截图:

他人的做法:

#include <stdio.h>
#include <math.h>

double px(double x,int n);
int main ()
{
  printf("Enter X and N:");
  double x;
  int n;
  scanf("%lf%d",&x,&n);
  printf("px=%lf\n",px(x, n));
    
}
double px(double x,int n)//计算前n项和
{
     if(n == 1)
     {
         return pow(-1,n-1)*pow(x,n);
         
     }
     else
     {
         return pow(-1,n-1)*pow(x,n) + px(x,n-1);
         
     }
}

5.

我的做法:

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int matrix[100];
    int n;
    printf("the total numbers is:");
    scanf("%d",&n);
    int m;
    printf("back m;");
    scanf("%d",&m);
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d",&matrix[i]);//输入时注意1和i的区别
    }
    for(i=m;i<n;i++)
    {
        printf("%d,",matrix[i]);
    }
    for(i=0;i<m-1;i++)
    {
        printf("%d,",matrix[i]);
    }
    printf("%d",matrix[m-1]);
}

结果截图:

他人的做法:

#include<stdio.h>
void move(int a[],int n,int m) {
	int *p,end;
	end = *(a+n-1);
	for(p=a+n-1; p>a; p--)
		*p=*(p-1);
	*a=end;
	m--;
	if(m>0)
		move(a,n,m);	//递归
}
int main() {
	int n,i,m;
	printf("你要输入多少个数?");
	scanf("%d",&n);
	int a[n];
	printf("输入%d个数:\n",n);
	for(i=0; i<n; i++)
		scanf("%d",&a[i]);
	printf("你想将最后多少个数前移?");
	scanf("%d",&m);
	move(a,n,m);
	printf("排好了:\n");
	for(i=0; i<n; i++)
		printf("%d,",a[i]);
	return 0;
}

6.

他人的做法:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
    int  cases, sum[10], i, max;
    char str[1000];
    scanf("%d", &cases);
    while (cases > 0)
    {
        scanf("%s", str);
        for (i = 0; i < 10; i++)
            sum[i] = 0;
        for (i = 0; i < strlen(str); i++)
        {
            sum[str[i] - '0'] += 1;
        }

        max = 0;
        int min;
        for (i = 0; i < 10; i++)
            if (sum[i] > sum[max])
            {
                max = i;
            }
        printf("%c %d\n",  max + '0', sum[max]);
        cases--;
    }
}


6.

我的做法

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i;
    printf("请输入星期几(0-6):");
    scanf("%d",&i);
    char *string[7]={"日","一","二","三","四","五","六"};//可用字符串字面量对指针数组进行初始化,指针数组得到的是每个字符串字面量的首地址
    printf("你输入的是星期");
    switch(i)
    {
    case 0:
        printf("%s",string[0]);
        break;
    case 1:
        printf("%s",string[1]);
        break;
    case 2:
        printf("%s",string[2]);
        break;
    case 3:
        printf("%s",string[3]);
        break;
    case 4:
        printf("%s",string[4]);
        break;
    case 5:
        printf("%s",string[5]);
        break;
    case 6:
        printf("%s",string[6]);
        break;

    }
    return 0;
}

结果截图:

7.

错误原码:

#include <stdio.h>

main()
{
    int i = 0;
    char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[5];//str2[5]不够装下“China”
    while (str[i] != '\0')
    {
        putchar(*str);//putchar中间写的不是地址,而是变量储存的名称
        str++;//数组名无法自动累加
    }
    scanf("%s", ptr);//一定要使指针有明确的指向才能使其有效
    puts(ptr);
    ptr1 = str;
    puts(ptr1);
    ptr2 = "China";
    puts(ptr2);
    str2 = "China";
    printf("%s", str2);
}

他人的改法:

#include <stdio.h>
 
main()
{	   	    
    int i = 0;
    char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[6];
    while (str[i] != '\0')
    {	   	    
        putchar(str[i]);
        i++;
    }
    ptr = str1;
    scanf("%s", ptr);
    puts(ptr);
    ptr1 = str;
    puts(ptr1);
    ptr2 = "China";
    puts(ptr2);
    strcpy(str2, "China");
    printf("%s", str2);
}	   	    

8.

他人的做法:(存疑)

#include <stdio.h>
 
void Hanoi(int n, char a, char b, char c)//此时a是原柱,b是目标柱,c是辅助柱
{
	if (n == 1)
	{
		printf("移动%d:从%c到%c\n", n, a, b);//这个是当只剩下最底下的盘子时,直接移动到目标柱上
	}
	else
	{
		Hanoi(n - 1, a, c, b);//这个时候a是原柱,c是目标柱,b是辅助柱
		printf("移动%d:从%c到%c\n", n, a, b);//移动完上面的柱子后把最底下的柱子移动走
		Hanoi(n - 1, c, b, a);//这个时候c是原柱,b是目标柱,a是辅助柱
	}
}
int main()
{
	int n = 0;
	printf("输入放上的塔数:");
	scanf("%d", &n);
	Hanoi(n,'A', 'B', 'C');
	return 0;
}

9.

我的做法:

#include <stdio.h>
#include <stdlib.h>
typedef struct stu
{
    long number;
    char name[10];
    int score;
}STUDENT;
int main()
{
    int i,j;
    STUDENT stu[4];
    for(i=0;i<4;i++)
    {
        printf("输入第%d个学生的信息:学号、姓名、成绩:\n",i+1);
        scanf("%ld",&stu[i].number);
        scanf("%s",stu[i].name);//结构体中输入字符串成员无需加取地址符
        scanf("%d",&stu[i].score);
    }
    STUDENT temp;
    for(i=0;i<4;i++)
    {
        for(j=i+1;j<3;j++)//j不需要小于3-i,只需要小于4即可,且需令j的初始值为i+1
        {
            if(stu[i].score<stu[j].score)
            {
                temp=stu[i];
                stu[i]=stu[j];
                stu[j]=temp;

            }
        }
    }
    printf("排序后学生的信息:\n");//注意题目的输入提示不要复制错了,且要注意标点的大小写
    for(i=0;i<4;i++)
    {
        printf("%ld ",stu[i].number);//示例中间隔方式不是制表符而是空格
        printf("%s ",stu[i].name);
        printf("%d",stu[i].score);//最后一个数据不需要空格
        printf("\n");
    }
    return 0;
}

结果截图:

他人的做法:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student
{
    unsigned int id;
    char name[10];
    int point;
} stu;

int main()
{
    stu sut1[5];//多一个位置用以排序
    int i, j;
    for (i = 0; i < 4; i++)
    {
        printf("输入第%d个学生的信息:学号、姓名、成绩\n");
        scanf("%u %s %d", &stu1[i].id, &syu1[i].name, &stu1[i].point);//可以一起输入的地方就一起输入,不需要分开
    }
    for (j = 4; j > 0; --j)
    {
        for (i = 0; i < 3; i++)
        {
            if (stu1[i].point < stu1[i + 1].point)
            {
                stu1[4] = stu1[i];
                stu1[i] = stu1[i + 1];
                stu1[i + 1] = stu1[4];
            }//排序处理
        }
    }
    puts("排序后学生的信息为:");
    for (i = 0; i < 4; i++)
    {
        printf("%u %s %d\n", stu1[i].id, stu1[i].name, stu1[i].point);//可以一起输出的地方就一起输出,不需要分开
    }
    system("pause");
    return 0;
}

10.

我的代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int score[40][3],sum[40],sumcourse[3];
    float ave[40],avecourse[3];
    long number[40];
    int n,i,j;
    printf("Input the total number of the students(n<40):");
    scanf("%d",&n);
    printf("Input student’s ID and score as: MT  EN  PH:\n");
    for(i=0;i<n;i++)
    {
        scanf("%ld",&number[i]);
        for(j=0;j<3;j++)
        {
            scanf("%d",&score[i][j]);
        }
    }
    for(i=0;i<n;i++)
    {
        sum[i]=0;
        for(j=0;j<3;j++)
        {
            sum[i]=sum[i]+score[i][j];
        }
        ave[i]=(float)sum[i]/3.0;
    }
    printf("Counting Result:\n");
    printf("Student’s ID\t  MT \t  EN \t  PH \t SUM \t AVER\n");
    for(i=0;i<n;i++)
    {
        printf("%12ld\t",number[i]);
        for(j=0;j<3;j++)
        {
            printf("%4d\t",score[i][j]);
        }
        printf("%4d\t%5.1f\n",sum[i],ave[i]);
    }
    for(i=0;i<3;i++)
    {
        sumcourse[i]=0;
        for(j=0;j<n;j++)
        {
            sumcourse[i]=sumcourse[i]+score[j][i];//不要把行和列的变量输反了(这里的score应该是j行i列)
        }
        avecourse[i]=(float)sumcourse[i]/(float)n;
    }
    printf("SumofCourse \t");
    for(i=0;i<3;i++)
    {
        printf("%4d\t",sumcourse[i]);
    }
    printf("\nAverofCourse\t");
    for(i=0;i<3;i++)
    {
        printf("%4.1f\t",avecourse[i]);
    }
    return 0;
}

结果截图:

他人的做法:

#include <stdio.h>
#include <stdlib.h>

#define   MAX_LEN  9                	/* 字符串最大长度 */
#define   STU_NUM 40                       /* 最多的学生人数 */

void  ReadScore(long num[],int score[][3],int n);//录入信息
void  Course(int Coursesum[3],float Courseaver[3],int score[][3],int n);//计算课程总分与平均分
void  Student(int Studentsum[STU_NUM],float Studentaver[STU_NUM],int score[][3],int n);//计算学生总分与平均分

int main()
{
    int n,i,k,g,t,score[STU_NUM][3],Coursesum[3],Studentsum[STU_NUM];
    long num[STU_NUM];
    float Courseaver[3],Studentaver[STU_NUM];
    printf("Input the total number of the students(n<40):");
    scanf("%d",&n);
    ReadScore(num,score,n);
    Course(Coursesum,Courseaver,score,n);
    Student(Studentsum,Studentaver,score,n);
    printf("Counting Result:\n");
    printf("Student’s ID\t  MT \t  EN \t  PH \t SUM \t AVER\n");
    for(i=0;i<n;i++)
    {
        printf("%12ld\t",num[i]);
        for(k=0;k<3;k++)
        {
            printf("%4d\t",score[i][k]);
        }
        printf("%4d\t%5.1f\n",Studentsum[i],Studentaver[i]);
    }
    printf( "SumofCourse \t");
    for(t=0;t<3;t++)
    {
        printf("%4d\t",Coursesum[t]);
    }
    printf("\nAverofCourse\t");
    for(g=0;g<3;g++)
    {
        printf("%4.1f\t",Courseaver[g]);
    }
    return 0;
}

void  ReadScore(long num[],int score[][3],int n)
{
    int i,k;
    printf("Input student’s ID and score as: MT  EN  PH:\n");
    for(i=0;i<n;i++)
    {
        scanf("%ld",&num[i]);
        getchar();//吞掉没用的回车符
        for(k=0;k<3;k++)
        {
            scanf("%d",&score[i][k]);
            getchar();//吞掉没用的回车符
        }
    }
}

void  Course(int Coursesum[3],float Courseaver[3],int score[][3],int n)
{
    int s,i,k;
    for(k=0;k<3;k++)
    {
        s=0;
        for(i=0;i<n;i++)
        {
           s+=score[i][k];
        }
        Coursesum[k]=s;
        Courseaver[k]=s/n;
    }
}

void  Student(int Studentsum[STU_NUM],float Studentaver[STU_NUM],int score[][3],int n)
{
    int i,k,s;
    for(i=0;i<n;i++)
    {
        s=0;
        for(k=0;k<3;k++)
        {
            s+=score[i][k];
        }
        Studentsum[i]=s;
        Studentaver[i]=(float)s/3;
    }
}


11.

我的做法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char country[5][80],temp[80];
    int i,j;
    printf("Input five countries' names:\n");
    for(i=0;i<5;i++)
    {
        gets(country[i]);
    }
    for(i=0;i<5;i++)
    {
        for(j=i;j<5;j++)
        {
            if(strcmp(country[i],country[j])>0)
            {
                strcpy(temp,country[i]);
                strcpy(country[i],country[j]);
                strcpy(country[j],temp);
            }
        }
    }
    printf("The minimum is:%s\n",country[0]);
    return 0;
}

结果截图:

他人的做法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 80
int main()
{
    char str[5][N];
    printf("Input five countries' names:\n");
    for (int i = 0; i < 5; i++)
    {
        gets(str[i]);
    }
    for (int j = 0; j < 4; j++)
    {
        for (int i = 0; i < 4; i++)
        {
            if (strcmp(str[i], str[i + 1]) > 0)
            {
                char temp[N];
                strcpy(temp, str[i]);
                strcpy(str[i], str[i + 1]);
                strcpy(str[i + 1], temp);
            }
        }

    }


    printf("The minimum is:%s\n", str[0]);


    return 0;
}

12.

我的做法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i,zhang=0,li=0,wang=0,wrong=0;
    char name[10][10];
    char eletion[3][10]={"li","zhang","wang"};
    for(i=0;i<10;i++)
    {
        printf("Input vote %d:",i+1);
        scanf("%s",&name[i][10]);
        getchar();
    }
    for(i=0;i<10;i++)
    {
        if(strcmp(name[i],"zhang")==0||strcmp(name[i],"Zhang")==0)
            zhang++;
        else if(strcmp(name[i],"li")==0||strcmp(name[i],"Li")==0)
            li++;
        else if(strcmp(name[i],"wang")==0||strcmp(name[i],"Wang")==0)
            wang++;
        else
            wrong++;
    }
    printf("Election results:\n");
    printf("%8s:%d\n",eletion[0],li);
    printf("%8s:%d\n",eletion[1],zhang);
    printf("%8s:%d\n",eletion[2],wang);
    printf("Wrong election:%d\n",wrong);
    return 0;
}
//结果是对的,但是最好用结构体来做

结果截图:

他人的做法:

#include  <stdio.h>
#include  <string.h>
#define NUM_ELECTORATE 10
#define NUM_CANDIDATE 3
 
int Election(struct  candidate[]);
 
struct candidate
{
    char  name[20];
    int   count;
} candidate[3] = {{"li", 0} {"zhang", 0} {"wang", 0}}
 
int main()
{
    int  i, wrong;
    wrong = Election(candidate[]);
    printf("Election results:\n");
    for (i = 0; i < NUM_CANDIDATE; i++)
    {
        printf("%8s:%d\n", candidate[i].name, candidate[i].count);
    }
    printf("Wrong election:%d\n", wrong);
    return 0;
}
int Election(struct candidate[])
{
    int  i, j, flag = 1, wrong;
    char  name[20];
    for (i = 1; i <= NUM_ELECTORATE; i++)
    {
        printf("Input vote %d:", i);
        scanf("%s", name);        
        for (j=0; j<20; j++)
        {
            if (name[j]>='A' || name[j]<='Z')
            {
                name[j] +=  'A' - 'a';
            }
        }
        flag = 1;
        for (j = 0; j < NUM_CANDIDATE; j++)
        {
            if (name = candidate[j].name)
            {
                candidate[j].count++;
                flag = 0;
            }
        }
        if (flag)
        {
            wrong++; 
        }
    }
    return wrong;
}

13.

我的做法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int n;
    printf("Input n:");
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
        printf("Fib(%d)=%d\n",i+1,Fib(i+1));
    }
    return 0;
}

int Fib(int n)
{
    if(n==1)
    {
        return 1;
    }
    else if(n==2)
    {
        return 1;
    }
    else
    {
        return Fib(n-1)+Fib(n-2);
    }
}

结果截图:

他人的做法:

#include <stdio.h>
long Fib(int a);
int main()
{  	  
    int n, i, x;
    printf("Input n:");
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {  	  
        x = Fib(i);    /* 调用递归函数Fib()计算Fibonacci数列的第n项 */
        printf("Fib(%d)=%d\n", i, x);
    }
    return 0;
}  	  
/* 函数功能:用递归法计算Fibonacci数列中的第n项的值 */
long Fib(int n)
{  	  
    long f;
    if (n == 0)   f = 0;              /* 基线情况 */
    else if (n == 1)   f = 1;        /* 基线情况 */
    else   f = Fib(n - 1) + Fib(n - 2); /* 一般情况 */
    return f;
}  	  

14.

我的做法:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char s[80],t[80];
    int ret;
    printf("Input s\n");
    gets(s);
    printf("Input t\n");
    gets(t);
    ret=MyStrcmp(s,t);
    if(ret>0)
    {
        printf("string s>string t.\n");
    }
    else if(ret<0)
    {
        printf("string s<string t.\n");
    }
    else
    {
        printf("string s=string t.\n");
    }
    return 0;
}

int MyStrcmp(char s[],char t[])
{
    int i;
    for(i=0;i<80;i++)
    {
        if(s[i]>t[i])
        {
            return s[i]-t[i];//s[i]和t[i]已经是字符了,做四则运算的时候不需要写成's[i]'-'t[i]'(不需要单独加单引号表示他是一个字符)
        }
        else if(s[i]<t[i])
        {
            return s[i]-t[i];
        }
        else
        {
            if(s[i]=='\0'&&t[i]=='\0')
            {
                return 0;
            }
            else
            {
                ;
            }
        }
    }
}

结果截图:

14.

我的做法:

#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
    int year;
    int month;
    int day;
}DATE;
int main()
{
    printf("请输入日期(年,月,日)\n");
    DATE a;
    scanf("%d,%d,%d",&a.year,&a.month,&a.day);
    int date=0,i;
    int monthleap[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int monthnotleap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if((a.year%4==0&&a.year%100!=0)||(a.year%400==0))
    {
        for(i=0;i<a.month-1;i++)
        {
            date=monthleap[i]+date;
        }
        date=date+a.day;
    }
    else
    {
        for(i=0;i<a.month-1;i++)
        {
            date=monthnotleap[i]+date;
        }
        date=a.day+date;
    }
    printf("%d月%d日是%d年的第%d天\n",a.month,a.day,a.year,date);
    return 0;
}

结果截图:

他人的做法:

//定义一个结构体变量(包括年、月、日),计算该日在在本年中是第几天
#include <stdio.h>
typedef struct time_info{
	int year;
	int month;
	int day;
}Info; 
int num(Info time);
int main(void){
	Info time;
	printf("输入年、月、日:");
	scanf("%d %d %d",&time.year,&time.month,&time.day);
	printf("该日在本年中是第%d天",num(time));
	return 0;
}
int num(Info time){
	int ret = 1,i,sum =0;		
	if(time.year%400==0 || (time.year%4==0&&time.year%100!=0)){
		ret = 0; 			//ret=0,则为闰年 
	}
	int a[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	for(i=1;i<time.month;i++){ 			//先算这个月份之前的天数 
		sum += a[i-1];			//i从1开始,对应月份,作为下标从0开始,一月对应a[0] 
	}
	sum = sum+time.day;		//闰年29天 
	if(ret == 0) 
		sum = sum+1;
	return sum; 
}

15.

我的代码:

#include <stdio.h>
#include <stdlib.h>
#define NUM 80
int Mystrlen(char str[]);
int main()
{
    printf("Enter a string:");
    char str[NUM];
    gets(str);
    int ret;
    ret=Mystrlen(str);
    printf("The length of the string is:%d\n",ret);
    return 0;
}

int Mystrlen(char str[])
{
    char *character=str;
    int number=0;
    while(*character!='\0')
    {
        number++;
        character++;//不要忘了自己的指针也要移动
    }
    return number;
}

结果截图:

16.
请用指针数组编程实现按奥运会参赛国的国名在字典中的顺序对其入场次序进行排序。
假设参赛国不超过150个,参赛国的国名不超过9个字符。
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
我的代码:

#include<stdio.h>
#include<string.h>
#define MAX_LEN 10
#define N 150
void SortString(char *ptr[], int n);
int main()
{
    int i,n;
    char name[N][MAX_LEN];
    char *pStr[N];//使用指针数组的时候一定要定义对应的一维或二维数组
    printf("How many countries?\n");
    scanf("%d",&n);
    getchar();
    printf("Input their names:\n");
    for (i=0;i<n;i++)
    {
        pStr[i]=name[i];//先把二维数组的每行的地址赋给指针数组,然后才可用指针数组输入
        gets(pStr[i]);
    }
    SortString(pStr,n);
    printf("Sorted results:\n");
    for (i=0;i<n;i++)
    {
        puts(pStr[i]);
    }
    return 0;
}

void SortString(char *ptr[], int n)
{
    int i,j;
    char *temp=NULL;//交换指针变量记住的地址需要用指针变量来做中间值
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            if (strcmp(ptr[j],ptr[i])<0)//这里的两个指针变量没有必要写取地址符
            {
                temp=ptr[i];
                ptr[j]=ptr[i];
                ptr[j]=temp;
            }
        }
    }
}

17.

我的代码:

#include <stdio.h>
#define  CURRENT  100
main()
{      	   	 	 
    int  year;                        		/* 产值翻番所需年数 */
    double   growRate; 	                   /* 工业产值的增长率 */
    double  output;                   		/* 工业总产值 */
 
    printf("Input grow rate:");
    scanf("%lf", &growRate);
 
    output = CURRENT;        	     /* 当年产值为100万元 */
    for (year = 0; output < 2 * CURRENT; year++)//浮点数可以直接比较
    {      	   	 	 
        output = output * (1 + growRate);
    }
 
    printf("When grow rate is %.0f%%, the output can be doubled after %d years.\n", growRate * 100, year);
}      	   	 	 

18.
下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。
该程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
注意:将修改后的完整的源程序写在答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才给加5分,
如果只改正了部分错误,则不加分。不能修改函数原型。
改错时不能改变程序原有的意图,不能改变函数原型。

#include  <stdio.h>
#define n = 10;
void  MaxMinExchang(int *a, int n)
{
    int  maxValue = *a, minValue = *a, maxPos, minPos;
    int  i, temp;
    for (i=0; i<n; i++)
    {
        if (*a+i > maxValue)
        {
        maxValue = *a+i;
              maxPos = i;
        }
         if (*a+i < minValue)
        {
                 minValue = *a+i;
            minPos = i;
        }
    }   
    temp = *a + maxPos;
    *a + maxPos = *a + minPos;
    *a + minPos = temp;
}
main()
{
    int a[n], i, n;
    printf("Input n(n<=10):\n");
    scanf("%d", n) ;
    printf("Input %d Numbers:\n", n);
    for (i=0; i<n; i++)
    {
        scanf("%d", a[i]);
    }
    MaxMinExchang(a, n);
    printf("After MaxMinExchange:\n");
    for (i=0; i<n; i++)
    {
            printf("%d ", a[i]);
    }
    printf("\n");
}

我的代码:

#include  <stdio.h>
#define N 10//这个宏常量尽量用大写字母
void  MaxMinExchang(int *a, int n)
{
    int  maxValue = *a, minValue = *a, maxPos = 0, minPos = 0;//这里最大值最小值的角标应该赋初值,因为如果不赋初值的话,输入1,2,3,4,5,第二个if 是一直执行不了的minPos就无法被赋初值,就是一个随机数
    int  i=0,j=0,temp;
    for (;j<n&&i<n;j++,i++)
    {
        if (*(a+i) > maxValue)
        {
        maxValue = *(a+i);
              maxPos = i;
        }
         if (*(a+j) < minValue)
        {
                 minValue = *(a+j);
            minPos = j;
        }
    }
    temp = *(a + maxPos);
    *(a + maxPos) = *(a + minPos);
    *(a + minPos) = temp;
}
int main()
{
    int a[N],i,n;
    printf("Input n(n<=10):\n");
    scanf("%d",&n) ;
    printf("Input %d Numbers:\n", n);
    for (i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    MaxMinExchang(a,n);
    printf("After MaxMinExchange:\n");
    for (i=0; i<n; i++)
    {
            printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}


结果截图:

19.
*汉诺塔问题是一个著名的问题,初始模型如图所示。其来源据说是在约19世纪末欧洲的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆自上而下、由小到大顺序串着64个圆盘构成的塔,游戏的目的是将最左边A杆上的圆盘,借助最右边的C杆,全部移动到中间的B杆上,条件是一次仅能移动一个盘,且不允许大盘放在小盘的上面。

**输入格式要求:"%d" 提示信息:"Please enter the number of discs:"

**输出格式要求:"\tTotal:%d\n" "%2d-(%2d):%c==>%c\n"

程序运行示例如下:

Please enter the number of discs:

Please enter the number of discs: 5
1-( 1):a>b
2-( 2):a
>c
3-( 1):b>c
4-( 3):a
>b
5-( 1):c>a
6-( 2):c
>b
7-( 1):a>b
8-( 4):a
>c
9-( 1):b>c
10-( 2):b
>a
11-( 1):c>a
12-( 3):b
>c
13-( 1):a>b
14-( 2):a
>c
15-( 1):b>c
16-( 5):a
>b
17-( 1):c>a
18-( 2):c
>b
19-( 1):a>b
20-( 3):c
>a
21-( 1):b>c
22-( 2):b
>a
23-( 1):c>a
24-( 4):c
>b
25-( 1):a>b
26-( 2):a
>c
27-( 1):b>c
28-( 3):a
>b
29-( 1):c>a
30-( 2):c
>b
31-( 1):a==>b
Total:31
他人的代码:

#include <stdio.h>
void movedisc(unsigned n, char fromneedle, char toneedle, char usingneedle);
int i = 0;
int main()
{	    	   	   	 	   
    unsigned n;
    printf("Please enter the number of discs:");
    scanf("%d", &n);
    movedisc(n, 'a', 'b', 'c');
    printf("\tTotal:%d\n", i);
    return 0;
}	    	   	   	 	   
void movedisc(unsigned n, char fromneedle, char toneedle, char usingneedle)
{	    	   	   	 	   
    if (n == 1)
        printf("%2d-(%2d):%c==>%c\n", ++i, n, fromneedle, toneedle);
    else
    {	    	   	   	 	   
        movedisc(n - 1, fromneedle, usingneedle, toneedle);
        printf("%2d-(%2d):%c==>%c\n", ++i, n, fromneedle, toneedle);
        movedisc(n - 1, usingneedle, toneedle, fromneedle);
    }
}	    	

20.

他人的代码:

#include <stdio.h>
int Gcd(int a,int b);
main()
{
    int a, b, c;
    printf("Input a,b:");
    scanf("%d,%d", &a, &b);
    c = Gcd(a,b);
    if (c != -1)
        printf("Gcd=%d\n", c);
    else
        printf("Input error!\n");
}
int Gcd(int a,int b)
{
        if (a <= 0 || b <= 0)
            return -1;
        while(a != b)
        {
            if(a > b)
                a = a - b;
            else
                b = b - a;
        }
        return a;
}

21.

我的代码:

#include <stdio.h>
#include<string.h>
void  YHTriangle(int a[][15], int  n);
void  PrintYHTriangle(int a[][15], int  n);
int main()
{
    int a[15][15];
    int n;
    printf("Input n(n<=15):\n");
    scanf("%d",&n);
    YHTriangle(a,n);
    PrintYHTriangle(a,n);
    return 0;
}

void  YHTriangle(int a[][15], int  n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        a[i][0]=1;
        a[i][i]=1;
    }
    for(i=2;i<n;i++)
    {
        for(j=1;j<i;j++)
        {
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
}

void  PrintYHTriangle(int a[][15], int  n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<=i;j++)
        {
            printf("%5d",a[i][j]);
        }
        printf("\n");
    }
}

结果截图:

他人的做法:

#include <stdio.h>   //导入stdio.h库,里面包含输入输出函数
 
int main() {
    int h, a[100][100] = {0};  //定义一个100x100的二维数组a,并全都初始化为0
    scanf("%d", &h);
 
    a[1][1] = 1;  //设置第一行
    /* 依次计算第 2~h+1 行 */
    for (int i = 2; i <= h + 1; i++)
        for (int j = 1; j <= i; j++)
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
 
    /* 输出杨辉三角的部分 */
    for (int i = 1; i <= h + 1; i++) {
        for (int j = 1; j <= i; j++)
            printf("%3d", a[i][j]);
        printf("\n");
    }
}

22.

我的代码:

#include <stdio.h>
int main()
{
    char s[] = "24635", c;
    int i;

    for (i = 0;s[i]!='\0'; i++)
    {
        c=s[i];
        switch (c - '0')
        {
        case 2:
        case 3:
            putchar(c + 4);
            break;
        case 4:
            putchar(c + 4);
            break;
        case 5:
            putchar(c + 3);
            break;
        default:
            putchar(c + 2);
            break;
        }
        putchar('\n');
    }
    return 0;
}

结果截图:

23.

我的代码:

#include <stdio.h>
#include<math.h>
int main()
{
    double pi=1;
    int i;
    for(i=3;fabs(1/(double)i)>=1e-4;i=i+2)
    {
        if(i%4==3)
        {
            pi=pi-1/(double)i;
        }
        else
        {
            pi=pi+1/(double)i;
        }
    }
    pi=pi+1/(double)i;
    printf("pi=%10.6f\n",pi*4);
    return 0;
}

结果截图:

posted @ 2023-02-12 11:50  20221320冯泰瑞  阅读(98)  评论(0编辑  收藏  举报