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
{
;
}
}
}
}
结果截图: