第一题
题目
请编写一个函数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++
都是指针操作,但它们的行为和含义有所不同。下面是它们的区别:
-
*(ss++)
:- 这是一个复合操作,它首先返回
ss
指向的当前值,然后ss
指针增加一个元素的大小(对于char
类型指针,通常是增加 1 字节)。 - 这个操作通常用于在循环中同时获取值并移动指针,但要注意,返回的值是在指针移动之前的值。
- 这是一个复合操作,它首先返回
-
*ss++
:- 这个操作是不合法的,因为它试图在后缀递增操作符
++
之前使用解引用操作符*
。在 C 语言中,你不能在递增指针的同时解引用它。
- 这个操作是不合法的,因为它试图在后缀递增操作符
-
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;
}
分析
第八题
题目
解析
分析