程序设计题

第一题

题目

请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。

例如,若输入"abc4EFG",则应输出"aBc4EFG"。

#include <stdio.h>
#include <string.h>
void fun( char *ss )
{




}

void main( void )
{
   char tt[51];void NONO ();
   printf( "\nPlease enter an character string within 50 characters:\n" );
   gets( tt );
   printf( "\n\nAfter changing, the string\n  \"%s\"", tt );
   fun(tt) ;
   printf( "\nbecomes\n  \"%s\"", tt );
   NONO();
   getchar();
}

void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char tt[51], ch;
   FILE *rf, *wf ;
   int len, i=0 ;

   rf = fopen("in.dat","r") ;
   wf = fopen("out.dat","w") ;
   while(i < 10) {
     fgets( tt, 50, rf );
     len = strlen(tt) - 1 ;
     ch = tt[len] ;
     if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
     fun(tt);
     fprintf( wf, "%s\n", tt );
     i++ ;
   }
   fclose(rf) ;
   fclose(wf) ;
}

解析

void fun( char *ss )
{
	while (*ss!='\0')
    {
		ss++;
		if(*ss>='a'&&*ss<='z')
			*ss=*ss-'a'+'A';
		ss++;
	}
}
void fun( char *ss )
{
	int i,n=0;
	char *p;
	p=ss;
	while (*p++!='\0')
		n++;
	for(i = 1; i < n; i+=2)
		if(ss[i] >= 'a' && ss[i] <= 'z')
			ss[i]=ss[i]-'a'+'A';
}

分析

在 C 语言中,*(ss++)*ss++ss++ 都是指针操作,但它们的行为和含义有所不同。下面是它们的区别:

  1. *(ss++)

    • 这是一个复合操作,它首先返回 ss 指向的当前值,然后 ss 指针增加一个元素的大小(对于 char 类型指针,通常是增加 1 字节)。
    • 这个操作通常用于在循环中同时获取值并移动指针,但要注意,返回的值是在指针移动之前的值。
  2. *ss++

    • 这个操作是不合法的,因为它试图在后缀递增操作符 ++ 之前使用解引用操作符 *。在 C 语言中,你不能在递增指针的同时解引用它。
  3. ss++

    • 这是一个后缀递增操作,它首先返回 ss 的当前值(即指针的当前地址),然后 ss 指针增加一个元素的大小。
    • 这个操作通常用于在循环中移动指针,但返回的值是指针移动之前的地址,所以在使用返回的地址时要小心,因为它可能指向已经移动过的内存位置。

第二题

题目

请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。

例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。

#include <stdio.h>
#define    N    80
void  fun(int  *w, int  p, int  n)
{



}
main()
{  int  a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int  i,p,n=15;void NONO ();
   printf("The original data:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\nEnter  p:  ");scanf("%d",&p);
   fun(a,p,n);
   printf("\nThe data after moving:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\n");
   NONO();
   getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf,*wf ; int a[N], i, j, p, n ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 5 ; i++) {
    fscanf(rf, "%d %d", &n, &p) ;
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
    fun(a, p, n) ;
    for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
  }
  fclose(rf) ; fclose(wf) ;
}

解析

void  fun(int  *w, int  p, int  n)
{
	int b[N],c[N],i,j,k,m;
	for(i=0;i<=p;i++)
		b[i]=w[i];
	for(j=p+1;j<n;j++)
		c[j-p-1]=w[j];
	for(k=0;k<n-p-1;k++)
		w[k]=c[k];
	for(m=0;m<=p;m++)
		w[m+n-p-1]=b[m];
}

分析

第三题

题目

请编写一个函数fun,它的功能是:计算并输出给定整数n的所有因子(不包括1与n自身)之和。规定n的值不大于1000。

例如,在主函数中从键盘给n输入的值为856,则输出为: sum=763。

#include <stdio.h>
#pragma warning (disable:4996)
int fun(int  n)
{


}
main()
{ int  n,sum;
  void NONO( );
  printf("Input n:  ");  scanf("%d",&n);  getchar();
  sum=fun(n);
  printf("sum=%d\n",sum);
  NONO();
  getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int i, n, sum ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    sum = fun(n) ;
    fprintf(wf, "%d=%d\n", n, sum) ;
  }
  fclose(rf) ; fclose(wf) ;
}

解析

int fun(int  n)
{
	int i,sum=0;
	if(n<=1000)
		for(i=2;i<n;i++)
			if(n%i==0)
				sum+=i;
	return sum;
}
int fun(int  n)
{
	int i,sum=0;
	if(n<=1000)
		for(i=2;i<=n/2;i++)
			if(n%i==0)
				sum+=i;
	return sum;
}

分析

第二种方法很怪细细品

