某大学的C语言期中考试编程练习题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

学校有c语言的编程作业,我有时候也会刷题,打算用写博文的形式思考总结。
本次是备战期中考试练习题的16道函数题,题目做起来其实很简单,但期中考试的编程题大概就是这个难度吧一般,可以当刷小题了


提示:以下是本篇文章正文内容

一、6-2 指针做参数: 求两数的和、积、平均值

题目:本题求两整数的和、积、平均值。要求用原型是 void fun(int x, int y, int *p, int *q,float *s) 的函数来实现。

函数接口定义:
void fun(int x, int y, int *p, int *q,float *s) ;
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>

void fun(int x, int y, int *p, int *q, float  *s) ;
int main()
{
 int x,y,sum,product; float aver;
  scanf("%d%d", &x, &y);  
  fun (x ,y, &sum,&product,&aver );
  printf("%d,%d,%.1f", sum,product,aver);
  return 0;
}

/* 请在这里填写答案 */
输入样例:
31 2
输出样例:
33,62,16.5
分析

看主函数引用fun函数的参数都是什么,x,y是需要计算的两个数,带星号的是不同运算结果的保存位置,很简单不多说

解题
void fun(int x, int y, int *p, int *q,float *s) {
    *p=x+y;
    *q=x*y;
    *s=1.0*(x+y)/2;
}

二、6-3 字符数组与字符串:求带符号的数字串对应的整数。

题目:请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则函数把它转换为整数值 -1234。 (请勿在答题框编写主函数main, 仅需完成函数fun的begin和end之间应该填写 的代码。)

函数接口定义:
long  fun ( char *p);
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
long  fun ( char *p) ;
int main()      /* 主函数 */
{ char s[6];
  long    n;
 scanf("%s",  s) ;
  n=fun(s);
  printf("%ld",n);
 return 0;
 }

/* 答题框所填写的代码将被嵌入到这里 */
输入样例:
-4567
输出样例:
-4567
分析

首先我们需要判断字符串的第0字符是否为负数,如果为负数,我们将整数字符转变成整数时,需要从第一个字符遍历。整数字符和整数的关系,举个例子 1='1'-'0'在变换的时候不要忘记减去零字符

解题
long  fun ( char *p){
    long result=0;
    int flag=0,i=0;
    if(*p=='-'){flag=1;i=1;}
    while(*(p+i)!='\0'){
        result=result*10+(*(p+i)-'0');
        i++;
    }
    if(flag==1){result=-result;}
    return result;
}

三、6-4 将串中下标为奇数的字符过滤掉。

题目:函数fun的功能是:将s所指字符串中下标为奇数的字符删除。串中剩余字符形成一个新串放在t所指的数组中。 例如,当s所指字符串:"ABCDEFGHIJK"时,t所指的数组的内容应是:"ACEGIK"。

函数接口定义:
void fun(char *s,char t[ ] ) ;
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
void fun(char *s , char t[ ]) ;
int main( )
{
   char s[60] , t[60];
   scanf("%s",s);
   fun(s,t);   //  新串为t 
   printf("The result is %s",t);   //  输 出 t 数 组 的 串
  return 0 ;
 }
     /* 您的代码嵌入这里。即只需在答题框填fun的设计与实现  */
输入样例:
ABCDEFGHIJK
输出样例:
The result is ACEGIK
分析

通过中间变量i,i++去遍历字符串,如果小标是奇数,跳过这次循环,我用的是while循环,充分利用字符串末尾有’\0’的特点。用一个j变量去记录偶数下标的字符组成的新字符串,并在末尾加’\0’,更符合字符串在存储单元的存储方式

解题
void fun(char *s,char t[ ] ) {
    int i=0,j=0;
    while(*(s+i)!='\0'){
        if(i%2==1){
            i++;
            continue;
        }
        t[j]=*(s+i);
        i++;
        j++;
    }
    t[j]='\0';
}

四、6-5 字符数组与字符串:删除字符串所有空格。

题目:编写一个函数,用来删除字符串中的所有空格。

