首页 > 编程语言 >程序设计题(17-24)

程序设计题(17-24)

时间:2024-09-17 10:52:03浏览次数:12  
标签:24 17 int void sp ++ fun 程序设计 指针

第十七题

题目

请编写函数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++)有啥区别

让我们逐一分析这些表达式:

  1. *n++

    • 这个表达式是不正确的,因为它试图对解引用的指针结果进行递增操作,这在 C 语言中是不允许的。正确的递增操作应该是 (*n)++
  2. (*n)++

    • 这是一个前缀递增操作符,它会增加指针 n 所指向的值,然后返回增加后的值。这是正确的递增指针所指向的值的方式。
  3. *(n+1)

    • 这个表达式解引用了指针 n 向后移动一个单位的位置。它获取 n 指向的下一个内存位置的值。这通常用于数组,但如果你使用它来访问指针 n 所指向的整数的下一个位置,这是不合法的,因为 n 应该指向一个单独的整数,而不是数组。
  4. *n+1

    • 这个表达式首先解引用指针 n 得到它所指向的值,然后将这个值与 1 相加。这是一个算术表达式,返回的是一个数值,而不是对 n 所指向的值进行修改。
  5. (*n)+1

    • 这个表达式与 *n+1 相同,它返回指针 n 所指向的值加 1 的结果。它不修改 n 所指向的值,只是进行一个算术运算。
  6. *(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

相关文章

  • 程序设计题(25-32)
    第二十五题题目请编写函数fun,其功能是:在一个含有11个四位数的数组中,统计出这些数的奇数、偶数个数,然后计算出个数多的那些数的算数平均值并由函数返回,个数通过yy传回。例如,若11个数据为:1101,1202,1303,1404,1505,2611,2712,2813,2914,3202,4222则输出:yy=6,p......
  • CVE-2021-24762 复现
    一看是个wordpress,看了下版本6.0没洞,直接扔wpscan扫一下发现了个插件一搜发现perfect-survey在1.5.2之前都有洞,直接搜exp打.上官网找了个API重扫一遍,直接给出了CVE号!直接找个sqlmap的exp跑一下,注意第二个位置选n来设置cookiesqlmap-u"http://eci-2zeg18fce0yxpb7p......
  • 【2024研赛】【华为杯】2024 年研究生数学建模比赛思路、代码更新中.....
    ......
  • Ubuntu Server 24.04.1 配置静态ip
    实体机安装完后,记录一下静态ip配置方法,否则每次ssh地址都会变,很不方便参考:https://www.jb51.net/os/Ubuntu/952842.html我们可以使用Netplan工具和配置文件,为UbuntuServer设置静态IP地址。Netplan的配置文件通常位于/etc/netplan目录,取决于你的系统版本和实际环境,文件......
  • 教育部等十八部门关于加强新时代中小学科学教育工作的意见 20240917_085127
    原文教育部等十八部门关于加强新时代中小学科学教育工作的意见_国务院部门文件_中国政府网https://www.gov.cn/zhengce/zhengceku/202305/content_6883615.htm概述教育部等十八部门联合发布此意见,强调要加强科学教育,推动校内校外融合,规范科技类校外培训。这一政策为少儿编程教......
  • macOS Sequoia 15.0 (24A335) 正式版发布,ISO、IPSW、PKG 下载
    macOSSequoia15.0(24A335)正式版发布,ISO、IPSW、PKG下载iPhone镜像、Safari浏览器重大更新、备受瞩目的游戏和AppleIntelligence等众多全新功能令Mac使用体验再升级请访问原文链接:https://sysin.org/blog/macOS-Sequoia/,查看最新版。原创作品,转载请保留出处。作者......
  • macOS Sequoia 正式版(24A335)黑苹果/Mac/虚拟机系统镜像
    “ 以下内容来自于黑果魏叔官网”镜像特点完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要,可以自行直接替换opencore分区文件为clover引导文件)备注:此镜像仅适用与16g优盘以及16g以上文件哈希值:md5:......
  • 基于SpringBoot+Vue的学生交流互助平台设计与实现(2024最新,原创项目)
    文章目录1.前言2.详细视频演示3.论文参考4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.作者推荐项目12.为什么选择我?13.获取源......
  • macOS Sonoma 14.7 (23H124) 正式版发布,ISO、IPSW、PKG 下载
    macOSSonoma14.7(23H124)正式版发布,ISO、IPSW、PKG下载2024年9月17日凌晨1点,TimCook领导的Apple今天发布了macOS15Sequoia正式版,iPhone镜像、密码应用程序、窗口平铺更新等带来全新体验。Apple还为那些无法升级到Sequoia的用户发布了macOSVentura13.7......
  • 当年青少年学习编程的重要性 政策原文 20240917_090943
    新一代人工智能发展规划20240917_082658_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/12036071国务院关于印发全民科学素质行动规划纲要(2021—2035年)的通知20240917_083539_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/12......