首页 > 其他分享 >C语言习题~day16

C语言习题~day16

时间:2024-11-18 10:46:09浏览次数:3  
标签:src right int C语言 char day16 str 习题 left

1.关于函数调用说法不正确的是:( )

A.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝

B.函数可以传址调用,传址调用的时候,可以通过形参操作实参

C.函数可以嵌套定义,但是不能嵌套调用

D.函数可以嵌套调用,但是不能嵌套定义

答案解析:

A:正确,形参按照值的方式传递,将来形参就是实参的一份临时拷贝,修改形参不会影响外部的实参

B:正确,形参按照指针方式传递,将来形参就是实参地址的一份拷贝,形参指向的是实参,修改形参指针指向的内容,  就是在操作实参

C:错误,C语言中,函数不能嵌套定义

D:正确,函数可以嵌套调用,即:A()中调用B(),B()中调用A(),但是要控制好,否则就成为无限递归

因此,选择C

2.字符串左旋  实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋一个字符得到BCDA ,ABCD左旋两个字符得到CDAB

设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:

void leftRound(char * src, int time)
{
	int i, j, tmp;
  int len = strlen(src);
  time %= len; //长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。
	for (i = 0; i < time; i++) //执行k次的单次平移
	{
		tmp = src[0];
		for(j = 0; j < len - 1; j++) //单次平移
		{
			src[j] = src[j + 1];
		}
		src[j] = tmp;
	}
}

改进一:

这个思路当然可以,但是一次一次转毕竟太麻烦,就不能一次到位么?

当然可以,我们可以选择拼接法,一次到位:

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len; //断开位置的下标
	char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
	
	strcpy(tmp, src + pos); //先将后面的全部拷过来
	strncat(tmp, src, pos); //然后将前面几个接上
	strcpy(

改进二:

这个方法要用到一个数组形成的辅助空间,让人觉得有点不爽,还可以有更好的选择,例如ABCDEFG,左旋3次后变成DEFGABC,有一个特殊的操作方式:

先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:

void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{
	int i, j;
	char tmp;

	for (i = start, j = end; i < j; i++, j--)
	{
		tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	}
}

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len;
	reverse_part(src, 0, pos - 1); //逆序前段
	reverse_part(src, pos, len - 1); //逆序后段
	reverse_part(src, 0, len - 1); //整体逆序
}

 3.模拟实现库函数strlen

/*
思路:该题比较简单,参考代码
*/
size_t my_strlen (const char * str)
{
        const char *eos = str;
        while( *eos++ ) ;
        return( eos - str - 1 );
}

4.调整数组使奇数全部都位于偶数前面。 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