函数接口定义:
void fun(char *str) ;
裁判测试程序样例:
#include "stdio.h"

void fun(char *str) ;

main()
{
  char str[81] ;
  gets(str) ;
  fun(str) ;
  printf("%s",str) ;
}

/* 请在这里填写答案 */
输入样例:
I hope you are right!
输出样例:
Ihopeyouareright!
分析

太简单了,自己做。如果遍历的某个字符是空格,跳过此次循环,和上边那道题很像。

解题

五、6-7 一维字符数组:字符串逆序。

题目:将主函数中输入的字符串反序存放。例如:输入字符串"abcdefg",则应输出"gfedcba"。

函数接口定义:
void fun(char str[ ],int n) ;
裁判测试程序样例:
#include "stdio.h"
#include "string.h"
#define N 81

void fun(char *str,int n) ;

main()
{
  char s [N];
  int l;
  gets(s);
  l=strlen(s);
  fun(s,l);
  puts(s);
  TestFunc();
}

/* 答题框里代码将嵌入这里。无需写main函数,只需完成fun函数的全部设计 */
输入样例:
evoL
输出样例:
Love
分析

字符串逆序排序,很经典的问题,我的思路就是第一个和最后一个换一下,以此利类推,用i和j去记录下标,如果是偶数个长度,i会大于j,结束循环;如果是奇数个长度,j=j,结束循环。注意strlen返回的字符串长度不包括’\0’,所以是字符长度。

解题
void fun(char str[ ],int n) {
    int i=0,j=n-1;
    char temp;
    while(i<j){
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
        i++;
        j--;
    }
}

六、6-8 字符数组与字符串:过滤串中非字母。

题目:输入一个字符串,过滤此串,只保留串中的字母字符,并统计新生成串中包含的字母个数。

函数接口定义:
fun(char *ptr) ; // 或 fun(char  ptr[ ] ) ;
裁判测试程序样例:
#define N 30
#include "stdio.h"
#include "string.h"

int main()
{
  char str[N];
  int s;
  gets(str);
  s=fun(str);
  puts(str);
  printf(",%d", s);
 return 0;
}

/* 答题框里的子函数的设计被嵌入这里 */
输入样例:
go234$o1d
输出样例:
good
,4
分析

判读是否是字母字符,i和j分别记录旧字符串和新字符串的下标,count计数,有几个字母字符

解题
fun(char *ptr) {
    int i=0,j=0,count=0;
    char temp;
    while(ptr[i]!='\0'){
       if((ptr[i]>='a'&&ptr[i]<='z')||(ptr[i]>='A'&&ptr[i]<='Z'))
       {
           ptr[j]=ptr[i];
           i++;
           j++;
           count++;
       }
       else i++;
    }
    ptr[j]='\0';
    return count;
}

七、6-9 一维数组:带回最小值的下标。

题目:主函数读入5个数并求最小值。要求通过函数fun返回最小值的下标来实现。

函数接口定义:
int fun(int list[],int size)   ;
裁判测试程序样例:
#include "stdio.h"
#define SIZE 5    

int fun(int list[ ], int size)   ;

int main()
{
int i , v[SIZE] ;
for (i=0;i<SIZE;i++)
{
   scanf("%d", v+i );     
 }     
i=fun(v, SIZE);     
printf("index=%d, min=%d", i,v[i] );
 return 0;
}

/* 答题框你填写的答案被嵌入这里 */
输入样例:
18 -2 -5 70 9
输出样例:
index=2,min=-5
分析

注意看主函数对fun函数的调用,和它i值的使用方法,我们得到fun函数返回的是最小值下标这个信息。遍历数组,用min存储最小值的下标

解题
int fun(int list[],int size){
    int i,min=0;
    for(i=0;i<size;i++){
        if(list[min]>list[i]){
            min=i;
        }
    }
    return min;
}

八、6-10 字符数组与字符串:将下标为0和偶数的字符删除 。

