暑假第十三天之每天一些题系列
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;
}
以上是关于暑假第十三天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章