甘肃省 网站建设 审批,做外贸网站多少钱,视频直播网站建设方案,搜索引擎提交入口网址文章目录 C/C笔试练习1.数组名和数组名#xff08;1#xff09;数组名和数组名的差异#xff08;2#xff09;理解数组名和指针偏移#xff08;3#xff09;理解数组名代表的含义#xff08;4#xff09;理解数组名代表的含义 2.switch循环语句#xff08;6… 文章目录 C/C笔试练习1.数组名和数组名1数组名和数组名的差异2理解数组名和指针偏移3理解数组名代表的含义4理解数组名代表的含义 2.switch循环语句6理解switch语句中的case特点 3.数据在计算机中的存储顺序7小端在计算机中的存储方式 4.编程题8字符串中找出连续最长的数字串9数组中出现次数超过一半的数字 C/C笔试练习
1.数组名和数组名
1数组名和数组名的差异 以下C语言指令
int a[5] {1,3,5,7,9};
int *p (int* )(a1);
printf(“%d,%d”,*(a1)*(p-1));运行结果是什么 A 2,1 B 3,1 C 3,9 D 运行时崩溃 数组名和数组名在C和C编程语言中具有不同的含义。 数组名数组名是用于引用数组的标识符。它可以是任何有效的标识符通常用于对数组进行索引和访问数组元素。假设有一个名为“arr”的数组就可以使用“arr[0]”来访问第一个元素以此类推。 数组名在C和C中运算符用于获取变量的地址。因此数组名是用来获取数组的地址。这通常用于传递数组到函数或从函数返回数组。当你使用数组名时你实际上得到的是一个指向数组的指针。 因此数组名和数组名的主要区别在于数组名代表的是数组中的元素而数组名代表的是整个数组的地址。 结合上面内容所以这段C的代码中定义了一个包含5个整数的数组a然后创建了一个指向整个数组类型的指针pa代表了取整个数组a1代表指针需要跳过一个a的类型大小此时的a是一整个数组所以a1代表了向后偏移一个数值大小 此时的p指向数组最尾段的下一个int类型的地址。 然后打印* (a1)和 * (p-1))a是数组名数组名不加修饰的代表了数组首元素的大小a1表示地址向后偏移一个a类型大小的指针此时的a为inta1就表示指向a数组的第二个元素*(p-1)代表p向前移动一个数据类型大小指向9即可得到结果。 答案选C 2理解数组名和指针偏移 以下程序的输出结果是
#include stdio.h
main()
{char a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p;int i;i 8;p a i;printf(%s\n, p - 3);
}A 6 B 6789 C ‘6’ D 789 首先数组a被初始化为字符数组包含10个元素值为’1’到’9’和’\0’。然后创建一个指针pa此时的a不加修饰就表示数组的首元素地址 ‘1’ 元素的地址。然后对a8表示指向首元素的地址向后偏移8个数据类型大小此时p指向9。(0和’\0’是一样的) 在printf语句中先将p向前移动3个位置即指向了字符’6’然后再打印字符串。输出的是从’6’开始的4个字符即’6789’。 答案选B 3理解数组名代表的含义 以下代码
char *ptr;
char myString[] abcdefg;
ptr myString;
ptr 5;
coutptr;代码执行之后的结果是 A Compiler error B fg C efg D defg 结合上面的内容我们容易知道ptr是一个char类型的指针此时的ptr指向myString数组的首元素地址对ptr5ptr指针向后偏移5个指向元素类型大小的距离。此时的ptr指向fcoutptr表示打印这个ptr指针指向的字符串。 答案选B 4理解数组名代表的含义 下面代码会输出()
int main()
{int a[4]{1,2,3,4};int *ptr(int*)(a1);printf(%d,*(ptr-1));
}A 4 B 1 C 2 D 3 结合上面的内容我们容易知道ptr是一个int*(a1)的指针对a1表示指针向后面偏移一整个数组的大小此时ptr指针指向4元素的后面一个元素。 要注意a1赋值给ptr的时候强转成了int*的指针要注意此时指向整个数组的指针成为了指向一个数组元素的指针。 打印时对ptr-1表示指针向前偏移一个int*类型大小此时ptr指向4。 答案选A 2.switch循环语句
6理解switch语句中的case特点 以下程序的输出结果是
#include iostream.h
int main()
{int x3,y3;switch(x%2){case 1:switch (y){case 0:coutfirst;case 1:coutsecond;break;default:couthello;}case 2:coutthird;}return 0;
}A second third B hello C first second D hellothird 在这个程序中当x%2的结果为1时y的值为3所以会先进入到x%2的case1中然后y3case1和case2都不满足直接default打印hello注意下面的语句没有break,所以程序会继续向下执行进入到x%2中的case2打印third。 正常情况下在C中每个case标签后都应该有一个break语句来防止程序继续执行下一个case。如果没有break程序将会继续执行下一个case的代码 直到遇到break或者switch结束。 答案选D 3.数据在计算机中的存储顺序
7小端在计算机中的存储方式 假设在一个 32 位 little endian 的机器上运行下面的程序结果是多少
#include stdio.h
int main()
{long long a 1, b 2, c 3;printf(%d %d %d\n, a, b, c);return 0;
}A 1,2,3 B 1,0,2 C 1,3,2 D 3,2,1 在计算机中数据的存储分为大端和小端存储什么是大端小端 大端存储模式是指数据的低位保存在内存的高地址中而数据的高位保存在内存的低地址中 小端存储模式是指数据的低位保存在内存的低地址中而数据的高位,保存在内存的高地址中。 答案选B 设计一个函数来判断当前机器的字节序
void check_sys()
{int i 1;if (*(char*)i 0){cout 大端;}else{cout 小端;}
}4.编程题
8字符串中找出连续最长的数字串
字符串中找出连续最长的数字串 解题思路 遍历字符串使用cur去记录连续的数字串如果遇到不是数字字符则表示一个连续的数字串结束了则将数字串跟之前的数字串比较如果更长则更新更长的数字串更新到ret。
#include iostream
using namespace std;int main() {string str,ret,cur;cinstr;for(int i0;istr.size();i)//遍历整个字符串{//如果是数字就加入到临时数字串cur中if(str[i]0str[i]9){curstr[i];}else//如果遇到了字符就和ret比较保存较大的数字串{if(cur.size()ret.size()){retcur;cur.clear();}else//如果cur比ret长替换ret否则重置cur{cur.clear();}}}coutret;return 0;
}9数组中出现次数超过一半的数字 解题思路1 众数就是出现次数超过数组长度一半的那个数字如果两个数不相等就消去这两个数最坏情况下每次消去一个众数和一个非众数那么如果存在众数最后留下的数肯定是众数。
class Solution {public:int MoreThanHalfNum_Solution(vectorint numbers) {if (numbers.empty()) return 0;
// 遍历每个元素并记录次数若与前一个元素相同则次数加1否则次数减1int result numbers[0];int times 1; // 次数for (int i 1; i numbers.size(); i) {if (times ! 0) {if (numbers[i] result) {times;} else {--times;}} else {result numbers[i];times 1;}}
// 判断result是否符合条件即出现次数大于数组长度的一半times 0;for (int i 0; i numbers.size(); i) {if (numbers[i] result) times;}return (times numbers.size() / 2) ? result : 0;}
};解题思路2 数组排序后如果符合条件的数存在则一定是数组中间那个数。但是时间复杂度稍高。
class Solution {
public:int MoreThanHalfNum_Solution(vectorint numbers) {sort(numbers.begin(),numbers.end());return numbers[numbers.size()/2];}
};