题目:将s所指字符串中下标为偶数的字符(含下标是0的字符)删除,串中剩余字符形成的新串放在t所指数组中。 例如,当s所指字符串中的内容为:"ABCDEFGHIJK",在t所指数组中的内容应是:"BDFHJ"。。。

函数接口定义:
void fun(char *s, char t[ ]) ;
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

#include <stdio.h>
void fun (char * s, char t[ ]) ;

#include <string.h>

int main()
{
  char   s[100], t[100];
  scanf("%s", s);
  fun(s, t);
  printf("The result is: %s", t) ;
    return 0 ;
}

/* 请在这里填写答案 */
输入样例:
ABCDEFGHIJK
输出样例:
BDFHJ
分析

这道题的题目描述说下标是零的字符,难道不就是下标是偶数的字符??这道题和前面的一道题很像,模仿着自己做吧。

解题

九、字符串:将除首、尾字符外的字符按降序排列。

题目:7个字符的字符串,将除首、尾字符外的5个字符按降序排列,然后输出整个串(7个字符)。例如,原来的字符串为SEAedcT,排序输出为 SedcEAT。

函数接口定义:
int fun(char *s,int num) ;
裁判测试程序样例:
#include "stdio.h"
#include "string.h"

int fun(char *s,int num) ;
int main()
{
   char s[10];
   gets(s) ;
   fun(s,7) ;
   printf("%s",s) ;
   return 0 ;
}


/* 请在这里填写答案 */
输入样例:
aroegyb
输出样例:
ayrogeb
分析

本题从第1个字符开始遍历,一直到num-2结束。降序排序,比较的是按照字符的ASCII大小排序

解题
int fun(char *s,int num) {
    int i=1,j;
    char temp;
    for(i=1;i<num-1;i++){
        for(j=1;j<num-1-i;j++){
            if(s[j]<s[j+1]){
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
            }
        }
        
    }
    
}

十、6-12 二维数组:求周边元素之和 。

题目:通过函数求M行N列的二维数组周边元素之和(即第0行、M-1行、0列、N-1列所在的元素)。注意每个元素不重复加。

函数接口定义:
int fun(int a[M][N]) ; 
裁判测试程序样例:
#define M 5
#define N 4
#include "stdio.h"
int fun(int a[M][N]) ; 
int main( ) 
{
  int a[M][N] , i , j ; 
    int y;
    for(i=0;i<M;i++)
     for(j=0; j<N; j++)
            scanf("%d", &a[i][j])  ;
  y=fun(a) ;
  printf("s=%d",y) ;
  return 0 ;
}


/* 请在这里填写答案 */
输入样例:
1 2 3 4
3 4 5 6
5 6 7 8
8 9 0 1
1 2 3 5
输出样例:
s=52
分析

求和大家应该都会,剩下的就是遍历的方式。我遍历的方式第零行和最后一行,然后是第0列和最后一列的(非第0行非最后一行)元素

解题
int fun(int a[M][N]) {
    int sum=0,i,j;
    for(i=0,j=0;j<N;j++){
    sum+=a[i][j];}
    
    for(i=M-1,j=0;j<N;j++){
    sum+=a[i][j];}
    
    for(i=1,j=0;i<M-1;i++){
    sum+=a[i][j];}
    
    for(i=1,j=N-1;i<M-1;i++){
    sum+=a[i][j];}
    return sum;
}

十一、6-13 字符串:逆序存放。

题目:本题目要求将主函数中输入的字符串反序存放。例如:输入字符串"abcdefg",则应输出"gfedcba"。

函数接口定义:
在这里描述函数接口。例如:
void fun(char *str,int n) ;
裁判测试程序样例:
#include "stdio.h"
#include "string.h"
void fun(char *str,int n) ;
#define N 81

int main()
{
    char s [N];
    int l;
    gets(s); 
    l=strlen(s);
    fun(s,l);
    puts(s);
    return 0 ; 
}

/* 请在这里填写答案 */
输入样例:
ABCDEFG
输出样例:
GFEDCBA
分析