第四题

题目

请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)。

例如: 实型数为1234.567,则函数返回1234.570000;

实型数为1234.564,则函数返回1234.560000。

#include <stdio.h>
float fun ( float  h )
{



}

main( )
{   float  a;void NONO ();
    printf ("Enter  a:  "); scanf ( "%f", &a );
    printf ( "The original data is :   " );
    printf ( "%f \n\n", a );
    printf ( "The result :  %f\n", fun ( a ) );
    NONO( );
  getchar();
}

void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
  int i ;
  float a ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 20 ; i++) {
    fscanf(rf, "%f", &a) ;
    fprintf(wf, "%f\n", fun(a)) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

解析

float fun(float h) 
{
    float k = 0.0;
    if ((int)(h * 1000) % 10 >= 5) 
        k = (int)(h * 100) + 1.0;
    else 
        k = (int)(h * 100);
    return  k / 100.0;
}
float fun(float h) {
    return (int)(h * 100 + 0.5) / 100.0;
}

分析

第二段代码好极了

要将一个浮点数,经行四舍五入到小数点后面的n位,可以先将改数乘以10的n次方,然后将该数加上0.5,对其取整,然后除以10的n次方即可。

第五题

题目

请编写函数fun,其功能是:计算并输出下列多项式的值:

例如,在主函数中从键盘给n输入15,则输出为:s=2.718282。

注意:要求n的值大于1但不大于100。

#include <stdio.h>
#pragma warning (disable:4996)
double  fun(int  n)
{


}
main()
{  int  n;     double  s;
   void NONO( );
   printf("Input n:  ");  scanf("%d",&n); getchar();
   s=fun(n);
   printf("s=%f\n",s);
   NONO();
   getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int n, i ; double s ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%lf\n", s) ;
  }
  fclose(rf) ; fclose(wf) ;
}

解析

double  fun(int  n)
{
	int i=1;
	double t=1.0,s=1.0;
	if(n>1&&n<=100)
		while (i<=n){
			t*=i;
		    s+=1.0/t;
			i++;
		}
    return s;
}

分析

第六题

题目

请编写函数fun,其功能是:统计出x所指数组中能被e整除的元素个数,通过函数值返回

主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中。

例如:当数组x内容为1, 7,8,6, 10, 15, 11, 13, 29,31,整数e内容为3时,

输出结果应该是: n=2, sum=110

#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{



}
main()
{  
	void NONO();
	int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
	n=fun(x, e, &sum);
	printf("n=%d,sum=%d\n", n, sum);
	NONO();
}



void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, x[10], n, e, sum;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<5; i++) {
        for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]);  fscanf(rf, "%d", &e);
        n = fun( x, e, &sum );
        fprintf(wf, "%d, %d\n", n, sum);
    }
   fclose(rf) ;
   fclose(wf) ;
}

解析

int fun(int x[], int e, int *sum)
{
	int i,n=0;
	*sum=0;
	for(i=0;i<N;i++){
		if(x[i]/e==0)
			n++;
		else
			*sum+=x[i];
    }
	return n;
}

分析

一定要注意细节%,/不要用错了,一定要赋初值

第七题

题目

请编写函数fun:在形参指针所指的4个整数中找出最大值和最小值,

最大的放在a中,最小的放在d中。

#include   <stdio.h>
void NONO();
void  fun(int  *a, int  *b, int  *c, int  *d)
{



}
main()
{  int  a, b, c, d;
   printf("请输入4个整数:    ");  scanf("%d%d%d%d", &a,&b,&c,&d);
   printf("输入数据:    %d,%d,%d,%d\n", a, b, c, d);
   fun(&a,&b,&c,&d); 
   printf("最大值:%d,最小值:%d\n", a, d);
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
     fun(&a,&b,&c,&d); 
     fprintf(wf, "a=%d,d=%d\n", a, d);
  }
  fclose(fp) ;
  fclose(wf) ;
}

解析

void  fun(int  *a, int  *b, int  *c, int  *d)
{
	int i,j,temp;
	int arr[4]={*a,*b,*c,*d};
//冒泡排序
	for(i=0;i<4;i++)
		for(j=0;j<4-1-i;j++)
			if (arr[j] < arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
	*a=arr[0];
	*d=arr[3];
}
void  fun(int  *a, int  *b, int  *c, int  *d)
{
	int max,min;
	max=*a;
	min=*d;
	if(*b>max)
		max=*b;
	if(*c>max)
		max=*c;
	if(*d>max)
		max=*d;
	if(*a<min)
		min=*a;
	if(*b<min)
		min=*b;
	if(*c<min)
		min=*c;
	*a=max;
	*d=min;
}

分析

第八题

题目

解析

分析

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值