2.while(*b)
3.输入多做测试数据
(1)输入不带空格字符或单个数字用while((scanf。。)!=EOF)
(2)输入字符串用while(gets()!=NULL)
在ASCII码表中,第一个字符便是NULL,它的十六机制数值表示是00。即字符'\0'。
在字符串函数中,通常在末尾插入NULL(即'\0')表示字符串的已经结束。
读字符串时,一般也以'\0'来做为标志,判断是否读完。
4。多个字符串可用二维数组来存储。
5,汉字的机内码是负的,可通过c<0来判断是否为汉字
6.代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
’单步调试和设断点调试‘是程序员必须掌握的技能之一。
7.while((ch=getchar())!='\n')处理字符串时用到
while(scanf。。。!=EOF)中的参数可以是两个
8.二维数组可存放数字或字符;存放数字时未赋值的为0;存放字符时未赋值的为'\0'.一维数组不赋值系统默认随机值,全赋值为0可写作a[5]={0};
9.什么是集合的减法运算?? 答:A-B 就是A集合中的元素除去AB的交集后的元素集合
10.scanf函数只有在第一个参数为NULL(空指针)的情况下,才可能返回EOF,否则,返回成功格式化并赋值的参数个数(>=0)。
即while(scanf("%d",&n)==1)在成功读入1个数据时执行循环体,scanf("%d%d",&a,&b)如果a和b都成功读入,那么scanf返回为2,如果屏幕输入,,两个逗号,那么
scanf返回为0
这样while(scanf("%d%d",&a,&b)==2)就是判断是否都正确读入数据,如果成功,scanf("%d%d",&a,&b)==2整个表达式就是1,在c程序里,1就是真,所以继续循环下去。当不能正确读入数据时候,整个表达式就是0,跳出循环
11.只有在判断素数时才循环到sqrt(n),求所有约数时要判断到n/2。
12.吸收字符可用getchar()或直接scanf("%d ",&n),在%d后加个空格
13.作用于数组名时sizeof(a)计算的是给数组开辟的空间,strlen(a)是计算字符串的长度
作用于其他一样。
#include<stdio.h>
#include<string.h>
int main()
{char a[100],b[]={"38ajf"};
int s[100];
gets(a);
printf("%d %d %d %d %d",sizeof(a),strlen(a),sizeof(b),strlen(b),sizeof(s));
return 0;
}\\附上一段代码即知。
输入“hasjfj”
输出 100 6 6 5 400
sizeof连同"\0",strlen不连。strlen只能计算字符串长度。
14.printf("%.0lf",a)可消除小数点后数字,输出不带小数点的
15.现在的编译器/cpu都是32位的(或64, 正在过度中), int就是4字节
16.位的int在TC等老编译器上或16位嵌入式才有, 这个的范围才是 0~65535 以及 -32768~32767
17.整型 [signed]int -2147483648~+2147483648
无符号整型unsigned[int] 0~4294967295
短整型 short [int] -32768~32768
无符号短整型unsigned short[int] 0~65535
长整型 Long int -2147483648~+2147483648
无符号长整型unsigned [int] 0~4294967295
字符型[signed] char -128~+127
无符号字符型 unsigned char 0~255
单精度 float 3.4 x 10^(-38)~ 3.4 x 10^(+38)
双精度double 1.7 x 10^(-308)~ 1.7 x 10^(+308)
长双精度 long double 1.7 x 10^(-308)~ 1.7 x 10^(+308)
几位就是2的几次方,如有符号字符型除去符号为7位(2^7),无符号为8位(2^8)
17.
变量定义 输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0
long long “%lld” 错误 错误 正确 正确 无法编译
long long “%I64d" 正确 正确 错误 错误 无法编译
__int64 “lld” 错误 错误 无法编译 无法编译 错误
__int64 “%I64d” 正确 正确 无法编译 无法编译 正确
long long cout 非C++ 正确 非C++ 正确 无法编译
__int64 cout 非C++ 正确 非C++ 无法编译 无法编译
long long printint64() 正确 正确 正确 正确 无法编译
18.对于两个浮点数比较只能通过相减并与预先设定的精度比较,记得要取绝对值!
19.吸收转行,可用getcher(),也可用scanf("\n")
20.不能用太多for循环,容易超时,尤其是处理字符串时。
求两个数最大公约数和最小公倍数;碾转相除法:(欧几里得算法)最小公倍数等于这2个数的乘积除以最大公约数
求n个数的最大公约数和最小公倍数方法。先求最大公约数,即先求两个数的最大公约数,然后用最大公约数与下一个数求最大公约数,以此类推.最小公倍数是先求前两个的最小公倍数,然后以此最小公倍数
和下一个数求最大约数,然后此最小公倍数和下一个数相乘再除以最大公约数得到一个新的最小公倍数,以此类推。****用函数嵌套调用非常简单!!
求最大公约数代码:
int GCD(int a,int b)//最大公约数
{
if(b==0)
return a;
else
{
GCD(b,a/b);
}
}
也可以比较a,b的大小之后再递归(比起上面的代码 优点是减少了递归次数):
int GCD(int a,int b)//最大公约数
{
if(b==0)
return a;
else
{
int temp = a;
a =b;
b = temp%b;
GCD(a,b);
}
}
论引用的重要性:
Status DestroyTriplet(Triplet &T) //引用很重要
{ // 操作结果:三元组T被销毁
free(T);
T=NULL;
return OK;
}
比如此段程序,当主函数调用此函数时,如果没有引用那么主函数就不会摧毁T占的空间,其他也一样。想要用调用函数的方法改变某个值,必须用引用。
定义大数组时,要定义在主函数外面,不然容易暴栈,造成程序意外终止。因为主函数是定义在栈里的,主函数外是在堆里。栈的最大容量是编译器决定的,堆一般根据内存决定,一般很大。
memset函数对数组赋值,memset(数组名,赋值数,前几个字节),其中最后一个参数最好写成sizeof(数组type)*数组元素个数,或者写成sizeof(数组名)。
现有一个整型数组a[5],若要是用memset函数给每个元素赋初值1怎么做呢?是memset(a,1,5*sizeof(int))吗? 其实这样是不对的,memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。所以用memset对非字符型数组赋初值是不可取的!当然,可以用memset(a,0,sizeof(a)) 或者memset(a,0, 10 * sizeof(int))来清零。也可用memset(a,-1, 10 * sizeof(int))对数组赋-1;但是其他整型数不可赋值
所以说memset适合对字符数组赋值,不适合对整型数组赋值
c语言即使把数组开到主函数外,最大也不能超过10的9次方。
一个计算数值的方法:(每个数组元素是一位数,把他们合起来组成一个数) int a = 0; //比如c[0] =1,c[1] =2,则此方法的功能是使a=12
for (int i=0; i<count; i++)
{
a = a*10 + c[i];
}