这题和前面的一道题很像,就不给解题了,唯一区别的是函数参数的定义方式不太一样,但还是可以大胆的用str[i]

解题

十二、6-14 二维数组:求最大元素的值。

题目:请编写一个函数fun,它的功能是:求出一个2×M整型二维数组中最大元素的值,并将此值返回调用函数。

函数接口定义:
在这里描述函数接口。例如:
int fun (int a[ ][M]) ; 
裁判测试程序样例:
#include <stdio.h>
#define M 4
#include <stdio.h>
fun (int a[][M]) ;

int main()
{   int arr[2][M] , i , j ;
    for(i=0;i<2;i++)
     for(j=0; j<M; j++)
            scanf("%d", &arr[i][j])  ;
    printf("max=%d" , fun(arr) ) ;
    return 0 ;
}

/* 请在这里填写答案 */
输入样例:
1 8 5 9
3 2 10 1
输出样例:
max=10
分析

这道题返回的是最大值具体的值,剩下的都和前面的某一题很像,也不给了

解题

十三、一维数组:删除所有值为y的元素,并返回剩余元素个数。

题目:一维数组:删除所有值为y的元素,并返回剩余元素个数。

函数接口定义:
int fun(int bb[],int y) ;
裁判测试程序样例:
#include <stdio.h>
int fun(int bb[],int y) ; 
#define M 10

main()
{
  int aa[M],n,y,k;
   for(k=0;k<M;k++)   
           scanf("%d",&aa[k]);
  scanf("%d",&y);
  n=fun(aa,y) ;
  printf("after deleted %d there are %d number:\n", y, n) ;
  for(k=0;k<n;k++) 
             printf("%d,",aa[k]);
}
/* 请在这里填写答案 */
输入样例:
1 2 8 8 8 3 4 5 6 7
8
输出样例:
after deleted 8 there are 7 number:
1,2,3,4,5,6,7,
分析

这道题和前边一道题的区别就是,字符串变成了数字数组,空格变成了一个具体整数,也不给了

解题

十四、6-16 二维数组:求矩阵第一行与第三行元素之和。

题目:在键盘上输入一个3行3列矩阵的各个元素的值(值为整数), 然后求矩阵第一行与第三行元素之和, 并在主函数中输出。

函数接口定义:
int fun(int a[3][3]) ;
裁判测试程序样例:
#include "stdio.h"
int fun(int a[3][3]) ; 
int main()
{
int i, j, s, a[3][3] ;
for(i=0;i<3 ; i++)
{
    for(j=0;j<3; j++)
        scanf("%d", &a[i][j]) ; 
}
s=fun(a) ;
printf("sum=%d",s);
return 0 ;
}

 /* 请在这里填写答案 */
输入样例:
1 2 3
4 5 6
7 8 9
输出样例:
sum=30
分析

遍历第0行和第2行,做加和,太简单了,也不给了

解题

十五、6-17 二维数组:求最大元素及其所在的行坐标及列坐标。

题目:求出N×M整型数组的最大元素及其所在的行坐标及列坐标(如果最大元素不唯一,选择位置在最前面的一个)。

函数接口定义:
int fun(int array[N][M]) ; 
裁判测试程序样例:
#include <stdio.h>
#define N 4
#define M 3
#include <stdio.h>     
int Row,Col ;          // 最大数的行列标,全局变量
int fun(int array[N][M]) ; 
main()
{
  int a[N][M],i,j,max;
  for(i=0;i<N;i++)
    for(j=0;j<M;j++)
      scanf("%d",&a[i][j]);
 max=fun(a);
 printf("max=%d,row=%d,col=%d",max,Row,Col); //Row,Col代表最大值的下标
}

/* 请在这里填写答案 */
输入样例:
1 10 2
3 12 5
4 11 3
5 12 4
输出样例:
max=12,row=1,col=1
分析

遍历二维数组,返回最值的横列标,注意是通过改变全局变量的值实现的,行列标传递。也不给了

解题

十六、6-19 一维数组:求一批数中最大值与最小值的差。

