选择填空的知识点
变量名的基本命名规则:
(1)标识符只能由英文字母、数字和下划线组成。
(2)标识符必须以字母或下划线开头。
(3)不允许使用C语言关键字为标识符命名。
(4)标识符可以包含任意多个字符,但一般会有最大长度限制,与编译器有关,不过大多数情况下不会达到此限制。
例如:int int 可
double int 可
char For 可
float US$ 有特殊字符,不可
字符:
单个字符可以用单引号和双引号引起来,但多个字符只能用双引号引起来,不可用单引号引起来。定义二维数组时,行标可不写,列标一定要写。
指针:
int (*p)[10]:指向含有10个整数的数组的指针 ,int *p[10]:整型指针的数组
原码、反码及补码
原码、反码及补码的产生
根据冯~诺依曼提出的经典计算机体系结构框架。一台计算机由运算器,控制器,存储器,输入和输出设备组成。其中运算器,只有加法运算器,没有减法运算器。原码、反码及补码的产生过程,就是为了解决计算机做减法和引入符号位(正负)的问题。
原码:
原码是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
例如:
反码
正数的反码还是等于原码
负数的反码就是他的原码除符号位外,按位取反。
例如:
补码
正数的补码等于他的原码
负数的补码等于反码+1
编程题
- 已知如下字符串,找出其规律,然后正确输出。(输入数组N,输出字符串AN,已知N<=26,输出以一个换行符结束。输出中不得含有多余的空格或换行、回车符。)
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
样例输入
3
样例输出
ABACABA
#include <stdio.h>
#include <string.h>
void print(int x) //递归函数(利用递归递去归来的特性,打印对称字符)
{
if(x==1)
{
printf("A");
return;
}
else
{
printf("%c",'A'+x-1);
print(x-1);
}
}
int main()
{
int n;
scanf("%d",&n);
print(n); //函数的调用
return 0;
}
感悟:递归函数很重要,但总是很少想起要使用它,主要原因还是不熟练,所以很少用,但递归很重要,必须要掌握。
- 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。不同的取法输出顺序可以不考虑。
例如:
输入:
abc
则输出:
abc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str1[31],str2[31],t; //字符串不长于30,则长度为31合适
int len,i,j,k,p=0;
gets(str1);
len=strlen(str1); //计算字符串长度,确定循环结束条件
for(i=0; i<len; i++) //冒泡排序,将字符串中的字符进行由小到大排序
for(j=0; j<len-i-1; j++)
{
if(str1[j]>str1[j+1])
{
t=str1[j];
str1[j]=str1[j+1];
str1[j+1]=t;
}
}
for(i=0; i<len; i++)
{
if(str1[i]!=str1[i+1]) //当字符串中前一个字符不等于后一个字符,将字符储存进另一字符串中保存
{
str2[p]=str1[i];
p++;
}
}
str2[p]='\0'; //给字符串添加结束标志
len=strlen(str2); //计算出挑选出来的无重复且由小到大排序字符串的长度
for(i=0; i<len-2; i++) //嵌套三层循环,可以确定出三位不同的字符串
{
for(j=i+1; j<len-1; j++)
{
for(k=j+1; k<len; k++)
{
printf("%c%c%c\n",str2[i],str2[j],str2[k]);
}
}
}
return 0;
}
感悟:冒泡排序在平时刷题中经常要用到,所以一定要将冒泡排序掌握扎实,也要习惯于将一个字符串中的字符储存到另一个字符串之中,还有多层嵌套循环,也是经常用到的。一般地三位数就要用三层循环,二维数组用双层循环等。
- 将数组用冒泡法升序排序并用二分法查找排序后的数组中指定元素的位置。
要求:第一行输入数组元素个数,第二行输入数组元素,第三行输入指定查找元素,输出排序之后的数组与查找元素的位置例如:
输入:
5
5 3 8 4 2
8
输出:
2 3 4 5 8
5
#include <stdio.h>
void Sort(int a[],int n);
int Search(int a[],int n,int x);
void main()
{
int i,n,x,add,a[50];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
Sort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
putchar('\n');
add = Search(a,n,x);
if(add!=-1)
printf("%d\n",add);
else printf("Not found!\n");
}
void Sort(int a[],int n) //冒泡排序,将数组中的元素进行排序
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int Search(int a[],int n,int x) //用二分法查找数组中的元素
{
int low = 0,high = n-1,mid;
mid = (high - low)/2;
while(low<=high)
{
mid = (high + low)/2;
if(a[mid]<x)
{
low = mid+1;
}
else if(a[mid]>x)
{
high = mid-1;
}
else return (mid+1);
}
return -1;
}
感悟:又是冒泡排序,可见冒泡排序很重要,要学会用函数将程序进行模块化的编程,这样可以使代码执行效率更高,更具可读性。二分法用的很少,尽管老师在上课的时候有演示过一次,但自己真正实操起来还是有一定的困难。
总结
对于这一次的考试,我很惭愧,以为自己学得很好啦,老师布置的课堂课后作业我也能及时完成,但这一次的考试让我觉得自己真的很差劲。面对选择填空题时,只能说自己的基础知识掌握得一点也不扎实,很多东西模棱两可。说完全不懂吧,我又能道出其中一二,但总是不够全面。对于编程大题,我总是想不全面,有思路,但在用C语言表达自己的算法思想时,就会磕磕绊绊,无法快速准确地拿出答案。我想,这应该就是因为我平时的练习太少了,思维还不够活跃,对于经典题目和方法的掌握还不到位。还有待提升。