程序修改题(11-20)

第十一题

题目

给定程序MODI1. C中,函数fun的功能是:找出n的所有因子,统计因子的个数,并判断n

是否是”完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为”完数”。

例如: 6的因子包括1、2、3,而6=1+2+3,所以6是完数。

如果是完数,函数返回值为1,否则函数返回值为0。

数组a中存放的是找到的因子,变量k中存放的是因子的个数。

#include 
int  fun(int  n, int  a[], int  *k)
{   int  m=0, i, t;
    t = n;
/**********found**********/
    for( i=0; i

解析

for( i=1; i

k=&m;

if ( t==0 )  return  1;

第十二题

题目

给定程序modi1.c中函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。

#include 
#include 
#define    N     80
int  fun(char  *s,  char  *t)
{  int  n;
   char  *p , *r;
   n=0;
   while ( *s )
   {  p=s;
/*********found**********/
      r=p;
      while(*r)
        if(*r==*p) {  r++;  p++;  }
        else  break;
/*********found**********/
      if(*r= 0)
        n++;
      s++;
   }
   return  n;
}
main()
{  char  a[N],b[N];    int   m;
   printf("\nPlease enter string a : "); gets(a);
   printf("\nPlease enter substring b : "); gets( b );
   m=fun(a, b);
   printf("\nThe result is :  m = %d\n",m);
  getchar();
}

解析

r=t;

if(*r== 0)

第十三题

题目

给定程序modi1.c中,函数fun的功能是:将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5位8进制数字。

例如,若输入77777,则输出将是32767。

#include 
#include 
#include 
#pragma warning (disable:4996)
int  fun( char *p )
{   int   n;
/**********found**********/
    n= *P-'o';
    p++;
    while( *p!=0 ) {
/**********found**********/
     	n=n*8+*P-'o';
	p++;
    }
    return  n;
}
main()
{   char   s[6];     int  i;   int   n;
    printf("Enter a string (Ocatal digits):  "); gets(s);
    if(strlen(s)>5){ printf("Error: String too longer !\n\n");exit(0); }
    for(i=0; s[i]; i++)
       if(s[i]<'0'||s[i]>'7')
       {  printf("Error: %c not is ocatal digits!\n\n",s[i]);exit(0); }
    printf("The original string:  "); puts(s);
    n=fun(s);
    printf("\n%s is convered to integer number: %d\n\n",s,n);
    getchar();
}

解析

n= *p-'0';

n=n*8+*p-'0';

第十四题

题目

程序修改题(11-20)_第1张图片

#include 

double fun ( int m )
{  double   y = 1.0 ;
   int  i ;
/**************found**************/
   for(i = 2 ; i < m ; i++)
/**************found**************/
      y -= 1 /(i * i) ;
   return( y ) ;
}

main( )
{  int n = 5 ;

   printf( "\nThe result is %lf\n", fun ( n ) ) ;
  getchar();
}

解析

for(i = 2 ; i <= m ; i++)

y -= 1.0 /(i * i) ;

第十五题

题目

给定程序MODI1. C中函数fun的功能是:从低位开始依次取长整型变量s中奇数位上的数,构成一个新数放在t中(注意:位置从0开始计算)。

例如:输入: 12345678, 则输出: 1357

输入: 123456789, 则输出: 2468

#include 
#pragma warning (disable:4996)
void fun (long s, long *t)
{   long sl = 10;
    s /= 10;
/**********found**********/
    *t = s / 10;
    while(s > 0) {
        s = s / 100;
/**********found**********/
        t = s % 10 * sl + t;
/**********found**********/
        sl /= 10;
    }
}

main()
{   long s, t;
    printf("\nPlease enter long number:");
    scanf("%ld", &s); fun(s, &t);
    printf("The result is: %ld\n", t);
}

解析

*t = s % 10;

*t = s % 10 * sl + *t;

sl *= 10;

第十六题

题目

给定程序modi1.c中的函数Creatlink的功能是创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。

#include 
#include 
typedef  struct  aa
{  int  data;
   struct  aa  *next;
} NODE;
NODE *Creatlink(int  n, int  m)
{  NODE  *h=NULL, *p, *s;
   int  i;
/**********found***********/
   p=(NODE )malloc(sizeof(NODE));
   h=p;
   p->next=NULL;
   for(i=1; i<=n; i++)
   {  s=(NODE *)malloc(sizeof(NODE));
      s->data=rand()%m;      s->next=p->next;
      p->next=s;             p=p->next;
   }
/**********found***********/
   return  p;
}
outlink(NODE  *h)
{  NODE  *p;
   p=h->next;
   printf("\n\nTHE  LIST :\n\n  HEAD ");
   while(p)
   {  printf("->%d ",p->data);
      p=p->next;
   }
   printf("\n");
}
main()
{  NODE  *head;
   head=Creatlink(8,22);
   outlink(head);
  getchar();
}

解析

p=(NODE *)malloc(sizeof(NODE));

void outlink(NODE  *h)

第十七题

题目

给定程序modi1.c中函数fun的功能是:将s所指字符串中的字母转换为按字母序列的后续字母(但Z转换为A,z转换为a),其它字符不变。

#include 
#include 
void  fun (char  *s)
{
/**********found***********/
  while(*s!='@')
  {  if(*s>='A' && *s<='Z' || *s>='a' && *s<='z')
     {  if(*s=='Z')  *s='A';
        else if(*s=='z')  *s='a';
        else              *s += 1;
     }
/**********found***********/
     (*s)++;
  }
}
main()
{  char  s[80];
   printf("\n  Enter a string with length < 80.  :\n\n  "); gets(s);
   printf("\n  The  string :  \n\n  ");  puts(s);
   fun ( s );
   printf ("\n\n  The  Cords :\n\n  ");  puts(s);
   getchar();
}

解析

while(*s!='\0')

*s++;

分析

在C语言中,`s++`、`(*s)++`、`*(s++)` 这些表达式涉及到指针和递增运算符的使用,它们的行为略有不同。为了解释它们的区别,我们先假设有一个指针 `s` 指向一个整数数组。下面是这些表达式的含义:

1. `s++`:这是后缀递增运算符。它首先返回指针 `s` 当前的值(即它指向的地址),然后 `s` 的值增加一个元素的大小。这意味着指针 `s` 会移动到下一个元素的位置。例如,如果 `s` 指向数组的第一个元素,`s++` 之后 `s` 将指向数组的第二个元素。

2. `(*s)++`:这里首先对 `s` 进行解引用,得到 `s` 指向的值,然后对这个值使用前缀递增运算符。这意味着 `s` 指向的当前元素的值会增加1。`s` 指针本身的位置不会改变。

3. `*(s++)`:这是前缀递增运算符与解引用的组合。首先,`s++` 会返回 `s` 当前的值(即它指向的地址),然后 `s` 的值增加一个元素的大小。但是,由于这里使用了 `*` 操作符,它会对返回的地址进行解引用,即返回 `s` 指向的当前元素的值。所以,这个表达式会返回 `s` 递增前的当前元素的值,而 `s` 指针本身会移动到下一个元素。

举个例子,假设有一个整数数组 `int arr[] = {1, 2, 3, 4};` 和一个指针 `int *s = arr;`,那么:

- `s++` 后,`s` 指向 `arr[1]`(即值2),表达式的值是 `arr[0]` 的地址。
- `(*s)++` 后,`s` 仍然指向 `arr[0]`,但是 `arr[0]` 的值变为2。
- `*(s++)` 后,表达式的值是 `arr[0]` 的值(即1),而 `s` 指向 `arr[1]`。

这些表达式在实际编程中可能会导致混淆,因此使用时需要格外小心。

第十八题

题目

给定程序MODI1. C中,函数fun的功能是:在有n名学生,2门课成绩的结构体数组std中,计算出第1门课程的平均分,作为函数值返回。

例如:主函数中给出了4名学生的数据,

则程序运行的结果为:第1门课程的平均分是: 76. 125000

#include  
typedef  struct
{  char  num[8];
  double  score[2];
}STU ;
double fun(STU  std[], int  n)
{  int   i;
/**********found**********/
   double  sum ;
/**********found**********/
   for(i=0; i<2 ; i++)
/**********found**********/
      sum += std[i].score[1]; 
   return  sum/n;
}
main()
{  STU  std[ ]={ "N1001", 76.5,82.0 ,"N1002", 66.5,73.0, 
              "N1005", 80.5,66.0,"N1006", 81.0,56.0 };
   printf("第1门课程的平均分是:%lf\n", fun(std,4) );
   getchar();
}

解析

   double  sum = 0.0;
   for(i=0; i    sum += std[i].score[0];

第十九题

题目

给定程序MODI1. C中,函数fun将字符串s1和s2交叉合并形成新字符串s3,合并方法为:先取s1的第1个字符存入s3,再取s2的第1个字符存入s3,以后依次类推;若s1和s2的长度不等时,较长字符串多出的字符顺序放在新生成的s3后。

例如:当s1为: "123456789",s2为: " abcdefghijk”时,

输出结果应该是: 1a2b3c4d5e6f7g8h9ijk

#include  
#include  
#pragma warning (disable:4996)
void fun( char *s1, char *s2, char *s3)
{   int i,j;
/**********************found***********************/
	for(i = 0, j = 0; (s1[i] != '\0') && (s2[i] != '\0'); i++, j = j + 1)  
	{   	s3[j] = s1[i];   
		s3[j+1] = s2[i];   
	}    
	if (s2[i] != '\0')  
	{   	for(; s2[i] != '\0'; i++, j++)   
/**********************found***********************/
		     s3[i] = s2[j];  
	}   
	else if (s1[i] != '\0')  
	{   for(; s1[i] != '\0'; i++, j++)       
			s3[j] = s1[i];
	}
/**********************found***********************/
	s3[j-1] = '\0';
}
void main() 
{  	char s1[128], s2[128], s3[255];  
	printf("Please input string1:"); 
	gets(s1);   
	printf("Please input string2:");  
	gets(s2);    
	fun(s1,s2,s3);
	printf("string:%s\n", s3);   
} 

解析

s3[++j] = s2[i];

s3[j] = s2[i]; 

s3[++j] = '\0';

第二十题

题目

给定程序MODI1. C中,调用fun函数输出字符串,当奇数次调用时要求把字符串中的小写字母转换成大写字母,偶数次调用时按输入字符串的逆序输出字符串。

#include   
#include   
#include   
#pragma warning (disable:4996)
void fun( char  *s )
{  int  i;
/**********************found***********************/
   Static  int  n = 1;   
   if ( n++ %2 )
/**********************found***********************/
      for(i=0;i<=strlen(s);i++)    
         printf("%c", islower(s[i]) ? toupper(s[i]) : s[i]);
   else
/**********************found***********************/
      for (i = strlen(s)-1; i>0; i--)   
         printf("%c", s[i]);
}
main( )
{  int  i;
   char s[] = "Hello, C Programmer";
   for (i=0; i<5; i++) {  fun(s);    printf("\n");   }
}

解析

static  int  n = 1;

for(i=0;i

for (i = strlen(s)-1; i>=0; i--)

你可能感兴趣的:(计算机二级C语言,c语言,算法,开发语言,c++,笔记,经验分享)