题目:本题要求实现一个函数,可计算一维数组中最大与最小值的差。数据在主函数中读入。

函数接口定义:
int max_min(int a[],int n) ;
裁判测试程序样例:
#define N 10
#include <stdio.h>

int main()
{
  int a[N],i,k;
  for(i=0;i<N;i++)
     scanf("%d",&a[i]) ;
 k=max_min(a,N) ;
 printf("%d", k) ;
 return 0 ; 
}
/* 请在这里填写答案 */
输入样例:
18 -20 25 1 2 3 4 5 30 1
输出样例:
50
分析

遍历一维数组,找到最大最小值,做差返回,也太简单了,不给了

解题

十七、1 计算年year、月month和日day对应的是该年的第几天

题目:自定义1个函数day_of_year(year, month, day),计算并返回年year、月month和日day对应的是该年的第几天。

函数接口定义:
int day_of_year(year, month, day);
裁判测试程序样例:
#include<stdio.h> 
int day_of_year(int year, int month, int day);
int main(void) 
{ 
int year,month,day; 
scanf("%d%d%d",&year,&month,&day); 
printf("%d",day_of_year(year,month,day));
return 0;
}

/* 请在这里填写答案 */
输入样例:
2000 3 1
输出样例:
61
分析

二维数组存储每个月多少天,判断平闰年:能被四整除,不能被100整除,但能被400。注意循环的月份要减一,现在是3月,month只加前两个月的,第三月加的是day

解题
int day_of_year(int year, int month,int day){
    int i,sum=0;
    int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
              {31,29,31,30,31,30,31,31,30,31,30,31}};
    if((year%4==0&&year%100!=0)||year%400==0){
          for(i=0;i<month-1;i++){
              sum+=a[1][i];
          }
          sum+=day;
      }
    else{
          for(i=0;i<month-1;i++){
              sum+=a[0][i];
          }
          sum+=day;
      }
    return sum;
}

十八、2 在N个数中查找x的位置。

题目:本题要求完成函数的设计,实现在数组中查找x的位置并返回主函数输出。如x不存在,则输出"Not found!"。

函数接口定义:
int find(int a[], int x );
裁判测试程序样例:
#include "stdio.h"
#define N 5
void main()
{
  int a[N],i; int x,k ;
  for(i=0;i<N;i++)
    scanf("%d",&a[i]);        
  scanf("%d",&x);   /* 输入被查找的x  */
  k=find(a,x);    /*   求x在a数组中的位置   */
  if(k==-1)   printf("Not found!");           
  else        printf("Loc is %d",k ); 
}
/*   编写的代码将放置到这里  */
输入样例:
10  8  5  6   7
6
输出样例:
Loc is 4
分析

循环找x,如果找到保存下标退出。注意看主函数下标不是0开始的,但a[]是从0开始存储的,结果要+1

解题
int find(int a[], int x ){
    int m=0,i;
    for(i=0;i<N;i++){
        if(a[i]==x){m=i;break;}
    }
    if(i==N) return -1;
    else return m+1;
}

十九、3 编写函数,统计10位观众对5个电视栏目的投票结果。观众投票的结果由主函数以数组形式传入。

题目:某电视台要进行一次对该台5个栏目(设相应栏目编号为1~5)的受欢迎情况,共调查了10位观众,编写程序,根据每一位观众的投票(10位观众投票由主函数数组r传入,r[0]-r[9]代表10位观众所投的栏目),统计输出各栏目的得票情况.

函数接口定义:
void fun(int count[],int r[]);
裁判测试程序样例:
#include "stdio.h"
void fun(int count[],int r[]);
void  main( )
{    int i,r[10],n;
    int count[6];  
         /*  r[0]-r[9]代表10位观众所投的栏目,如r[0]是3则代表观众1投票了栏目3 */  
        for(n=0;n<10;n++)
          scanf("%d",&r[n]);  
        fun(count,r);
    for(i=1;i<=5;i++)
       printf("栏目%d投票结果为%d\n", i , count[i]);
}
/* 请在这里填写答案 */
输入样例:
1 2 3 4 5 2 3 2 1 5
输出样例:
栏目1投票结果为2
栏目2投票结果为3
栏目3投票结果为2
栏目4投票结果为1
栏目5投票结果为2
分析

