目录
九、在C语言中,以下哪个选项描述了变长数组(Variable Length Array,VLA)的特点?
以下的题目为本人在学习过程中遇到的有疑问的题目,现来总结
一、下面哪个不是关键字:( )
A.int
B.struct
C.define
D.continue
答案为C
总结:
C语言关键字:C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字;
define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容;
int、struct和continue都是C语言中包含的关键字
二、下面代码的结果是:( )
#include <stdio.h> int main() { int a, b, c; a = 5; c = ++a; b = ++c, c++, ++a, a++; b += a++ + c; printf("a = %d b = %d c = %d\n:", a, b, c); return 0; }
A.a = 8 b = 23 c = 8
B.a = 9 b= 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8
答案为B
总结:
逗号运算符:逗号运算符就是一个逗号;
逗号表达式:用逗号将两个表达式连接起来构成的一个更长的表达式,格式如下:
逗号表达式求解过程:先求解表达式1,再求解表达式2,然后继续求解后面的表达式,整个表达式的值是最后一个表达式的值
三、写代码将三个整数数按从大到小输出
例如:
输入:2 3 1
输出:3 2 1
答案:
#include<stdio.h>
int main()
{
int a, b, c, temp;
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{
temp = a;
a = b;
b = temp;
}
if(a < c)
{
temp = a;
a = c;
c = temp;
}
if (b < c)
{
temp = b;
b = c;
c = temp;
}
printf("%d %d %d \n", a, b, c);
return 0;
}
总结:
数学逻辑为:把一个数与其他两个数进行比较,得到最大值;剩下两个数分别比较,得出第二大的值,最后按序输出即可
四、在屏幕上输出9*9乘法口诀表
答案:
#include<stdio.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d = %-2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
总结:
① 打印图案类的题目没有捷径,唯一的解决方法就是找出行和列的规律;
② 规律为每一列打印的次数和行的次数一样:
③ 利用" printf "函数的【限定最小位数(默认右对齐)】输出技巧使乘法表对齐(scanf函数返回值介绍:【2 数据类型和变量】、七、(一)、4)
五、写一个代码:打印100~200之间的素数
答案:
#include<stdio.h>
int main()
{
printf("100~200之间的素数为:\n");
for (int i = 100; i <= 200; i++)
{
int flag = 1; //假设是素数,去经历考验
for (int j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0; //不是素数
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
总结:
① 数学逻辑——试除法: 已知素数是只能被1和自己整除的数,那么就拿2和(自己-1)的数来试着相除,试除过程中余数为0的数则不是素数;
②《素数求解的n种境界》,这本书有多种求素数方法
六、输出用“*”组成的X形图案
描述:
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
答案:
#include <stdio.h>
int main() {
int a;
while (scanf("%d", &a) != EOF) {
for(int i = 0; i < a;i++)
{
for(int j = 0; j < a; j++)
{
if(i == j || i+j == a-1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
总结:
规律:绿线为 " i == j " 的时候打印,蓝线为"i + j == a-1" 的时候打印
七、数组的矩阵转置输出
描述:
KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
输出描述:
输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。
答案:
#include <stdio.h>
int main() {
int n,m;
scanf("%d%d", &n, &m);
int arr[n][m];
for(int i = 0; i < n; i++) //输入变成数组的元素
{
for(int j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for(int i = 0; i < m; i++) //打印
{
for(int j = 0; j < n; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n"); //打印完一行后换行
}
return 0;
}
总结:
矩阵转置为行列互换打印
八、数组合并输出
描述:
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围: 1≤𝑛,𝑚≤1000 1≤n,m≤1000 , 序列中的值满足 0≤𝑣𝑎𝑙≤30000 0≤val≤30000
输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
答案:
#include <stdio.h>
int main() {
int n, m, i, j;
int arr1[1000] = {0};
int arr2[1000] = {0};
//输入
scanf("%d %d", &n, &m);
for(i = 0;i < n;i++)
{
scanf("%d ",&arr1[i]);
}
for(j = 0;j < m;j++)
{
scanf("%d ",&arr2[j]);
}
//1.满足 i 和 j 有效的情况下的合并
i = 0;
j = 0;
while(i < n && j < m)
{
if(arr1[i] < arr2[j])
{
printf("%d ",arr1[i]);
i++;
}
else
{
printf("%d ",arr2[j]);
j++;
}
}
//2.检测剩下的输出
while(i < n)
{
printf("%d ",arr1[i]);
i++;
}
while(j < m)
{
printf("%d ",arr2[j]);
j++;
}
return 0;
}
总结:
① 因为题目限定了数组范围,所以不使用变长数组;
② 需要设置两个下标来进行比较,较小的就进行输出,下标移向下一位;
③ 双下标比完后可能还存在一个数组有剩余的,只需按顺序输出即可
九、在C语言中,以下哪个选项描述了变长数组(Variable Length Array,VLA)的特点?
A.变长数组的大小在编译时确定,不能改变。
B.变长数组的大小可能在运行时确定,比如使用变量来指定数组大小,一旦确定大小后,它的大小是固定的,无法改变。
C.一旦确定大小后,它的大小是固定的,无法改变
D.变长数组只能用于存储字符类型的数据。
答案:C
总结:
① 变长数组(variable-length array),C语言术语,也简称VLA。是指用【整型变量或表达式声明或定义的数组】,而不是说数组的长度会随时变化,变长数组在其生命周期内的长度同样是固定的 ;
② 编译时无法确定,编译时候编译器不知道n是什么值,n的值要等到程序运行起来后,用户输入之后n的值确定了,才能确定数组的大小
十、有意思的点
(一)牛客刷题感悟
scanf 函数的返回值可以做判断条件,可以判断是否输入成功
int a = 0;
while (scanf("%d", &a) != EOF)
{
循环体
}
(scanf函数返回值介绍:【2 数据类型和变量】、七、(二)、2)
(二)函数的特点
高内聚:一个高内聚的函数,应该只负责一个任务,这样他才能做到函数的可重复性;
低耦合:函数与函数之间尽可能的不关联,各自实现各自的代码;假设修改了另一个函数,不会影响其他的函数
(三) 函数只能return一个值,不能return一个数组
以上博客仅供分享