山西专升本C语言编程题真题


所有代码为博主本人思路,并非标准答案,仅供参考!如有错误,欢迎评论提出更正。

2010年

编写一个程序计算1~200之间所有包含3的数(如3、13、30、113等)的和。

  • 解法1:
#include<stdio.h>

int main(void)
{
        int i,temp,sum = 0;
        for(i = 1;i <= 200;i++)
        {
                temp = i;
                while(temp)
                {
                        // 获取当前数字最后一位是否为3
                        if(temp%10 == 3)
                        {
                                sum += i;
                                break;
                        }
                        // 如果最后一位不为3,那么除10降位,如32/10=3,145/10=14;
                        temp /= 10;
                }
        }
        printf("1~200之间所有包含3的数字和为:%d\n",sum);
}
  • 解法2:
#include<stdio.h>

int main(void)
{
        int i,sum = 0;
        for(i = 1;i <= 200;i++)
                /*注意:该方法只适合求1~299之间所有包含3的数字之和*/
                /* i%10 == 3判断所有个位为3的情况 i%100/10 == 3判断十位为3的情况 因为题目求1~200之>间所有包含3数字的和,并不会出现百位为3的情况(300)*/
                if(i%10 == 3 || i%100/10 == 3)
                        sum += i;
        printf("1~200之间所有包含3的数字和为:%d\n",sum);
}

2011年

编写程序输出符合下列要求的全部三位数。
条件:由1、2、3、4四个数字组成,互相同且无重复的所有三位数。

#include<stdio.h>

int main(void)
{
        int i,j,k,sum;
        for(i = 1;i <= 4;i++)
        {
                for(j = 1;j <= 4;j++)
                {
                        for(k = 1;k <= 4;k++)
                        {
                                if(i != j && i != k && j != k)
                                        printf("%d%d%d\t",i,j,k);
                        }
                }
        }
        return 0;
}
  • 实现思路:定义三层循环,分别循环4次代表1、2、3、4的四个数字。三层循环可以让所有三位数情况遍历一次。在循环体内输出符合条件的三位数,条件为i != j && i != k && j != k(互不相同且不重复)。

编写一个程序从键盘输出10个学生的成绩,统计输出最高分,最低分和平均分。

#include<stdio.h>

int main(void)
{
        int score[10],max,min,sum = 0,i;
        double avg;

        for(i = 0;i < 10;i++)
        {
                printf("请输出第%d个学生成绩:",(i+1));
                scanf("%d",&score[i]);

                if(i == 0)
                {
                        max = score[i];
                        min = score[i];
                }
                if(max < score[i])
                        max = score[i];
                if(min > score[i])
                        min = score[i];
                sum += score[i];
        }
        avg = sum / 10.0;
        printf("max-->%d\tmin-->%d\tavg-->%0.2f\n",max,min,avg);
        return 0;
}

2012年

编写程序找出1~200之间所有既能被5整除又能被7整除的数。

#include<stdio.h>

int main(void)
{
        int i;
        for(i = 1;i <= 200;i++)
        {
                if(i % 5 == 0 && i % 7 == 0)
                        printf("%d\t",i);
        }
        printf("\n");
        return 0;
}

有一分数序列
2/1、3/2、5/3、8/5、13/8、21/13、……
求出这个数列的前20项之和。

#include<stdio.h>

int main(void)
{
        double sum = 0.0;
        int n1 = 1,n2 = 2,t;
        int i;
        for(i = 0;i < 20;i++)
        {
                // 如果是int/int必须要强制类型转换,否则精度丢失。也可以直接将n1.n2的数据类型定义为double
                sum += (double)n2/n1;
                t = n1;
                n1 = n2;
                n2 += t;
        }
        printf("%f\n",sum);
        return 0;
}

将一个字符串转换成对应的数字,如字符串"123"转换成123,假设字符串中所有字符都是数字字符。

#include<stdio.h>

int main(void)
{
        char str[] = "123";
        int i = 0,value = 0;
        while(str[i] != '\0')
        {
                value *= 10;
                // 因为数字0的ASCII码为48,所以转换到int要减去48
                value += str[i] - 48;
                i++;
        }
        printf("%d\n",value);
        return 0;
}

