暑假第十三天之每天一些题系列

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第十三天之每天一些题系列相关的知识,希望对你有一定的参考价值。

暑假第十三天之每天一些题系列

一、选择题

  • 如果二进制文件 a.dat 已经存在,现在要求写入全新数据,应以什么方式打开
    A. “w” B. “wb” C. “w+” D. “wb+”

答案解析:

首先a.dat是二进制文件,现在要求写入数据,那我们需要以二进制写文件的方式打开文件,即"wb"

文件的打开方式表:

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)“ab”(追加) 向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件
  • int c[] = {1, 3, 5};int *k = c+1;printf("%d",*++k) 输出的结果是____
    A. 3 B. 4 C. 5 D. 6

答案解析:

k指向数组第二个元素,++k是先++后使用,++k表达式的值为第三个元素的地址,解引用得到5,即输出结果为5

  • 直接使文件指针重新定位到文件读写的首地址的函数是
    A. ftell() 函数 B. fseek() 函数 C. rewind() 函数 D. ferror() 函数

答案解析:

rewind函数是使文件指针重新定位到文件读写的首地址的函数

想了解关于文件函数的详解,请到这篇文章:文件操作

  • 若 p1、p2 都是整形指针, p1 已经指向变量 x ,要使 p2 也指向 x , 哪个是正确的
    A. p2 = p1; B. p2 = **p1; C. p2 = &p1; D. p2 = *p1;

答案解析:

直接将p1赋给p2即可,其他都是错误的。p1只是一级指针对他两次解引用肯定是不行的,而C其实是让p2指向了p1,D:*p1是拿到了x,将它赋给p2,p2是指针,很明显是错误的

  • 有如下代码,则以下各输入语句中错误的是____
struct student
{
    char name[10];
    int age;
    char gender;
}std[3], *p=std;

A. scanf("%d" ,&(*p).age );
B. scanf("%c" ,&std[0].gender);
C. scanf("%c" ,&(p->gender));
D. scanf("%s" ,&std.name);

答案解析:

std是一个元素类型为struct student的数组,点操作符的使用是:结构体变量.成员变量,是不能使用数组名去使用的。

二、填空题

  • 下列代码段打印结果是
#include <stdio.h>
int main (void)
{
    int a = 2,*p1,**p2;
    p2 = &p1;
    p1 = &a;
    a++;
    printf("%d,%d,%d\\n",a,*p1,**p2);
    return 0;
}

答案解析:

p1,p2分别是一级指针和二级指针,p1指向a,p2指向p1,a++,现在a变为了3,*p1拿到了a,故打印3,*p2拿到了p1,再解引用拿到了a,即也是打印3,故最后打印3,3,3

  • 下面程序运行结果是____
int main()
{
	int k, j, s;
	for(k=2; k<6; k++,k++)
	{
        s = 1;
        for(j=k; j<6; j++)
        s += j;
	}
    printf("%d\\n",s);
    return 0;
}

答案解析:

首先看外面的这个循环,外面的这个循环初始条件k=2,循环的判断部分是k<6,循环的调整部分为两个k++,总的来说,外面的循环一共进行两次,再看里面这个循环,第一次循环下来s=15,但是当k=4使,这里又将s=1,然后再进行里面的循环,即1+4+5,得10,即最后打印结果为10。

  • 下面的程序运行结果是
int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++) += 123;
printf("%d,%d",*ptr,*(++ptr));

答案解析:

数组名为首元素的地址,ptr指向首元素,*(ptr++) += 123;ptr是后置++,先使用后++,*(ptr++)+=123,*(ptr++)是arr[0],即arr[0]=129,因为这里ptr++了两次,故此时ptr指向了数组第三个元素,*ptr拿到的是第三个元素,打印8,*(++ptr)是前置++,故打印的是8

三、算法题

题目描述:

编写一个函数,求一个数字是否是回文数。回文数概念:给定一个数,这个数顺读和逆读都是一样的。例如:
121,1221是回文数,123,1231不是回文数。

思路:

我们先计算该数字为几位数,然后开辟一个位数个数为大小的数组,然后将该数字的每一位存在数组中,然后定义两个指针,一个指向头,一个指向尾,判断它两指向内容是不是相等,相等则头指针++,尾指针–,不相等则不是回文数字,否则继续,直到begin>=end,这时就是回文数字

注意:

拿到一个数的个位数n%10;去掉一个数的个位数n=n/10

代码如下:

#include<malloc.h>
int judge_palindrome(int num)
{
    //1、判断它为几位数
    int count = 0;
    int temp = num;
    while (temp)
    {
        count++;
        temp /= 10;
    }
    int* nums = (int*)malloc(count * sizeof(int));//动态开辟一个数组
    if (nums == NULL)
    {
        perror("malloc");
        return -1;
    }
    //取每一位放入数组中
    int i = 0;
    for (i = 0; i < count; i++)
    {
        if(num)
        {
            nums[i] = num % 10;
            num /= 10;
        }
    }
    int* begin = nums;//指向第一个元素
    int* end = nums + count - 1;//指向最后一个元素
    //判断回文
    while (begin < end)
    {
        if (*begin == *end)
        {
            begin++;
            end--;
        }
        else
        {
            free(nums);
            return 0;
        }
    }
    free(nums);
    return 1;
}
int main()
{
    if (judge_palindrome(12341))
    {
        if (judge_palindrome(12341) == -1)
        {
            printf("动态开辟失败\\n");
        }
        printf("是回文数字\\n");
    }
    else
    {
        
        printf("不是回文数字\\n");
    }
    return 0;
}

以上是关于暑假第十三天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章

暑假第十七天之每天一些题系列

暑假第十八天之每天一些题系列

暑假第十六天之每天一些题系列

暑假第一天之每天一些题系列

暑假第六天之每天一些题系列

暑假第八天之每天一些题系列