Day 16 求行列均最大的数, 字符串转数字, 字符串中的当单词逆序

本文深入探讨C语言的高级特性,包括求余运算符的适用范围、逻辑运算符的短路效应、位移操作的细节、变量声明与初始化的常见错误、指针与数组的复杂操作、以及字符串和数值转换的实用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.C语言中,运算对象必须是整型数的运算符是(A)

A % B / C %和/ D *
求余运算符要求两个操作数必须为整型或者整型兼容的数据类型(char型, short型, 枚举,char型,对应的ASCII码编号与整型相兼容)
/ 运算前后为什么类型,结果就为什么类型,两整数相除,结果只保留整数部分。



2.在使用逻辑与(&&)和逻辑或(||)时要注意表达式截断问题。
(1) 表达式1 && 表达式2 //如果表达式1为假则后面的表达式2截断不会被计算。
(2) 表达式1 || 表达式2 // 如果表达式1为真时则后面的表达式2截断不会被计算。



3.移动:(1)左移时低位补0.
(2)右移时: 无符号数,最高位补0; 有符号数,最高位补符号位。



4.float *pf = &f, f;(错误) 应该要定义在前使用在后。



5.d = y++; y++ 是一个临时变量, y++未加, y 已加。



6.int a[5][4], *p = a[0]; 则 (p + 24 + 3) 等于( D)

A a[2][0] B a[2][1] C a[2][2] D a[2][3]
//P 向后偏移11个元素。



7.int a[5][4], (*p)[4] = a; ,数组a的首地址为100, *(p+2)+3 等于(C)
A 116 B 118 C 144 D 122

//P为数组的指针 p+2 指向第二行首元素, *(p+2)指向第二行首元素,此时地址加32
*(p +2)+3指向第二行第三列元素。 地址再加12, 则共加了44. 答案为144



8.int a[] = {1, 3, 5, 7, 9}, *p = a; 则值为5的表达式是()

A P+=2; *P++; B P+=2; *++P; C P+=2; (*P)++; D a+=2; *a;
//A选项地址加2后, *p++, p++还为加只是p加了,因此A正确。



9.设变量定义为 int x, *p = &x; 则&*p 相当于()

A P B *P C x D *&x
//int *p; p = &x; *p = x; &x 就相当与p



10.表达式 !x 等价于 (x == 0)
//要使表达式x取非为真, 则x 必为假, 非0即为真0即是假。



给定一个字符串"i love china", 编写程序完成以单词为单位的逆序,如"china love i", 并要求不允许使用第三方变量保存数据,
但可以使用辅助指针变量等。

分析:可以先将字符串整体先逆序过来(整体逆序时将begin++, 将end-- 当begin <= end 时满足条件),然后再将其中的每个单词再逆序过来。整体逆序时只需要在其中定义一个中间变量交换一下
在将单个单词逆序时,要考虑一开始是否为空格,定义两个指针变量, begin , end .用end 找到单个单词结束的位置当end找到时
要将end减一下从而找到单词末尾的有效字符。

#include <string.h>
void StrSwap(char *begin, char *end)
{
//printf("ni\n"); //测试语句可以不要

	while(begin <= end)
	{
		char c = *begin;
		*begin = *end;
		*end = c;
		++begin;
		--end;
	}

//	printf("hao\n"); //测试语句可以不要

}
void WordSwap(char *pstr)
{

	char *begin = NULL;
	char *end = NULL;
	StrSwap(pstr, &pstr[strlen(pstr) - 1]);
	begin = pstr;
	while(*begin)  //此处不可以用pstr否则死循环
	{
	//	begin = pstr;//此句要在大循环外面否则回来后又会赋前面的地址,会导致程序崩溃。
		while(*begin == ' ' && *begin !='\0')
		{
		
			++begin;

		}
		end = begin;

		while(*end != ' ' && *end != '\0')
		{
		
			++end;
		}
		--end;
		StrSwap(begin, end);
		begin = end + 1;
	
	}

}

int main(void)
{

	char s[50] = "i love china";
	printf("%s\n", s);
	WordSwap(s);
	printf("%s\n",s);

	return 0;

}


将字符串转换为数值

int Atoi(const char *p)
{
	int ret = 0;
	while(*p)
	{
		ret = ret *10 + (*p - '0');
		++p;
	}

	return ret;
}
int main(void)
{

	int ret = 0;
	char a[] = "123456";
	ret = Atoi(a);
	printf("%d\n", ret);
	
}


找行列最大,并打印出行号列号

void findTheMax(int (*a)[4], int n)
{

	int i, j, max_x[10], max_y[10];
	for(i = 0; i < n; ++i)  //找行最大
	{
		max_x[i] = a[i][0];
		for(j = 0;j < 4; ++j)
		{
			if(max_x[i] < a[i][j])
			{
				max_x[i] = a[i][j];
			}

		}
	//	printf("%d \n", max_x[i]);	
	}


	for(j = 0; j < 4; ++j)  //找列最大
	{
	
		max_y[j] = a[0][j];
		for(i = 0; i < n; ++i)
		{
		
			if(max_y[j] < a[i][j])
			{
				max_y[j] = a[i][j];
			}

		}
	//	printf("%d\n", max_y[j]);
	}


		
		for(i = 0; i < n; ++i)  //找行列相等的
		{
		
			for(j = 0; j < 4; ++j )
			{
			
				if(max_x[i] == max_y[j])
				{
					printf("a[%d][%d] = %d \n", i, j, max_x[i]);
				}
			}

		}

}

int main(void)
{                                                                           
	int a[3][4] = {{123, 94, -10, 218},
					{3, 9, 100, -83},
					{45, 166, 44, -99}};

	findTheMax(a, sizeof(a) / sizeof(a[0]));

	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值