2013年

编写程序输出三位整数中各位数字之和为7的所有数。如整数106、115、124、……均为满足条件的数(1+0+6=7、1+1+5=7、1+2+4=7)。

#include<stdio.h>

int main(void)
{
        int i,n1,n2,n3,sum;
        for(i = 100;i <= 999;i++)
        {
                n1 = i % 10;
                n2 = (i % 100 - n1) / 10;
                n3 = (i - (n1 + n2 * 10)) / 100;
                sum = n1 + n2 + n3;
                if(sum == 7)
                        printf("%d\t",i);
        }
        printf("\n");
        return 0;
}

编写程序将下列四行四列方阵中的数存入二维数组a[4][4]中,并求出其中的最大值及最大值所在数组的行标和列标。
在这里插入图片描述

#include<stdio.h>

int main(void)
{
        int a[][4] = {23,44,12,77,13,2,33,12,23,45,12,65,11,9,15,78},i,j,row,col,max = a[0][0];
        for(i = 0;i < 4;i++)
                for(j = 0;j < 4;j++)
                {
                        if(max < a[i][j])
                        {
                                row = i + 1;
                                col = j + 1;
                                max = a[i][j];
                        }
                }
        printf("max is %d,row and col is (%d,%d)\n",max,row,col);
        return 0;
}

2014年

编写程序输出1!+2!+3!+…+50!的值。

#include<stdio.h>

int main(void)
{
        int i;
        long t = 1,sum = 0;
        for(i = 1;i <= 50;i++)
        {
                t *= i;
                sum += t;
        }
        printf("sum is %ld\n",sum);
        return 0;
}

从键盘输入某学生的四科成绩,编写程序实现输出四科的总分、平均分、最高分和最低分。

#include<stdio.h>

void main(void)
{
        double score[4],sum = 0.0,avg = 0.0,min = 0.0,max = 0.0;
        int i;
        for(i = 0;i < 4;i++)
        {
                printf("请输入第%d科成绩:",i+1);
                scanf("%lf",score+i);
        }
        sum = score[0];
        max = score[0];
        min = score[0];
        for(i = 1;i < 4;i++)
        {
                if(max < score[i])
                        max = score[i];
                if(min > score[i])
                        min = score[i];
                sum += score[i];
        }
        avg = sum / 4;
        printf("sum is %f\navg is %f\nmax is %f\nmin is %f\n",sum,avg,max,min);
}

2015年

输入10个学生的成绩(整数),需要统计出成绩低于平均分的学生人数,请编程实现。

#include<stdio.h>

void main(void)
{
        int score[10],i,sum = 0,num = 0;
        double avg = 0.0;
        for(i = 0;i < 10;i++)
        {
                printf("请输入第%d个学生成绩:",i+1);
                scanf("%d",score+i);
                sum += score[i];
        }
        avg = sum / 10.0;
        for(i = 0;i < 10;i++)
        {
                if(score[i] < avg)
                        num++;
        }
        printf("成绩低于平均分的学生人数为:%d\n",num);
}

一个三位数,如果它的三个位置上的数字的立方和等于这个数本身,就称它为水仙花数。如153=1*1*1+5*5*5+3*3*3,所以153是水仙花数。请编程找出100~500之间的水仙花数。

  • 解法一:
#include<stdio.h>

void main(void)
{
        int i,n1,n2,n3;
        for(i = 100;i <= 500;i++)
        {
                n1 = i % 10;
                n2 = (i % 100 - n1) / 10;
                n3 = (i % 1000 - (n1 + n2 * 10)) / 100;
                if(i == (n1*n1*n1 + n2*n2*n2 + n3*n3*n3))
                        printf("%d\t",i);
        }
        printf("\n");
}

解法二:

#include<stdio.h>

void main(void)
{
        int i,n1,n2,n3;
        for(i = 100;i <= 500;i++)
        {
                n1 = i % 10;
                n2 = i / 10 % 10;
                n3 = i / 100;
                if(i == (n1*n1*n1 + n2*n2*n2 + n3*n3*n3))
                        printf("%d\t",i);
        }
        printf("\n");
}

2016年

