若只求完成作业而不求甚解,则对学习无益,纯属浪费时间
1 . 用%s输出字符串 要使str[i] = '\0';
2 . switch 语句基本框架:
for (i = 0 ; str[i] != '\0' ; i++)
{
switch(str[i])
{
case '0': //只有char定义的才要加 ‘ ’ ;
arr[0]++;
break;
case '1':
arr[1]++;
break;
case '9':
arr[9]++;
break;
default:
break;
}
}
switch (n)
{
/****Found****/
case 0: //整型不需要加 ‘ ’ ;
printf("Zero\n");
break;
default:
printf("Non-Zero");
break;
}
3 . 排序法举例
for (k = 0 ; k < i - 1 ; k++) 冒泡法(主要):
{ for (k = 0 ; k < i - 1 ; k++)
for (j = k + 1 ; j < i ; j++) {
{ for (j =0 ; j < i - k - 1 ; j++)
if (str[k] > str[j]) {
{ if (str[j] > str[j+1])
temp[k] = str[k]; {
str[k] = str[j]; temp[k] = str[j];
str[j] = temp[k]; str[j] = str[j+1];
} str[j+1] = temp[k];
} }
} }
}
4 . 同姓要比较数组的前两个元素
5 . 字母位置互换
for (i = 0 ; i < count ; i++)
{
if (str[i] >= 'a' && str[i] <= 'z')
{
str[i] ='z' + 'a' - str[i];
}
if (str[i] >= 'A' && str[i] <= 'Z')
{
str[i] ='Z' + 'A' - str[i];
}
}
6 . 当遇到-222时结束读入
for (i = 0 ; i < 10000 ; i++)
{
scanf("%d", &aa);
if (aa == -222)
{
break;
}
else
{
arr[k] = aa;
k++;
}
}
7 . 仅读入2到13之间的数字
do
{
scanf("%d", &n);
} while (n < 2 || n > 13);
8 . 不用库函数读入一行字符。例:用while
ch = getchar();
while (ch != '\n') // 输入时考虑ch != '\n'; 对数组的值进行判断时则为str[i] != '\0';
{
str[i] = ch;
i++;
ch = getchar();
}
9 . char ch;//char型常量在内存中存放的是ASCII码;
b = ch - 'A';//ch 就表示的是ASCII码,而A加了 ’ ’ 才能表示ASCII码;
printf("%d", 95 - 10 * (ch - 'A'));//ch从始至终都不需要加单引号 ‘ ’ ;
10 . 如果要输入和输出多个字符串
用getS(str);puts(str);
如果仅输入输出单行字符串,优先用gets和puts,若题目限制,则借鉴第8条;
11 . strlen(str1);//计算字符串长度;
strcmp(str1 , str2) > 或 = 或 < 0;//比较最大字符串;
if (strcmp(str1 , str2) > 0)
{
strcpy(str1 , str2);//把str1中的所有字符全都替换成str2中的所有字符;
}
12 . 以回车表示行结束且回车不计入输入内容。若读入过程中发生错误或遇到文件结束,则也表示行输入结束
若用户输入时输入了很多字符,则仅读入前100个字符
for (i = 0 ; i < 100 ; i++)
{
ch = getchar();
if (ch == '\n' || ch == EOF)
{
break;
}
else
{
str[i] = ch;
}
}
13 . 从键盘读入10个数存放在一个数组中,要求用户由小到大输入。如果发现读入的某个数不是由小到大,则该数输入无效,继续读入后面的输入数据。再将这10个数依次输出到屏幕上,要求每个数的输出宽度为5、不足5位的在其左边补上空格、数与数之间使用逗号(,)分隔。然后输入一个数,要求找出该数是数组中第几个(序号从1开始计算)元素的值,如果该数不在数组中,则输出“Not Find!”。
#include <stdio.h>
#define N 10
int main(void)
{
int arr[N] , j , i , count;
printf("please input 10 numbers: ");
for (i = 0; i < N ; i++)
{
scanf("%d", &arr[i]);
if (i >= 1)
{
while (arr[i] < arr[i - 1])
{
scanf("%d", &arr[i]);
}
}
}//由小到大输入;
for (i = 0 ; i < N - 1 ; i++)
{
printf("%5d,", arr[i]);
}
printf("%5d\n", arr[N - 1]);//一般最后一个数不输出 ‘,’ || 则需单独输出数组的最后一个数;
}
14 . 从数组中要找出最大或最小值,需要将记录行和列的变量赋予初始值0
因为如果是第[0][0]元素为最值,则找不出比它更大或更小的元素,此时若没有将记录行和列的变量初始化,就会出现-85899389的情况;
void gaibian(int *max , int *maxRow , int *maxCol , int array[][9])
{
int i , j;
*maxRow = 0;
*maxCol = 0;
*max = array[0][0];
for (i = 1 ; i < 5 ; i++)
{
for (j = 0 ; j < 9 ; j++)
{
if (array[i][j] > *max)
{
*max = array[i][j];
*maxCol = j;
*maxRow = i;
}
}
}
}
15 . 使用指针时,主函数main中用&,参数函数中用*;
16 . 找数组中各行的最大值即在两个for中间,即在第二个for前将max的值变为每行的第一个元素;
17 . 素数
a1 = m;
for (i = 0 ; count < n ; i++) | for (i = min; count < num; i++)
{ | {
for (j = 2 ; j < a1 ; j++) | for (j = 2; j <= i / 2; j++)
{ | {
if (a1 % j == 0) if (j == i / 2)
{ {
break; prime[count++] = i; }
}
} else if (i % j == 0)
{
if (j == a1) break;
{ }
printf("%d ", m); }
count++; }
}
a1 = ++m;
}
18 . 从小到大输入
for (i = 1 ; i <= 10 ; i) for (i = 0; i < N ; i++)
{ {
scanf("%d", &temp); scanf("%d", &arr[i]);
if (temp <= array[i-1]) if (i >= 1)
{ {
continue; while (arr[i] < arr[i - 1])
} {
else scanf("%d", &arr[i]);
{ }
array[i] = temp; }
i++; }
}
}
19 . 要输出%只需前面再加一个%
其它则为前面加一个\
20 . %o输出八进制 %x输出16进制;
21 . / 是要前面的,%是要后面的;
153 / 100 = 1
153 % 100 / 10 = 5
153 % 10 = 3
22 . 函数return只能返回一个值,若想要返回两个值,则需用一个指针和一个return
或者用两个指针.
23 . 根据函数引用时前后有无等号可判断定义时用void 或 int 等其它类型.
24 . 指针题型,在主函数main中,()中用 & ;
在参数函数中 ()及 计算均用 *;
25 . 不需要传值就可以计算阶乘的函数(要用到static);
for (i=1; i<=n; i++)
{
Sum += 1 / fac();
}
double fac(void)
{
double sum1;
static double sum = 1;
static int n = 0;
n++;
sum *= n;
sum1 = sum;
return sum1;
}
26 . static 作用:定义的变量的值会保留为最后一次改变后的值
即每一次引用 (例25) ,n 的值会从0到1 , 2 一直增加,不会因为再一次引用就又将其初始化为0;
27 . 一维数组元素地址和元素: 一维数组函数定义指针:
下标法: void scanfArr(int Data[], int n);
元素:a[0], a[1], a[2], a[i]; void scanfArr(int *Data, int n);
地址:&a[0], &a[1], &a[2], &a[i]; (Data + i)表示为一维数组中第 i 个元素的地址;
指针法: *(Data + i)表示为一维数组中第 i 个元素的值;
地址:a, a+1, a+2, a+i;
元素:*a, *(a+1), *(a+2), *(a+i);
使用指针变量p: p = a;
地址:p, p+1, p+2, p+i
元素:*p, *(p+1), *(p+2), *(p+i);
元素:p[0], p[1], p[2], p[i];
28 . 指针与二维数组:
a 代表二维数组的首地址,第0行的地址;
a+i 代表第 i 行的地址;
*(a+i) 即 a[i] &a[i][0] 代表第 i 行,第 0 列的地址;
*(a+i)+j 即 a[i] + j 或 &a[i][j] 代表第 i 行,第 j 列的地址;
*(*(a+i) + j) 即 a[i][j] 代表第 i 行第 j 例的元素;
29 . 二维数组取一次指针还是地址,取两次指针才为元素;
*m++ 根据优先级要写成 (*m)++;
30 . 定义并输出字符 char *yy = "ok??\n";
for (; *yy; yy++)
{
putchar(*yy); //putchar 每次只能输出一个字符,所以要用for循环;
printf("%s", yy) 输出整个字符串;
}
31 . 定义16进制数前面加0x int i = 0x100;
long int 用 %ld 表示
32 . x++ * 1 / 6”其实可分解为“x * 1 / 6; x++”,
即表达式“x++ * 1 / 6”的值来自于“x * 1 / 6”(不是x最后的值),结果为2,“x++”是最后执行。//自增自减的优先级最低。
33 . 从键盘输入数据时,对整型变量不只能输入整型数据,对于实型变量也不只能输入实型数据//可以随意,机器会改
34 . 用C语言等高级语言编写的程序称为源程序
35 . 一个C语言源程序经过“编译程序”翻译后生成一个二进制代码文件,它的扩展名为 .obj
36 . 通过“连接程序”软件,把C语言目标程序与C语言提供的各种库函数连接起来生成一个文件,它的扩展名为.exe
37 . C语言程序总是从main()函数开始执行;
38 . 一个函数的组成有函数首部和函数体;
39 . C语言自身没有输入输出语句;
40 . 编辑程序的功能是建立并修改程序;
41 . 字符串"ABC"在内存占用的字节数是4 (最后有'\0');
42 . C语言中的所有关键字必须小写;
43 . typedef union enum 属于C语言关键字 // integer 不属于C语言关键字;
44 . 用C语言编写的代码程序是一个源程序 , 不需要经过编译解释也能执行;
45 . 条件表达式可以是任意的表达式
46 . 正确的赋值语句是 ch = '\xff' ch 是单个字符
47 . continue 是重新开始进行循环;
48 . 对于实型数组,不可以直接用数组名对数组进行整体的输入或输出;
49 . 能正确定义一维数组的是 char a4[] = {1, 2, 3, 4, 5, 6};
char *s; s = "Beijing";
50 . 在C语言中,程序进行编译的单位是 文件
51 . 在C语言中,若定义函数时对函数类型未加显式说明,则函数的隐含类型为 int
52 . 函数不可以嵌套定义,但可以嵌套调用;
53 . 在函数调用中,若funA调用了函数funB,函数funB又调用了函数funA,则称为函数的间接递归调用;
54 . 在一个函数内的复合语句中定义的变量只在本复合语句范围内有效;
55 . 在C语言中,关于文件的存取方式正确的叙述是可以顺序存取,也可以随机存取;
56 . 读写操作时会进行自动转换的文件是文本文件;
57 . 以下要作为fopen函数中第一个参数的正确格式是"c:\\user\\text.txt"
58 . 若执行fopen函数时发生错误,则函数的返回值是0(NULL);
59 . 当顺利执行了文件关闭操作时,fclose函数的返回值是0;
60 . 在C语言中,标准库函数fread(buf, size, count, fp)中参数buf的含义是 一个指针,指向要读入数据的存放地址;
size:要读写的字节数;count:要读写多少个数据项(每个数据项的长度为size)。
61 . 在C语言中,标准库函数fwrite(buf, size, count, fp)的功能是把buf起始的内存中长度为size的count个数据项输出到fp所指向的文件中
62 . "rb+":为了读和写,打开一个二进制文件,若指定文件不存在则出错;"wb+":为了读和写,打开一个新的二进制文件,若指定文件不存在,则建立新文件。
63 . C语言中文件的数据块输入输出函数对是fread/fwrite
64 . feof(fp)函数用来判断文件是否结束,如果未遇到文件结束,函数值为0;
65 . 若调用fputc函数输出字符成功,则其返回值是输出的字符;
66 . fseek函数的功能是改变文件位置的指针位置(即下一次读写操作从文件的什么位置开始);
67 . 即使两个指针变量的类型相同,它们也不能相加;
68 . 在C程序说明语句int (*pointer)[5]; 中,pointer表示的是一个指向包含5个整型元素的一维数组的指针;
69 . 在C程序说明语句int *pointer[5]; 中,pointer表示的是一个指针数组的名字,包含5个指向整型数据的指针;
70 . 在C程序说明语句int (*pointer)();中,pointer表示的是一个指向函数的指针,函数返回值为一个整数;
71 . 在C程序说明语句int *pointer();中,pointer表示的是一个返回值为指针(指向的对象为int)的函数名字;
72 . 当一个函数中有多个return语句时,第一个被执行的return语句起作用;
73 . fputc函数的功能是向一个已将打开方式指定为写或读写的文件中写入一个字符。
74 . double fac(void)
{
static int n = 0;
static double p1 = 1;
n++;
p1 *= n;
return p1;
}
75 . 1个short int所占的内存空间为2字节,能表示的数的范围为-32768~32767
76 . 1个 int 所占的内存空间为4字节,能表示的数据范围为-2147483648 ~ 2147483647
77 . 1个long int所占的内存空间为4字节,能表示的数的范围为-2147483648~2147483647
78 . 1个float所占的内存空间为4字节,能表示数的范围为3.4×10^38~3.4×10^38,有效数字(精度)为6~7位
79 . 1个unsigned long int所占的内存空间为4字节,能表示的数的范围为0~4294967295
80 . 1个unsigned short int所占的内存空间为2字节,能表示的数的范围为0~65535;
81 . c = c + a + b;”的计算过程为:先计算“c + a”,得到中间结果tmp1,再将tmp1与b相加,得到tmp2,最后将tmp2的值赋给c。由于c为double,则编译器会先将a自动转换为double,中间结果tmp1也为double,因此tmp1中存储的中间结果是正确的;tmp1再和b相加则类似于“c + a”,tmp2也为double,最终结果正确。
82 . TC里int数据使用2字节存储,其表示数的范围为-32768~32767
83 . 在16位的编译器里(如TC),short int的宽度为1字节,在32位编译器(如VC6)里,short int的宽度为2字节,因而即使是在VC下,本题里的i的最大值也就32767,再继续i++,则变成-32768,-32767,...,-1,0,1,
84 . float a = 3.1f; 或 float a = 3.1F; 或 float a = (float)3.1;可以消除'const double ' to 'float '的警告;
85 . double a = 1/5; printf("%.3f\n", a); 结果为0.000 //若改为 double a = 1.0 / 5; 结果为0.200;
86 . 编译错误“error C2001: newline in constant”的意思是“在常量中出现了换行”,原因可能是:1 . 字符串常量、字符常量中可能有换行
2. 在这条语句中,某个字符串常量的尾部可能漏掉了双引号。或是在这条语句中,某个字符常量的尾部可能漏掉了单引号
3. 在这条语句中,某个字符串常量中可能出现了双引号字符“"”,但是没有使用转义符“\"”;
4. 可能在某句语句的尾部,或语句的中间误输入了一个单引号或双引号
87 . “error C2086: 'xxxx' : redefinition”的意思是“xxxx”重复申明,可使用开发工具里的查找(Find)功能查找“xxxx”,以快速定位故障所在
88 . 无论程序的大小和目的,编制并运行程序的整个过程是基本相同的,均包括编辑、编译、链接、运行“四步曲”。以下说法中正确的有
1. “编辑”要完成的工作就是输入或修改程序代码,可以使用Windows的“记事本”程序完成编辑工作;
2. 对源程序进行编译时,除了可以使用的Microsoft的Visual C提供的编译器,也可以使用TC(Turbo C)或者GCC(GNU Compiler Collection)提供的编译器;
3. 通过“链接”工具(程序),可以将C、VB、汇编等语言编写的程序经编译后生成的目标代码(通常是.obj文件)链接成一个可执行文件;
4. 同一源程序,使用不同的C开发工具(例如VC、TC、GCC)进行编译、链接,运行时结果可能不同;
89 . 不使用过于复杂的、容易产生歧义的表达式,例如x=b[i] + i++;就应改为以下两条语句:
x = b[i] + i;
i++;
90 . ^ 是双目操作符
91 . 数123456789是int型能存储的,但改用float存储,就不再是123456789了
92 . '\n' 的ASCII码是12;
93 . 输出字符'\'和字符'n' printf("%c%c", '\\', 'n');
94 . printf("abcd\0efgh\n")屏幕输出:abcd;
printf("abcd\06790fgh\n");屏幕输出:abcd790fgh;
printf("abcd\bcdefgh\n");屏幕输出:abccdefgh;
95 . printf("%8.3s\n", "abcdefghijkl"); 屏幕输出: abc
96 . enum属于C语言关键字
97 . +、-、*、/、%是双目算术运算符
98 . 一个大的C语言程序可以由多个函数组成,函数之间(包括main函数)是平等的,不存在隶属关系,没有主从之分
99 . printf()函数也是有返回值的,它有一个返回值,返回打印字符的个数,如果有输出错误,printf()返回一个负值。
100 . int *pa[10];声明了一个指针变量,该变量可以指向由10个整数所构成的整型数组。
int *pa[10];中由于[]比*优先级高,因此pa先与[10]结合,形成pa[10]形式,构成数组;
然后再与pa前面的*结合,表明数组元素是指针类型。;
101 . 将C语言源程序在Windows下经编译、链接后得到的.Exe可执行文件复制到Linux下,则肯定无法使用
102 . float型数据占用的空间为4字节,表面上看,4个字节精确存储123456789完全没有问题(例如int就可以)。但由于float型数据采用浮点存储格式,简单地讲就是指数形式,例如0.00000345表示为0.345×10-5,存储指数部分要占用一部分空间,因而用于存储有效数字的部分就没有4个字节,当然无法精确存储123456789,肯定会出现误差