答案完整版
一、编程题
1.奇偶交换排序算法
举例:待排数组[6 2 4 1 5 9]
第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比
[6 2 4 1 5 9]
交换后变成
[2 6 1 4 5 9]
第二次比较偶数列,即6和1比,5和5比
[2 6 1 4 5 9]
交换后变成
[2 1 6 4 5 9]
第三趟又是奇数列,选择的是2,6,5分别与它们的邻居列比较
[2 1 6 4 5 9]
交换后
[1 2 4 6 5 9]
第四趟偶数列
[1 2 4 6 5 9]
一次交换
[1 2 4 5 6 9]
以下表现其单处理器算法,类似冒泡排序,较为简单但效率并不特别高。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void printArray(int a[], int count)
{
int i;
for(i = 0; i < count; i++)
printf("%d ",a[i]);
printf("\n");
}
void Odd_even_sort(int a[], int size)
{
bool sorted = false;
while(!sorted)
{
sorted = true;
for(int i = 1; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i + 1]);
sorted = false;
}
}
for(int i = 0; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i+1]);
sorted = false;
}
}
}
}
int main(void)
{
int a[] = {3, 5, 1, 6, 9, 7, 8, 0, 11};
int n = sizeof(a) / sizeof(*a);
Odd_even_sort(a, n);
printArray(a, n);
return 0;
}
2.设圆半径r=1.5,圆柱高h=3
// 设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱表面积,圆柱体积
// 要求:用scanf输入数据,取小数点后两位
#include <stdio.h>
int main()
{
float r,h;
float c,s,sq,vq,sv,vz;
float pai = 3.1415926;
printf("请输入圆半径:");
scanf("%f",&r);
printf("请输入圆柱高:");
scanf("%f",&h);
c = 2 * pai * r;
s = pai * r * r;
sq = 4 * pai * r * r;
vq = ( 4 / 3 ) * pai * r * r * r;
sz = 2*s+c*h;
vz = s * h;
printf("圆周长是:%4.2f\n",c);
printf("圆面积是:%4.2f\n",s);
printf("圆球表面积是:%4.2f\n",sq);
printf("圆球体积是:%4.2f\n",vq);
printf("圆柱表面积是:%4.2f\n",sz);
printf("圆柱体积是:%4.2f\n",vz);
return 0;
}
3.有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,···求出这个数列的前20项和。
看到分数,变量类型要用浮点型,格式化输出也要用相对应的输出符号
首先,找出这串数字的规律
1 2 3 5 8 13 21···
将数字这样展开并去掉重复的数字之后,很容易可以看出,从第三项开始,当前项等于前两项之和(和斐波那契数列有点像,所以借用斐波那契数列的思路)。
(以前3个数字1,2,3为例)
(1)计算当前分数<2/1>的值
(2)将当前数字<3>的前一个<2>的前一个数字<1>先存放在tmp<tmp=1>中
(3)将当前数字<3>的前一个<2>赋值给下一个分数<3/2>的分子< i >
(4)然后将前两个数字<1>、<2>的和<3>赋值给下一个分数< 3/2 >的分母< j >
(5)计算前n项的和
将以上内容放在一个循环中,循环20次,也就是计算出前20项的和。
#include<stdio.h>
int main(){
double i = 1.0, j = 2.0;
int n,count = 0;
double sum = 0;
printf("请输入n的值:");
scanf("%d",&n);
while (count < n){
double ret = j / i;//保存当前项的结果
double tmp = i;
i = j;
j = tmp + j;
sum += ret;//前n项的累加和
count++;
}
printf("sum=%lf", sum);
return 0;
}
4.用指针作为函数形参,完成三个数的排序
#include<stdio.h>
int sort(int *a,int *b,int *c)
{
int d;
if(*a>*b){
d=*a;*a=*b;*b=d;
}
if(*a>*c){
d=*a;*a=*c;*c=d;
}
if(*b>*c){
d=*b;*b=*c;*c=d;
}
}
void main(){
int a,b,c,*x,*y,*z;
printf("输入3个整数:");
scanf("%d,%d,%d",&a,&b,&c);
x=&a;
y=&b;
z=&c;
sort(x,y,z);
printf("这个三个数从小到大排列是:%d,%d,%d\n",a,b,c);
}
二、填空题部分
1.函数ReadDat()的功能是实现从文件IN39.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数ChA㈠,该函数的功能是:以行为单位把字符串的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个新的字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新的字符,以此类推一直处理到倒数第二个字符,最后一个字符的ASCII值加第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后把已处理的字符串逆转后仍按行重新存入字符串数组肛中,并调用函数WriteDat()把结果xx输出到文件OUT39.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序已给出。
请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
参考答案
void ChA(void)
{
int i,j, k,str;
char ch;
for(i=0;i<maxline;i++)
{
str=strlen (xx[i]); /*求各行字符串的总长度*/
ch=xx[i][0];
for(j=0;j<str-1;j++) /*将该字符的ASCII值与下一个字符的ASCII值相加,得到新的字符*/
xx[i][j]+=xx[i][j+1];//答案
xx[i][str-1]+=ch; /*将最后一个字符的ASCII值与第一个字符的ASCII值相加,得到最 后一个新的字符*/
for(j=0,k=str-1; j<str/2;j++,k--) /*将字符串逆转后仍按行重新存入字符串数组 xx中*/
{
ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
}
}
本题考查的知识点如下:
(1)字符变量的整数运算。
(2)字符的逆序排列。因为是以行为处理单位,所以要先求得每一行中字符的个数。在C语言中,字符型数据可参与任何整数运算,实际参与运算的是字符的ASCII码。这里可以直接将字符的ASCII码相加,即可得到所要结果。使用
循环结构依次对字符进行处理,最后一个字符要单独处理。逆序排列采用的方法是:从两边向中间移动。数组中第一个字符与最后,个字符交换,第二个与倒数第二个交换,按照此规律直到中间一个或两个字符(数组中字符个数为奇数时,最后中间只有一个字符,否则有两个字符)。
2. 下列程序的功能足:计算出自然数SIX和NINE、它们满足的条件足SIX+SIX+SIX=NINE+NINE的个数cnt以及满足此条件所有的SIX与NINE的和 sum,清编写函数countValue()实现程序的要求。最后调用函数WData(),把结果cnt和sum,输出到0UT.dat文件中。其中的S、I、X、N、E各代表一个十进制数。
【审题分析】分析题丑可知,本题只要实现countValue()函数的功能即町。函数countValue()要实现的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX(+SIX=NINE+NINE的个数cnt以及满足此条件所有的SIX与NINE的和sum。因此解答本题的关键在于判断3个SIX自然数的和是否等于2个NINE自然数的和。
【解题思路】用整型变量S、I、X、N、E分别表示变量SIX和NINE各个位上的数字,在五重for循环中整型变量S、I、X、N、E分别从0或1递增到9,对整型变量S、I、X、N、E每个数字的可能取值情况都进行了3倍的SIX的值是否等于2倍的NINE的值的条件判断,如果条件成立,就找到了一组对应SIX和NINE,并求出其和,把其和加到变量sum上。在五重for循环结束时,变量sum的值就是所有满足条件的变量SIX和NINE的和。
【参考答案】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFFTewCY-1576923122650)(C:\Users\22423\Desktop\答案.assets\31.jpg)]
3. 下列程序的功能是:寻找并输出11至999之间的数m,它满足m,m2和m3均为回文数。所谓回文数是指其各位数字左右对称的整数,例如121,676,94249等。满足上述条件的数如m=11,m2=121,m3=1331皆为回文数。请编制函数int jsValue(long n)实现此功能,如果是回文数,则函数返回1,反之则返回0。最后把结果输出到文件out43.dat中。
int jsValue(long n)
{
int i, strl,half;
char xy[B0];
ltoa (n,xy, A0); /*将长整数n转换成与其等价的字符串存入xy指向的字符串中,输出串为十进制*/
strl=strlen(xy); /*求字符串的长度*/
half=strl/B;
for (i=0; i<half; i++)
if(xy[i] !=xy[--strl]) break; /*判断字符串是否左右对称*/
if(i>=half) return A; /*如果字符串是回文,则返回A*/
else return O; /*否则返回0*/
}
4 . 已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把一个四位数的个位数字上的值减去千位数字上的值再减去百位数字上的值最后减去十位数字上的值,如果得出的值大于等于零且原四位数是偶数,则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中
void jsVal()
{
int i, j, thou, hun, ten, data;
for (i=0; i<MAX; i++)
{
thou = a[i]/1000; //求出千位数数值
hun = a[i]/1000/%10;//求出百位数数值
ten = a[i]%100/10;//求出十位数数值
data = a[i]%10;
if (data-thou-hun-ten>=0 && a[i]%2!=1)
b[cnt++]=a[i];
}
for (i=0; i<cnt-1; i++)
for (j=i+1; j<cnt; j++)
if (b[i] >b[j])
{
data = b[i];
b[i] = b[j];
b[j] = data;
}
}
5.已知有二进数据文件stu1.dat,下列程序完成从stu.dat中读出数据,然后在屏幕上输出。
struct student
{ int no; char name[10];
};
main() {
FILE *stu1;
struct student stu;
if ((stu1=fopen( (8) ))==NULL)
{printf(“file not found!\n”); exit(0);} while( (9) ) {
fread( (10) );
printf(“no:%d,name: %s\n”,stu.no,stu.name); }
}
三、读程题
1.
#include<stdio.h>
main()
{
int number=0;
while(number++<=1) printf("*%d,",number);
printf("**%d\n",number);
}
运行结果:
2.
#include<stdio.h>
#define N 7
main()
{
int i,j,a[N][N];
for(i=1;i<N;i++)
{
a[i][i]=1;
a[i][1]=1;
}
for(i=3;i<N;i++)
for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];
for(j=1;j<=4;j++) printf("%2d",a[4][j]);
printf("\n");
}
运行结果:
3.
#include<stdio.h>
hcf(int u,int v)
{
int a,b,c,r;
if(u>v) { c=u; u=v; v=c; }
a=u; b=v;
while((r=b%a)!=0) { b=a; a=r;}
return(a);
}
main()
{
int u,v,h,l;
u=32; v=48;
h=hcf(u,v);
printf("H.C.F=%d\t",h);
}
运行结果:
4.
#include<stdio.h>
main()
{
int a[]={1,2,3,4,5,6},*p;
p=a; *(p+3)+=2;
printf("%d,%d\n",*p,*(p+3));
}
运行结果:
5.
#include<stdio.h>
fac(int n,int *t)
{
int s;
if((n==1)||(n==0)) *t=1;
else
{
fac(n-1,&s);
t=n*s;
}
}
main()
{
int y;
fac(4,&y);
printf("y=%d\n",y);
}
运行结果:好像题错了有bug
上一篇: 基于Java8的抽象类和接口的区别
下一篇: IDEA git提交代码时出现:Code analysis failed with exception: com.intellij.psi......
推荐阅读
-
阿里产品经理面试问题汇总(必会这28道面试考题及答案)
-
2021年国内大学最新排名-教育部中国大学排行榜(完整版)
-
2021年中国名校前100排名一览表-中国大学排名前100名列表(完整版)
-
2021年中国大学排名完整版最新-中国大学排行榜2021官方排名
-
2021年中国民办本科100强名单(完整版)-2021年全国167所民办大学排名
-
中国985大学排名2021最新排名-全国39所985大学排名最新完整版
-
2021中国大学500强排名完整版-2021全国大学排名榜500强(高校权威榜)
-
抑郁症测试题及答案!
-
*直属211大学名单完整版-附全国211大学排名2021最新排名表
-
985、211有多少所大学?附211大学全部名单排名(最新完整版)