0
点赞
收藏
分享

微信扫一扫

假期复习总结day1-2

Java旺 2022-02-21 阅读 31
c++

这里是knous,假期已经过去,作业也写的差不多了,这里就写几个专栏分享一下,难度不高,适合新手

day 1

1 、执行下面程序,正确的输出是( )

int x = 5 , y = 7 ;

void swap ()

{

int z ;

z = x ;

x = y ;

y = z ;

}

int main ()

{

int x = 3 , y = 8 ;

swap ();

printf ( "%d,%d\n" x , y );

return 0 ;

}

A: 5,7 B: 7,5 C: 3,8 D: 8,3

这道题非常简单,进去函数,我们创建了变量x y,随后我们调用函数swap,但在传值的时候我们什么也没传过去,那我们进入函数内部,这里又定义了几个变量,这里我们完全不用管它定义了什么,这是一个变量的作用域的相关知识,因为这里在函数内部创建的变量,所以一旦出了函数外部就自动销毁,最后打印出来的自然是c,3 8.

2 、以下不正确的定义语句是( )

A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0} ;

B: char c2[] = {'\x10', '\xa', '\8'} ;

C: char c1[] = {'1','2','3','4','5'} ;

D: int y[5+3]={0, 1, 3, 5, 7, 9} ;

又是移到很简单的题,我们在创建数组的时候一定要注意:在创建数组的时候要么括号里面什么都

不加,它自动根据你初始化的内容创建大小,要么固定大小创建数组,一定不能在括号里面写表达式,所以这题选d

3 test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】(

#define INT_PTR int*

typedef int* int_ptr ;

INT_PTR a , b ;

int_ptr c , d ;

这题也不难,#define我们知道是将后面的内容定义为前面的内容,而typedef是该类型定义为一个别名,所以不符合我们题目要求,cd考的是int prt,这里可以理解为是进行一次宏替换,替换完应该是:int* a,int*c,所以这题选择acd

4 、 若给定条件表达式 (M)?(a++):(a -- ) ,则其中表达式 M ( )

A: (M==0) 等价 B: (M==1) 等价 C: (M!=0) 等价 D: (M!=1) 等价

我们先要判断这个表达式所表现的意思,先判断m,若m为假,则a++,若m为真,则a--,那么若以满足等价条件,则m取0的时候要为假,m取非零的时候要为真,这么看下来,也只有c可以选。

5 、有如下定义语句,则正确的输入语句是【多选】( )

int b ;

char c [ 10 ];

A: scanf("%d%s",&b,&c) ;

B: scanf("%d%s",&b,c) ;

C: scanf("%d%s",b,c) ;

D: scanf("%d%s",b,&c) ;

这里我们要注意的是输入的时候整型与数组的地址别搞错了,在输入整型的时候我们要加上&符号,但在传数组的时候,&数组和但数组名是同一个概念,都指向的是这个数组,所以我们选择ab

二、编程题

输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1 2 3 一直到最大的 3 位数

999

用返回一个整数列表来代替打印

n 为正整数

这是牛客网的一道题,链接是: 打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com)

这道题不难,这里我教一个很简单暴力的办法,就是直接10*它输入的次方,再for循环打印,事例如下:

#include<stdio.h>
int main()
{
    int i = 0;
    scanf_s("%d", &i);
    int k = 1;
    while (i--)
    {
        k *= 10;
    }
    for (i = 1; i<k; i++)
    {
        printf("%d ", i);
    }
    system("pause");
    return 0;
}

2 、根据输入的日期,计算是这一年的第几天。输入保证年份为 4 位数且日期合法。

输入描述:输入一行,每行空格分割,分别是年,月,日。

输出描述:输出是这一年的第几天

这题老朋友了,先判断这是否为闰年,其次将每个月的天数加上去,代码如下:

#include<stdio.h>
int main()
{
    int day, month, year,i,time=0;
    int arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    while (~scanf_s("%d %d %d", &year, &month, &day))
    {
        if (month > 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
        {
            for (i = 0; i < month - 1; i++)
            {
                time = arr[i] + time;
            }
            printf("%d", time + 1 + day);
        }
        else
        {
            for (i = 0; i < month - 1; i++)
            {
                time = arr[i] + time;
            }
            printf("%d", time + day);
        }
    }
    return 0;
}

day 2 

1 、以下程序段的输出结果是( )

#include<stdio.h>

int main ()

{

char s [] = "\\123456\123456\t" ;

printf ( "%d\n" , strlen ( s ));

return 0 ;

}

A: 12 B: 13 C: 16 D: 以上都不对

这里我们要注意的是转义符号,\\ = \,\123 = {,\t = tap,所以我们仔细数的话是只有12个,选a

2 、若有以下程序,则运行后的输出结果是( )

#include <stdio.h>

#define N 2

#define M N + 1

#define NUM (M + 1) * M / 2

int main ()

{

printf ( "%d\n" , NUM );

return 0 ;

}

A: 4 B: 8 C: 9 D: 6

这里就是很简单的计算题,没什么难度,经过计算,我们得出答案:8,选b

3 、如下函数的 f(1) 的值为( )

int f ( int n )

{

static int i = 1 ;

if ( n >= 5 )

return n ;

n = n + i ;

i ++ ;

return f ( n );

}

A: 5 B: 6 C: 7 D: 8

这道题是一道递归题,看上去可能稍有难度,但只有我们画出图形即可轻易解决,答案选c

4 、下面 3 段程序代码的效果一样吗( )

int b ;

( 1 ) const int * a = & b ;

( 2 ) int const * a = & b ;

( 3 ) int * const a = & b ;

A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样

这里主要考验的const的修饰成分,const在*左边的时候,则指针指向的值不能被修改,在*右边时,则指针的指向不能被修改,这是左定值,右定向,abconst都在*左边,所以选b

5、对于下面的说法,正确的是( )

A: 对于 struct X{short s ; int i ; char c ; } sizeof(X) 等于 sizeof(s) + sizeof(i) + sizeof(c)

B: 对于某个 double 变量 a ,可以使用 a == 0.0 来判断其是否为零

C: 初始化方式 char a[14] = "Hello, world!" ; char a[14] ; a = "Hello, world!" ; 的效果相同

D: 以上说法都不对

a选项,我们之前专栏就写过结构体存在的数组对齐概念,b选项,我们在判断浮点数的时候不能直接进行 == 判断,应该考虑的是差值,c选项数组名是首元素地址,既然是地址则不可轻易赋值,估abc都错,选d

二、编程题

1 、验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数 m

m≤100 ,将 m 的立方写成 m 个连续奇数之和的形式输出。

注意:本题含有多组输入数据。

输入描述:输入一个 int 整数

输出描述:输出分解后的 string

示例:

输入: 6

输出: 31+33+35+37+39+41

牛客网链接: 尼科彻斯定理_牛客题霸_牛客网 (nowcoder.com)

这里,我们仔细观察右边相加的首元素,是不是:1*1-1+(1+2)的规律,假设是n,则是:n*n-(n-1) +(n+2 ),所以我们可以写出如下代码:

#include <stdio.h>

int main()
{
    int m;
    while(scanf("%d", &m) != EOF)

{
        int k = m * m - (m - 1);
        for(int i = 0; i < m-1 ; i++)
        {
            printf("%d+", k);
            k += 2;
        }
     printf("%d\n", k);
    }
    return 0;
}

为什么我们不将最后的k也放在循环里面,是因为放进去的话就会多打印+号,这一点要注意

2 、等差数列 2 5 8 11 14 ... 。(从 2 开始的 3 为公差的等差数列),求等差数列前 n 项和。

注意:本题有多组输入

输入描述:输入一个正整数 n

输出描述:输出一个相加后的整数。

这里我拿代码讲快一点;

#include<stdio.h>
int fun(int n)
{
    return 3*n -1;
}
 
int main()
{
    int n;
     
    while(EOF != scanf("%d",&n))
    {
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            sum += fun(i);
        }
        printf("%d\n",sum);
    }
     
    return 0;
}

可以看到我这里是用了递归来做,因为我看到示例如下:

示例1

输入:2 输出:7 说明:2+5=7

输入2的时候答案为7,我们可不可以将这个等差拿一个表达式表达,再将结果加起来呢?

1*3-1=2

2*3-1=5

3*3-1=8

发现了规律,我们就以此写代码,也是一道很简单的题。

明天更2-3

举报

相关推荐

js 基础(day1-2)

假期day9(2024/2/14)

假期总结

CSS复习总结(1)

CSSF复习总结(2)

day 2 课程总结

爬虫day1总结

0 条评论