输入两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>

void main(void)
{
        int m,n,temp;
        int x;          // 最小公约数
        int y;          // 最小公倍数
        printf("请输入正整数m n:");
        scanf("%d%d",&m,&n);
        x = m;
        y = n;
        if(x < y)
        {
                temp = x;
                x = y;
                y = temp;
        }
        while(y != 0)
        {
                temp = x % y;
                x = y;
                y = temp;  
        }
        y = m * n / x;
        printf("最小公约数为:%d\n最大公倍数为:%d\n",x,y);
}   

输出以下的杨辉三角形(要求输出10行)。在这里插入图片描述

#include<stdio.h>

void main(void)
{
        int arr[10][10],i,j;
        for(i = 0;i < 10;i++)
        {
                arr[i][0] = 1;
                arr[i][i] = 1;
        }

        for(i = 2;i < 10;i++)
                for(j = 1;j < i;j++)
                        arr[i][j] = arr[i-1][j] + arr[i-1][j-1];

        for(i = 0;i < 10;i++)
        {
                for(j = 0;j <= i;j++)
                        printf("%d\t",arr[i][j]);
                printf("\n");
        }
}

2017年

输入一个字符,判别它是否为小写字母,如果是,将他转换为大写字母;如果不是,不转换。然后输出最后得到的字符。

有一个3*4的矩阵a,求出其中值最小的那个元素的值,以及其他所在的行号和列号。在这里插入图片描述

#include<stdio.h>

void main(void)
{
        int a[][4] = {{1,2,3,4},{9,8,7,6},{-10,10,-5,2}},i,j,row = 0,col = 0,min = a[0][0];
        for(i = 0;i < 3;i++)
                for(j = 0;j < 4;j++)
                {
                        if(min > a[i][j])
                        {
                                min = a[i][j];
                                row = i + 1;
                                col = j + 1;
                        }
                }
        printf("max-->%d\n(row,col)-->(%d,%d)\n",min,row,col);
}

2018年

编写函数Fun1,其实现的功能是:判断某一年是否为闰年,如果是返回1,否则返回0。(闰年的条件:能被4整除,但不能被100整除的年份是闰年;能被400整除的年份是闰年)

#include<stdio.h>

int Fun1(int year)
{
        int flag = 0;
        if(year%4 == 0 && year%100 != 0)
                flag = 1;
        if(year%400 == 0)
                flag = 1;
        return flag;
}

有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁,问第4个学生岁数,他说比第3个学生大2岁,问第3个学生,又说比第2个学生大2岁,问第2个学生,说比第1个大2岁,最后问第1个学生,他说是10岁。设计一个函数描述上述递归过程,并采用主函数调用的方式,输出第5个学生的年龄。

#include<stdio.h>

void main(void)
{
        int Fun1(int,int);
        printf("第五个学生年龄是%d岁\n",Fun1(5,0));
}

int Fun1(int num,int age)
{
        if(num == 1)
                return age += 10;
        age += 2;
        return Fun1(--num,age);
}

2019年

2019年与2016年的题目完全相同,请参考2016年。

2020年

编写函数 Fun23 实现功能如下:指针 s 所指向的字母数字串中只包含数字和字母,实现除了字符串前的数字字符保留,其他的数字字符全部删除。例如:如果 s 的内容为1234ABCD44432abcde7890,按规定删除后 s 的内容应当是:1234ABCDabcde

void Fun23(char *s){
    while(*s - '0' <= 9 && *s - '0' >= 0)
        s++;
    while(*s != '\0'){
        if(*s - '0' <= 9 && *s - '0' >= 0)
            strcpy(s,s+1);
        else
            s++;
    }
}

编写函数 Fun22 实现如下功能:假设 n 名学生的成绩存储在一个结构体数组变量 scoreLists 中,计算学生成绩的平均分并通过函数返回。其中,结构体类型定义代码如下所示。

struct StudentScore{
    double score;
};
double Fun22(struct StudentScore *stu,int n){
    int i;
    double sum = 0.0,avg;
    for(i = 0;i < n;i++){
        sum += stu->score;
        stu++;        
    }
    avg = sum/n;
    return avg;
}
  • 28
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值