大连理工大学大一C语言程序设计第四次上机作业参考答案
本文档仅用于已做完作业的同学进行参考,或者感觉到写作业有些吃力的同学进行学习和理解,并不是想给同学们提供抄答案的机会,望周知!!!
以下代码均为我自己个人答案,如有问题或者更好的方法欢迎在评论区留言和指正!!!
题目一
编写函数,计算表达式 的值(),形参n的值由主程序输入并传递,函数返回值为s.
题目分析
代码和运行结果
#include <stdio.h>
int main()
{
int n;
int s;
int multi();
scanf("%d",&n);
if (n <= 10 && n >= 0)
{
s = multi(n);
}
else
{
printf("输入错误");
return 0;
}
printf("%d",s);
return 0;
}
int multi(int m)
{
int sum = 1;
int num = 1;
int i, j;
for (i = 1; i <= m; i++)
{
num = 1;
for (j = 1; j <= i; j++)
{
num*= j;
}
sum += num;
}
return sum;
}
题目二
编写数字加密和解密函数。测试值由主程序输入。
题目分析
代码和运行结果
#include <stdio.h>
int main()
{
int m,p;
int rt,rt2;
printf("请输入需要加密的四位数:");
scanf("%d",&m);
int encrypt();
int decrypt();
rt = encrypt(m);
printf("The encrypted number is %d\n",rt);
printf("请输入需要解密的四位数:");
scanf("%d",&p);
rt2 = decrypt(p);
printf("The decrypted number is %d", rt2);
return 0;
}
int encrypt(int n)
{
int i, j, k, z;
int result;
i = n % 10;//个位 4 2
n = n / 10;
j = n % 10;//十位 3 1
n = n / 10;
k = n % 10;//百位 2 4
n = n / 10;
z = n % 10;//千位 1 3
i =(i+9)%10,j=(j+9)%10,k=(k+9)%10,z=(z+9)%10;
result = (j * 1000 + i * 100 + z * 10 + k);
return result;
}
int decrypt(int n)
{
int i, j, k, z;
int result;
i = n % 10;//个位 4 2
n = n / 10;
j = n % 10;//十位 3 1
n = n / 10;
k = n % 10;//百位 2 4
n = n / 10;
z = n % 10;//千位 1 3
i += 1, j += 1, k += 1, z += 1;
result = (j * 1000 + i * 100 + z * 10 + k);
return result;
}
题目三
.数组转置:在主函数中定义一个n(1<=n<=6)维方阵,并从键盘读入数组元素;编写函数transpose(a,n)实现数组a转置;在主函数中输出转置后的方阵。
题目分析
代码和运行结果
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[4][4];
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%d",&a[i][j]);
}
}
void transpose();
transpose(a, n);
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d\t", a[i][j]);
if(j==3)
printf("\n");
}
}
}
void transpose(int b[4][4], int m)
{
int t;
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < i; j++)
{
t = b[j][i];
b[j][i] = b[i][j];
b[i][j] = t;
}
}
return 0;
}
题目四
分数的四则运算,即对两个分数进行加、减、乘、除等运算,要求用C语言编写4个分数的函数来实现四则运算。
题目分析
代码和运行结果
int main()
{
int a, b, c, d,gy;
char cz1, cz2, cz3;
int result1, result2;
int find_gb();//函数1 求最小公倍数
int find_gy();//函数2 求最大公约数
void plus(),delete(),multiple(),cf() ;
scanf("%d%c%d", &a, &cz1, &b);//a分子1 b分母1 c 分子2 d 分母2
getchar();
scanf("%c",&cz2);
getchar();
scanf("%d%c%d", &c, &cz3, &d);//a分子1 b分母1 c 分子2 d 分母2
int* q = &result1;
int* p = &result2;
if (cz2 == '+')
{
plus(q, p, a, b, c, d);
}
else if(cz2=='-')
{
delete(q, p, a, b, c, d);
}
else if (cz2 == '*')
{
multiple(q,p,a,b,c,d);
}
else if (cz2 == '/')
{
cf(q, p, a, b, c, d);
}
gy = find_gy(abs(result2), abs(result1));
result1 /= gy;
result2 /= gy;
printf("%d/%d", result1, result2);
return 0;
}
int find_gb(int b,int d)
{
int i;
for (i = 1; i <= b * d; i++)
{
if (i % b == 0 && i % d == 0)
{
//i存的是最小公倍数
break;
}
}
return i;
}
int find_gy(int m,int n)
{
int t;
while (n != 0)
{
t = m % n;
m = n;
n = t;
}
/*if (result1 < result2)
gy = result1;
else
gy = result2;*/
/*for (; gy >= 1; gy--)
{
if ((result1 % gy)== 0 && (result2 % gy)== 0)
{
break;
}
}
printf("\n%d",gy);*/
return m;
}
void plus(int *q,int*p,int a,int b,int c,int d)
{
*q = a * d + b * c;//分子
*p = b * d;//分母
}
void delete(int* q, int* p, int a, int b, int c, int d)
{
*q = a * d - b * c;//分子
*p = b * d;//分母
}
void multiple(int* q, int* p, int a, int b, int c, int d)
{
*q = a *c;//分子
*p = b * d;//分母
}
void cf(int* q, int* p, int a, int b, int c, int d)
{
*q = a * d;//分子
*p = b * c;//分母
}
题目五
.学生信息:编写4个函数实现下列功能(通过参数传递实现,函数参数为数组):
题目分析
代码和运行结果
#include <stdio.h>
#include <string.h>
int main()
{
int i, j;
extern char name_temp;
void input();
void sort();
void display();
int search();
char name[20][80];
int score[20];
input(name,score);
sort(name, score);
display(name,score);
return 0;
}
void input(char name1[20][80],int score1[20])
{
int i,j;
for (i = 0; i < 20; i++)
{
printf("姓名:");
scanf("%s",&name1[i]);
printf("成绩:");
scanf("%d", &score1[i]);
}
}
void sort(char name2[20][80],int score2[20])
{
int i,j,m;
int t;
char nametemp[80];
for (i = 0; i < 19; i++) // 冒泡法排序
{
for (j=0;j<19;j++)
{
if (score2[j] <score2[j+1])
{
t = score2[j];
score2[j] = score2[j + 1];
score2[j +1] = t;
strcpy(nametemp, name2[j]);
strcpy(name2[j], name2[j +1]);
strcpy(name2[j + 1], nametemp);
}
}
}
}
void display(char name3[20][80], int score3[20])
{
int i;
for (i = 0; i < 20; i++)
{
printf("%s的分数:%d \n", name3[i], score3[i]);
}
}
题目六
字符串处理
定义两个C源程序文件:fmain.c 和 fstring.c。fmain.c中包含主函数,实现字符串处理功能选项和字符串的输入与结果的输出。fstring.c中包含两个函数delchar(s,c)和strreverse (s),实现删除字符和字符串反转功能。
delchar(s,c):在主函数中输入字符串和要删除的字符,此函数将字符串s中出现的所有c字符删除;再在主函数中输出删除后的字符串。
strreverse (s):在主函数中读入字符串,此函数实现将字符串s反转;再在主函数中输出反转后的字符串。
题目分析
代码和运行结果
//fmain.c
include <string.h>
#include <stdio.h>
int main()
{
char s[100];
char c,judge;
void delchar();
void strreverse();
int a;
int flag = 1;
printf("1.Reverse a string.\n");
printf("2.Delete a character in a string.\n");
printf("Please input your choice:");
while (flag)
{
scanf("%d", &a);
if (a == 1)
{
printf("Enter a string:");
getchar();
gets(s);
strreverse(s);
printf("Reverse string is:");
puts(s);
}
else if (a == 2)
{
printf("Enter a string:");
getchar();
gets(s);
printf("Enter a character you want to delete:");
scanf("%c", &c);
delchar(s, c);
puts(s);
}
printf("Would you like to continue? (y/n)");
scanf("%c",&judge);
if (judge == 'y')
{
flag = 1;
printf("1.Reverse a string.\n");
printf("2.Delete a character in a string.\n");
printf("Please input your choice:");
}
else if(judge=='n')
{
flag = 0;
}
}
}
//fstring.c
void delchar(char s1[100], char c1)
{
int i = 0, k = 0;
static char s2[100];
strcpy(s2, s1);
while (s2[i])
{
if (s2[i] != c1)
{
s1[k] = s2[i];
i++;
k++;
}
else
{
i++;
}
}
s1[k] = s2[i];
}
void strreverse(char s2[100])
{
int i = 0;
int m;
m = strlen(s2);
char s3[100];
for (i = 0; i < m; i++)
{
s3[i] = s2[i];
}
for (i = 0; i < m; i++)
{
s2[i] = s3[m - 1 - i];
}
return 0;
}