/*
思路:
1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置
2. 循环进行一下操作
 a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
 b. left从前往后找,找到一个偶数后停止
 c. right从后往前找,找到一个奇数后停止
 d. 如果left和right都找到了对应的数据,则交换,继续a,
*/
void swap_arr(int arr[], int sz)
{
	int left = 0;
	int right = sz-1;
	int tmp = 0;


	while(left<right)
	{
     // 从前往后,找到一个偶数,找到后停止
		while((left<right)&&(arr[left]%2==1))
		{
			left++;
		}
     
		// 从后往前找,找一个奇数,找到后停止
		while((left<right)&& (arr[right]%2==0))
		{
			right--;
		}
     
     // 如果偶数和奇数都找到,交换这两个数据的位置
     // 然后继续找,直到两个指针相遇
		if(left<right)
		{
			tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

5.写一个函数,可以逆序一个字符串的内容。

/*
思路:该题比较简单,请参考代码
*/
void Reverse(char* str)
{
    char* left = str;
    char* right = str + strlen(str)-1;
    while(left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        ++left;
        --right;
    }
}


int main()
{
    char str[] = "hello bit";
    //在这里完成下面函数,参数自己设计,要求:使用指针
    Reverse(str);
    return 0;
}


// 注意:如果是在线OJ时,必须要考虑循环输入,因为每个算法可能有多组测试用例进行验证,参考以下main函数写法,
int main()
{
    char str[101] = {0};
    while(gets(str))
    {
        Reverse(str);
        printf("%s\n", str);
        memset(str, 0, sizeof(str)/sizeof(str[0]));
    }
    return 0;
}

标签:src,right,int,C语言,char,day16,str,习题,left
From: https://blog.csdn.net/2301_78029441/article/details/143848359

相关文章

  • C语言期末必练题目——part 12(编程题)
    10.有一个分数序列:2/1,3/2,5/3,8/5,13/8,……编程求这个序列的前20项之和。#include<stdio.h>voidmain(){ inti,t,n=20; floata=2,b=1,s=0;for(i=1;i<=n;i++){s=s+a/b;t=a;a=a+b;b=t;} printf("sum=%6.2f",s);}11.从键盘输入两个数,求出其最大值(要求使用函数完......
  • 第五章习题
    学号后四位:30185.4:点击查看代码importcvxpyascpimportnumpyasnpimportpandasaspdfromscipy.optimizeimportminimizeimportsympyasspsp.init_printing(use_unicode=True)importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['Ti......
  • 第二章习题
    学号后四位:30182.1:点击查看代码importmathimportpylabaspltimportnumpyasnpplt.rc('text',usetex=True)#调用字库x=np.linspace(-10,10,100)y1=np.cosh(x)y2=np.sinh(x)y3=math.e**x/2plt.plot(x,y1,label='$\\mathrm{cosh}(x)$'......
  • 初识C语言|素数代码之——你的代码,我的代码,好像不一样
        嘿,大家好!咱作为大一新生,来聊聊C语言输出素数这事儿。其实,说白了,这就像玩游戏找宝藏一样,路数有好多呢。咱可以老老实实用简单办法,一个个试。不过这有点傻,像个愣头青。还有个神奇的筛法,就像用个大网把合数都捞走,剩下的就是宝贝素数啦。感觉C语言像个大迷宫,找素数......
  • python基础练习题----练手
    python—练手题—40题#01-helloworldprint('helloworld!')#如果3大于0,则打印'ok'和'yes'if3>0:print('ok')print('yes')x=3y=4print(x+y)#02-printprint('helloworld!')print(�......
  • 关于我重生到21世纪学C语言这件事——指针详解(3)
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录1.字符指针变量2.数组指针变量3.⼆维数组传参的本质4.函数指针变量5.函数指针数组6.转移表1.字符指针变量在指针的类型中我们知道有⼀种指针类型为字符指针char*;⼀般使⽤:intmain(){charch='w......
  • c语言程序
    1.第⼀个C语⾔程序#include<stdio.h>intmain(){printf("helloC\n");return0;}​2.main函数每个C语⾔程序不管有多少⾏代码,都是从main函数开始执⾏的,main函数是程序的⼊⼝,main函数也被叫做:主函数。main前⾯的int表⽰main函数执......
  • HDLBIts习题(7):状态机
    (1)较难习题1:134题(fsm_ps2data)    有个积攒数据的过程。(1)较难习题2:135题(fsm_serial)        读清题意,有一个检验选择是否发送的进程。(3)较难习题3:137题(fsm_serialdp)    加入了奇偶校验位检测机制(4)较难习题4:138题(fsm_hdlc)   ......
  • HDLBIts习题(2):位操作,For循环(generate与integer)
    (1)冷门习题1:VerilogLanguage-MoreVerilogFeatures-Reductionoperators    一个矢量的位操作,多比特矢量操作会变得方便。(2)冷门习题2:VerilogLanguage-MoreVerilogFeatures-Combinationfor-loop:Vectorreversal2     Verilog中的for循环(3......
  • C语言的常见概念------1
    1.课前准备1.1什么是C语言C语言是一门计算机语言,而且是编译型的计算机语言。所以C 语言源代码都是文本文件,而计算机只能够识别二进制指令,所以我们需要对文件进行编译和链接,把文本文件翻译成二进制指令之后,机器才能执行如图,1.2选择集成开发环境集成开发环境(IDE):集编译器,......