C语言题目强化-DAY08

题型指引

  • 一、选择题
  • 二、编程题


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。


一、选择题

1、如下程序的运行结果是( )

char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);

A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab
正确答案:D
答案解析:字符串的结束标志是’\0’,而’\0’的ASCII值是0,而c[2]被初始化为’\0’,故字符串打印的内容只有"ab"。

2、若有定义: int a[2][3]; ,以下选项中对a 数组元素正确引用的是( )
A: a[2][0] B: a[2][3] C: a[0][3] D: a[1>2][1]
正确答案:D
答案解析:本题主要考虑数组越界访问的情况,二维数组的行和列都是从0开始的,对于a数组来说,行下标最大是1,列下标最大是2,
D选项中1>2表达式的值是0,正确,A是行越界,B是行和列都越界,C是列越界,选项D正确。

3、在下面的字符数组定义中,哪一个有语法错误( )
A: char a[20]=“abcdefg”; B: char a[]=“x+y=5.”; C: char a[15]; D: char a[10]=‘5’;
正确答案:D
答案解析:D中的’5’是一个字符常量,不能给字符型数组a初始化。

4、下列定义数组的语句中正确的是【多选】( )
A、

#define size 10
char str1[size], str2[size+2];

B: char str[]; C: int num[‘10’]; D: int n=5; int a[n][n+2];
正确答案:AC
答案解析
A、宏替换,选项A正确。
B、一维数组必须定义数组元素个数,选项B错误。
C、字符’0’,转换成十进制为48,所以该选项最终为int num[48],选项C正确。
D、数组定义下角标不能为变量,注:C99标准中支持了使用变量,这里不做特殊考虑,选项D错误。

5、已知i,j 都是整型变量,下列表达式中,与下标引用X[i][j] 不等效的是【多选】( )
A: *(X[i]+j) B: *(X+i)[j] C: *(X+i+j) D: *(*(X+i)+j)
正确答案:BC
答案解析
A、X[i]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],选项A正确。
B、B选项因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],选项B错误。
C、X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行会越界,选项C错误。
D、D选项是标准的指针形式访问二位数组的一个元素,选项D正确。

二、编程题

1、编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行
表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 0 <= n <= 500
输入描述:输入一行没有空格的字符串。
char c[5]={‘a’, ‘b’, ‘\0’, ‘c’, ‘\0’};
printf(“%s”, c);
#define size 10
char str1[size], str2[size+2];
输出描述:输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

牛客网【牛客网题号: HJ10 字符个数统计】

示例:
输入:abc 输入:aaa
输出:3 输出:1
#include 
#include
int count(char* str,int len)
{
    int mark[127]={0};
    int i=0;
    int count=0;
    for(i=0;i<len;i++)
    {
        mark[*(str+i)]+=1;
    }
    for(i=0;i<127;i++)
    {
        if(mark[i])
        count++;
    }
    return count;
}

int main() {
	char arr[500]={0};
	scanf("%s",arr);
	int len=strlen(arr);
	int ret=count(arr,len);
	printf("%d",ret);
    return 0;
}

代码思路:把字符对应的ASCII码值当作新一维数组的下标,初始化这个一维数组为0,遇到一个字符,例如遇到字符‘0’=48,就把原来mark[‘0’]=0即mark[48]=0自增1,当再次遇到字符’0’的时候继续自增,最后访问mark数组,如果元素不为0,则计数器加一,最后返回count即可。

2、给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

leetcode【leetcode 题号:169. 多数元素】
示例:
输入:[3,2,3]
输出:3
输入:[2,2,1,1,1,2,2]
输出:2

int majorityElement(int* nums, int numsSize){
    //...
}
int majorityElement(int* nums, int numsSize) {
    int i = 0;
    int max = nums[0];
    for (i = 0; i < numsSize; i++)
    {
        if (nums[i] > max)
            max = nums[i];
    }

    int* mark = (int*)malloc(max * sizeof(int));
    memset(mark, 0, max * sizeof(int));

    for (i = 0; i < numsSize; i++)
    {
        mark[nums[i]] += 1;
    }

    for (i = 0; i < max; i++)
    {
        if (mark[i] > (numsSize / 2))
            return i;
    }
}

代码思路:本题代码思路与上一题类似,首先从给定数组里面找到最大元素的值,以此最大值作为计数数组元素个数,开辟max * sizeof(int)个元素,并用memset函数将所有元素变为0,最后依然是遍历,以给定数组元素内容作为计数数组元素下标进行计数,最后用一个遍历训话加条件判断可以得到期望元素,该元素的值就是计数数组的下标。

你可能感兴趣的:(C语言题目强化练习,c语言,算法,java,开发语言,数据结构,c++)