count数组名字是一个地址,函数参数传递是地址的传递,可以更改地址所在的内容。count数组没有初始化,先都初始为0。后边循环就是遍历观众,看每个人投哪个栏目,对应那种情况哪种就++。count【1】没有用处。

解题
void fun(int count[],int r[]){
    int i;
    for(i=0;i<6;i++){
        count[i]=0;
    }
    for(i=0;i<10;i++){
        switch(r[i]){
            case 1:count[1]++;break;
            case 2:count[2]++;break;
            case 3:count[3]++;break;
            case 4:count[4]++;break;
            case 5:count[5]++;break;
        }
    }
}

二十、4 编写函数fun计算主函数N个数据的平均值。

题目:编写函数fun计算主函数已读入的N个整数的平均值,以带2位小数的格式在主函数输出

函数接口定义:
double fun(int a[],int n) ;
裁判测试程序样例:
#include "stdio.h"

#define N 5

double fun(int a[],int n) ;

void main()

{

  int a[N],i;double ave ;

  for(i=0;i<N;i++)

    scanf("%d",&a[i]);;

   ave=fun(a,N);

  printf("average=%.2f\n", ave);  

 }
/* 请在这里填写答案 */
输入样例:
1 2 3 4 5
输出样例:
average=3.00

分析

简单的都自己做

解题

二十一、5 编写fun函数实现判断字符串是否是回文。

题目:主函数中输入一个以回车符为结束标志的字符串(不超过80个字符), fun函数实现判断字符串是否是回文,是则返回1,否则返回0。请完成子函数fun的设计。

函数接口定义:
int fun(char s[ ]);
裁判测试程序样例:
#define MAXN 30
#include "string.h"
#include "stdio.h"
int fun(int s[]);
int main(void)
{
    int k;
    char line[MAXN];
    k=0;
    while((line[k] = getchar()) != '\n'){
        k++;
    }
    line[k] = '\0';
    if( fun(line)==1)   /* 判断line是否回文串,返回真代表是回文 */
        printf("It is a plalindrome\n");
    else printf("It is not a plalindrome\n");
    return 0;
}    

/* 请在这里填写答案 */
输入样例:
abcdedcba
输出样例:
It is a plalindrome
分析

注意看,循环的条件,和if条件的配合。如果它不是回文,会提前跳出来,i和j会符合循环条件

解题
int fun(char s[ ]){
    int i,j,n;
    n=strlen(s);
    for(i=0,j=n-1;i<j;i++,j--){
        if(s[i]!=s[j])break;
    }
    if(i<j)return 0;
    else return 1;
    }

二十二、6 编写函数fun将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。

题目:请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。字符串在主函数输入,转换后的整数在主函数输出。注意如果是非负数字符串,则输入无需带符号。

函数接口定义:
long  fun ( char *p);
裁判测试程序样例:
#include "string.h"
long  fun ( char *p);
main()   
{ char s[10];
  long    n;
    gets(s);
  n = fun(s);
  printf("%ld\n",n);
}

/* 请在这里填写答案 */
输入样例:
-1234
输出样例:
-1234
分析

和前边题一样,数字字符变整数的运算,是通过减去“\0"达成的

解题
long  fun ( char *p){
    long result=0;
    int flag=0,i=0;
    if(*p=='-'){flag=1;i=1;}
    while(*(p+i)!='\0'){
        result=result*10+(*(p+i)-'0');
        i++;
    }
    if(flag==1){result=-result;}
    return result;
}

总结

以上就是今天要讲的内容,这些题的小思路都给出来了,大部分要敲的内容都是循环遍历,都是些比较基础的题。就这难度,大家基础好点,期中考试编程题不用太愁了。

第一次写算挺大的博文,如果有错误的地方告诉我,我及时改!

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值