第十七题
题目
请编写函数fun,其功能是:分别求一个双精度数的整数部分和小数部分,并通过指针返回。
例如:程序输入的数为: 5104. 7583,则输出的整数部分是: 5104,小数部分是:0. 758300。
#include <stdio.h>
#pragma warning (disable:4996)
void fun( double aa, int *x, double *y )
{
}
main()
{ void NONO();
double aa, b; int a;
printf("请输入一个双精度数: ");scanf("%lf",&aa);
fun( aa, &a, &b );
printf( "%f的整数部分是: %d 小数部分是%f\n", aa,a,b );
NONO();
}
void NONO()
{
FILE *in, *out ;
double aa, b; int a;
int i ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%lf", &aa) ;
fun( aa, &a, &b );
fprintf(out, "%f的整数部分是: %d 小数部分是%f\n", aa,a,b );
}
fclose(in) ;
fclose(out) ;
}
解析
void fun( double aa, int *x, double *y )
{
*x=aa;
*y=aa-*x;
}
第十八题
题目
请编写函数fun,函数的功能是:统计一行字符串中单词的个数作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。
#include <stdio.h>
#include <string.h>
#define N 80
int fun( char *s)
{
}
main()
{ char line[N]; int num=0;void NONO ();
printf("Enter a string :\n"); gets(line);
num=fun( line );
printf("The number of word is : %d\n\n",num);
NONO();
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, num ; char line[N], *p ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(line, N, rf) ;
p = strchr(line, '\n') ;
if(p != NULL) *p = 0 ;
num = fun(line) ;
fprintf(wf, "%d\n", num) ;
}
fclose(rf) ; fclose(wf) ;
}
解析
int fun( char *s)
{
int n=0;
while(*s!=0){
if(*s==' ')
n++;
s++;
}
return n+1;
}
第十九题
题目
有一个很奇怪的车牌号,它是一个4位十进制数,是某一个数的平方数,且这4个数字从
右至左一个比一个大。程序的功能是把这个车牌号找出来,部分程序已给出。
请编写函数fun,其功能是:将一个4位数的每一位数分离出来,
并依次存放在结构体变量成员中,通过函数值返回给主函数。
例如,一个4位数n为2579,则应把2放在res. m3中,
把5放在res. m2中,把7放在res. m1中,把9放在res. m0中。
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
struct BITS { int m3, m2, m1, m0; };
struct BITS fun(int n)
{
struct BITS res;
/* 在这里将函数代码补充完整 */
}
main( )
{ struct BITS a;
void NONO();
int i=0, n=0;
for (i=32; i<100; i++)
{ n = i * i;
a= fun(n);
if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
printf("No. is %d\n", n);
}
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
struct BITS a;
FILE *fp ;
int i=0, n=0;
fp = fopen("out.dat","w") ;
for (i=32; i<100; i++)
{ n = i * i;
a= fun(n);
if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
fprintf(fp, "No. is %d\n", n);
}
fclose(fp);
}
解析
struct BITS fun(int n)
{
struct BITS res;
/* 在这里将函数代码补充完整 */
res.m0=n%10;
res.m1=n/10%10;
res.m2=n/100%10;
res.m3=n/1000;
return res;
}
第二十题
题目
请编写函数fun,其功能是将一个数字字符串转换成与其逆向串面值相同的长整型整数。
可调用strlen函数求字符串的长度。
例如:在键盘输入字符串2345219,
函数返回长整型数9125432。
#include <stdio.h>
#include <string.h>
void NONO();
long fun( char *s )
{
}
main()
{ char s[10]; long r;
printf("请输入一个长度不超过9个字符的数字字符串 : "); gets(s);
r = fun( s );
printf(" r = %ld\n" , r );
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i; long r;
char s[10], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s, 10, fp);
p = strchr(s, '\n');
if (p) *p = 0;
r = fun(s);
fprintf(wf, "%ld\n", r);
}
fclose(fp) ;
fclose(wf) ;
}
解析
long fun( char *s )
{
long i,len,k,sum=0;
len=strlen(s);
for(i=len-1;i>=0;i--){
k=s[i]-'0';
sum=sum*10+k;
}
return sum;
}
第二十一题
题目
请编写函数fun(char *sp, int *ct), 其功能是,对传给sp的字符串,分别统计两个相连
字母“ea”、“ou”和“iu”出现的次数(不能使用函数strstr()),
并将统计结果存入ct所指数组中。
例如:若字符串的内容为“abeaeafeeaoukgdoouuoioui fwieeotiu”,
则运行结果为:3, 3, 1。
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun(char*sp ,int *ct)
{
}
main()
{ void NONO();
char txt[200]="abeaeafeeaoukgdoouuoiouifwieeotiu";
int c[3];
fun(txt,c);
printf("%d,%d,%d\n",c[0],c[1],c[2]);
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ;
int i, c[3] ;
char txt[200], *p ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(txt, 200, rf) ;
p = strchr(txt, '\n') ;
if(p != NULL) *p = 0 ;
fun(txt,c);
fprintf(wf, "%d,%d,%d\n",c[0],c[1],c[2]);
}
fclose(rf) ; fclose(wf) ;
}
解析
void fun(char*sp ,int *ct)
{
for(int i=0;i<3;i++)
ct[i]=0;
while(*sp!='\0'){
int j=0;
if(sp[j]=='e'&&sp[j+1]=='a')
ct[0]++;
if(sp[j]=='o'&&sp[j+1]=='u')
ct[1]++;
if(sp[j]=='i'&&sp[j+1]=='u')
ct[2]++;
sp++;
j++;
}
}
分析
下面是错误答案
void fun(char*sp ,int *ct)
{
for(int i=0;i<3;i++)
ct[i]=0;
while(*sp!='\0'){
if(*sp=='e'&&*(sp+1)=='a')
ct[0]++;
if(*sp=='o'&&*(sp+1)=='u')
ct[1]++;
if(*sp=='i'&&*(sp+1)=='u')
ct[2]++;
}
}
在 C 语言中,指针和数组的索引操作有细微的差别,但它们在很多情况下可以互换使用。下面是您提到的四种操作方式的区别:
1. `*(sp + 1)`:
- 这是一个指针运算,其中 `sp` 是一个指针,指向一个元素(例如,一个字符)。
- `sp + 1` 将指针移动到当前指向的元素之后的下一个元素。
- `*` 操作符用于解引用指针,获取指针指向的值。
- 因此,`*(sp + 1)` 获取的是 `sp` 当前指向的元素之后的下一个元素的值。
2. `*sp++`:
- 这是一个后缀递增操作,它首先返回 `sp` 当前指向的值,然后将 `sp` 增加一个元素的大小。
- 这意味着 `*sp++` 会返回 `sp` 当前指向的元素的值,然后 `sp` 会指向下一个元素。
- 这种操作通常用于在遍历字符串或数组时获取当前元素的值并移动指针到下一个元素。
3. `sp[i++]`:
- 这是一个数组索引操作,其中 `sp` 是一个数组名(在 C 语言中,数组名可以作为指向数组第一个元素的指针),`i` 是索引变量。
- `i++` 是后缀递增操作,它首先使用 `i` 的当前值进行索引操作,然后 `i` 的值增加1。
- 因此,`sp[i++]` 会返回 `sp` 数组中索引为 `i` 的元素的值,然后 `i` 的值增加1。
4. `sp[i+1]`:
- 这也是一个数组索引操作,其中 `i` 的值直接加1后用于索引 `sp` 数组。
- 它返回 `sp` 数组中索引为 `i+1` 的元素的值,而不改变 `i` 的值。
- 这种操作通常用于直接访问数组中特定索引的元素。
总结:
- `*(sp + 1)` 和 `sp[i+1]` 都用于访问指针或数组中下一个元素的值,但 `*(sp + 1)` 是指针运算,而 `sp[i+1]` 是数组索引运算。
- `*sp++` 和 `sp[i++]` 都用于在获取当前元素的值的同时将指针或索引移动到下一个元素,但 `*sp++` 是指针运算,而 `sp[i++]` 是数组索引运算。
在 C 语言中,数组名可以作为指针使用,因此很多情况下指针和数组索引可以互换使用,但它们的语义和使用方式有所不同。
第二十二题
题目
请编写函数fun,它的功能是:求出能整除形参x且不是偶数的所有整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
例如,若x中的值为:35,则有4个数符合要求,它们是:1,5,7,35。
#include <stdio.h>
void fun ( int x, int pp[], int *n )
{
}
main( )
{ int x, aa[1000], n, i ;void NONO ();
printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;
fun(x, aa, &n ) ;
for( i = 0 ; i < n ; i++ )
printf("%d ", aa[i]) ;
printf("\n") ;
NONO( ) ;
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int x, aa[1000], n, i, j ;
FILE *fp ;
fp = fopen("out.dat","w") ;
for(j = 0 ; j < 10 ; j++) {
x = 30 + j ;
fun(x, aa, &n) ;
for(i = 0 ; i < n ; i++) fprintf(fp, "%d ", aa[i]) ;
fprintf(fp, "\n") ;
}
fclose(fp) ;
}
解析
void fun ( int x, int pp[], int *n )
{
*n=0;
int i;
for(i=1;i<=x;i++)
if(x%i==0&&i%2!=0){
pp[*n]=i;
(*n)++;
}
}
分析
*n++,(*n)++,*(n+1),*n+1,(*n)+1,*(n++)有啥区别
让我们逐一分析这些表达式:
-
*n++
:- 这个表达式是不正确的,因为它试图对解引用的指针结果进行递增操作,这在 C 语言中是不允许的。正确的递增操作应该是
(*n)++
。
- 这个表达式是不正确的,因为它试图对解引用的指针结果进行递增操作,这在 C 语言中是不允许的。正确的递增操作应该是
-
(*n)++
:- 这是一个前缀递增操作符,它会增加指针
n
所指向的值,然后返回增加后的值。这是正确的递增指针所指向的值的方式。
- 这是一个前缀递增操作符,它会增加指针
-
*(n+1)
:- 这个表达式解引用了指针
n
向后移动一个单位的位置。它获取n
指向的下一个内存位置的值。这通常用于数组,但如果你使用它来访问指针n
所指向的整数的下一个位置,这是不合法的,因为n
应该指向一个单独的整数,而不是数组。
- 这个表达式解引用了指针
-
*n+1
:- 这个表达式首先解引用指针
n
得到它所指向的值,然后将这个值与 1 相加。这是一个算术表达式,返回的是一个数值,而不是对n
所指向的值进行修改。
- 这个表达式首先解引用指针
-
(*n)+1
:- 这个表达式与
*n+1
相同,它返回指针n
所指向的值加 1 的结果。它不修改n
所指向的值,只是进行一个算术运算。
- 这个表达式与
-
*(n++)
:- 这是一个后缀递增操作符,它首先返回指针
n
当前所指向的值,然后增加n
的值(即指针指向下一个内存位置)。这个操作通常用于数组遍历,但如果你使用它来处理指针n
,这是不合法的,因为n
应该指向一个单独的整数,而不是数组。
- 这是一个后缀递增操作符,它首先返回指针
在 C 语言中,指针递增通常用于数组遍历,而不是单个整数。对于单个整数的递增,你应该使用 (*n)++
或 (*n) += 1
。下面是正确使用这些表达式的例子:
int value = 10;
int *n = &value;
// 正确的递增操作
(*n)++; // 现在 value 为 11
// 算术表达式,不修改 value
int temp = *n + 1; // temp 为 11,但 value 保持不变
在你的函数 fun
中,你应该使用 (*n)++
来递增计数器。例如
void fun(int x, int pp[], int *n) {
*n = 0;
for (int i = 1; i <= x; i++) {
if (x % i == 0 && i % 2 != 0) {
pp[*n] = i;
(*n)++; // 正确的递增操作
}
}
}
第二十三题
题目
编写函数fun,它的功能是:求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并作为函数值返回。
例如若n为1000时,函数值应为: s=153.909064。
#include <math.h>
#include <stdio.h>
double fun( int n)
{
}
main() /* 主函数 */
{ void NONO ();
printf("s =%f\n", fun ( 1000) );
NONO();
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n ;
double s;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
解析
double fun( int n)
{
int i;
double sum=0.0;
for(i=1;i<n;i++)
if(i%3==0&&i%7==0)
sum+=i;
return sqrt(sum);
}
第二十四题
题目
请编写函数fun,函数的功能是:将M行N列的二维数组中的数据按列的顺序依次放到一维数组中。例如,二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应是:
33 44 55 33 44 55 33 44 55 33 44 55
#include <stdio.h>
void fun(int s[][10], int b[], int *n, int mm, int nn)
{
/* 以下代码仅供参考 */
int i,j,np=0; /* np用作b数组下标 */
*n=np;
}
main()
{ int w[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;
int a[100]={0}, n=0;void NONO ();
printf("The matrix:\n");
for(i=0; i<3; i++)
{ for(j=0;j<4; j++)printf("%3d",w[i][j]);
printf("\n");
}
fun(w,a,&n,3,4);
printf("The A array:\n");
for(i=0;i<n;i++)printf("%3d",a[i]);printf("\n\n");
NONO();
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, j, k ;
int w[10][10], a[100], n = 0, mm, nn ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(k = 0 ; k < 5 ; k++) {
fscanf(rf, "%d %d", &mm, &nn) ;
for(i = 0 ; i < mm ; i++)
for(j = 0 ; j < nn ; j++) fscanf(rf, "%d", &w[i][j]) ;
fun(w, a, &n, mm, nn) ;
for(i = 0 ; i < n ; i++) fprintf(wf, "%3d", a[i]) ; fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
解析
void fun(int s[][10], int b[], int *n, int mm, int nn)
{
/* 以下代码仅供参考 */
int i,j,np=0; /* np用作b数组下标 */
for(i=0;i<nn;i++)
for(j=0;j<mm;j++)
b[np++]=s[j][i];
*n=np;
}
标签:24,17,int,void,sp,++,fun,程序设计,指针
From: https://blog.csdn.net/2401_82772407/article/details/142287670