文档库 最新最全的文档下载
当前位置:文档库 › C语言第一类

C语言第一类

C语言第一类
C语言第一类

第六周

1.编写一程序P717.C实现以下功能

输入10个整型数存入一维数组,输出值和下标都为奇数(数组第1个元素的下标为0)的元素及其个数,要求先输出个数。编程可用素材:printf("Input 10 integers: ")、printf("\ncount=…\n"…、printf("a[…]=…\n"…。

Input 10 integers: 2 45 34 56 78 12 41 55 86 37

count=3

a[1]=45

a[7]=55

a[9]=37

#include

int main (void)

{

int count, i, a[10];

printf("Input 10 integers: ");

for (i=0; i<10; i++)

{

scanf(" %d", &a[i]);

}

count = 0;

for (i=0; i<10; i++)

{

if (i%2==1 && a[i]%2==1)

{

count = count + 1;

}

}

printf("\ncount=%d\n", count);

for (i=0; i<10; i++)

{

if (i%2==1 && a[i]%2==1)

{

printf("a[%d]=%d\n", i, a[i]);

}

}

return 0;

}

2.编写一程序P725.C实现以下功能

利用数组,求斐波拉契数列的前n(约定3≤n≤20)项并输出到屏幕上(数和数之间用水平制表符'\t'隔开),斐波拉契公式为:f(1)=1, f(2)=1, f(n) = f(n-1) + f(n-2) (n≥3)。编程可用素材:printf("input a data(3--20): ")。

input a data(3--20): 11

1 1

2

3 5 8 13

21 34 55

89

#include

int main (void)

{

double ff[20] = {1, 1};

int i ,nn;

printf("input a data(3--20): ");

scanf("%d", &nn);

for (i=0; i < nn; i++)

{

if (i <= 1)

{

printf("%.0f", ff[i]);

}

else

{

ff[i] = ff[i - 1] + ff[i - 2];

printf("%.0f", ff[i]);

}

if (i < nn - 1)

{

printf("\t");

}

}

printf("\n");

return 0;

}

3.编写一程序P742.C实现以下功能

现有两个一维数组(各含5个整型元素)设为A、B,从键盘分别输入数据给这两个数组。计算A数组正序位置与B数组逆序对应位置积的和。编程可用素材:printf("Input A: ")、printf("Input B: ")、printf("\nsum=…\n"…。

Input A: 1 2 3 4 5Input B: 5 4 3 2 1sum=55

#include

int main (void)

{

int aa[5], bb[5], i, j, sum = 0;

printf("Input A: ");

for (i = 0; i < 5; i++)

{

scanf("%d ", &aa[i]);

}

printf("Input B: ");

for (j = 0; j < 5; j++)

{

scanf("%d ", &bb[j]);

}

for (i = 0, j = 4; i < 5, j >= 0; i++, j--)

{

sum = sum + aa[i] * bb[j];

}

printf("\nsum=%d\n", sum);

return 0;

}

4.编写一程序P718.C实现以下功能有一递推数列,满足f(0)=0,f(1)=1,f(2)=2, f(n+1)=2f(n)+f(n-1)f(n-2) (n>=2), 编写程序求f(n)的值(n由键盘输入,13>=n>=2)。编程可用素材:printf("Input n (13>=n>=2): ")、printf("\nf(…)=…\n"…。Input n (13>=n>=2): 10f(10)=1819456

#include

int main (void)

{

double ff[14] = {0, 1, 2};

int nn, i;

printf("Input n (13>=n>=2): ");

scanf ("%d", &nn);

for (i = 3; i <= nn; i++)

{

ff[i] = 2 * ff[i - 1] + ff[i - 2] * ff[i - 3];

}

printf("\nf(%d)=%.0f\n", nn, ff[nn]);

return 0;

}

5.编写一程序P831.C实现以下功能

某班有40位同学参加考试,成绩(整数)从键盘输入,求全班最高分、最低分以及平均分,并统计该班同学的考试及格率。编程可用素材:printf("请输入40位同学的成绩:")、printf("\n最高分:…最低分:…平均分:…及格率:…。

请输入40位同学的成绩:99 81 71 81 77 94 100 67 66 44 75 49 47 45 65 74 73 74 63

69 72 77 65 79 84 73 46 62 68 42 75 62 65 66 62 69 44 62 84 77

最高分:100

最低分:42

平均分:68.7

及格率:83%

#include

int main (void)

{

int a[40], max, min, i, count = 0;

double pjf, sum = 0, jgl;

printf("请输入40位同学的成绩:");

for (i=0; i<40; i++)

{

scanf("%d ", &a[i]);

}

max = a[0];

min = a[0];

for (i=0; i<40; i++)

{

if (a[i] > max)

{

max = a[i];

}

if (a[i] < min)

{

min = a[i];

}

if (a[i] >= 60)

{

count++;

}

sum = sum + a[i];

}

pjf = sum / 40.0;

jgl = count / 40.0 * 100;

printf("\n最高分:%d\n最低分:%d\n平均分:%.1f\n及格率:%.0f%%\n", max, min, pjf, jgl);

return 0;

}

6.编写一程序P239.C实现以下功能

先从键盘读入若干个整数(读到-1或读满16个数均结束读入),然后倒序输出这些数。编程可用素材:

printf("请输入若干个数: ")、printf("\n这些数倒序为: ")。

请输入若干个数: 1 2 3 4 5 6 7 8 9 20 11 12 -1 13

这些数倒序为: 12 11 20 9 8 7 6 5 4 3 2 1

#include

int main (void)

{

int aa[16], i, count = 0;

printf("请输入若干个数: ");

for (i = 0 ; i < 16; i++)

{

scanf("%d ", &aa[i]);

if (aa[i] == -1)

{

break;

}

count++;

}

printf("\n这些数倒序为: ");

for (i = count - 1; i >= 0; i--)

{

printf("%d ", aa[i]);

}

printf("\n");

return 0;

}

7.编写一程序P420.C实现以下功能

①程序运行时先显示Input:,再从键盘上读入一组数(小数部分最多1位),数与数之间只使用空格或回车作分隔。数可正可负,最多100个,但若读入的数为-567时,则表示输入结束且-567不算在该组数内。

②对这一组数按从大到小的顺序进行排序。

③将排序后的这一组数输出到屏幕上。

编程可用素材:printf("Input: ")、printf("\nResult: ")、printf("%.1f "…。

Input: 100.2 120.1 89 72.5 -19 200.3 500.7 210 235 6 24.3 -567

Result: 500.7 235.0 210.0 200.3 120.1 100.2 89.0 72.5 24.3 6.0 -19.0

#include

#define SIZE 100

int main (void)

{

float aa[SIZE], temp;

int i, j, count = 0;

printf("Input: ");

for (i=0; i

{

scanf("%f", &temp);

if (temp != -567)

{

aa[i] = temp;

count++;

}

else

{

break;

}

}

for (i=0; i

{

for (j=i+1; j

{

if (aa[i] < aa[j])

{

temp = aa[j];

aa[j] = aa[i];

aa[i] = temp;

}

}

}

printf("\nResult: ");

for (i=0; i

{

printf("%.1f ", aa[i]);

}

printf("\n");

return 0;

}

8.编写一程序P262.C实现以下功能

先从键盘读入整数m和n(约定(2<=m<=20、2<=n<=20)),再从键盘读入m行(每行n个,即一个m×n 矩阵)整数,然后从键盘读入一个列序号,按示例格式显示该列的内容。编程可用素材:printf("请输入m 和n: ")、printf("请输入%d 行, 每行%d 列整数:\n"…、printf("请输入要显示列的列号: ")、printf("\n该列的内容为: ")。

请输入m 和n: 5 6

请输入 5 行, 每行 6 列整数:

31 42 36 74 2358 88

1447 32 57 37 43 47

97 51 257 7 445 459

33 65 44 3 425 43

68 3425 82 789 123 2134

请输入要显示列的列号: 2

该列的内容为: 36 57 257 44 82

#include

int main (void)

{

int aa[20][20], nn, mm, i, j, bb;

printf("请输入 m 和 n: ");

scanf ("%d %d", &mm, &nn);

printf("请输入 %d 行, 每行 %d 列整数:\n", mm, nn);

for (i=0; i

{

for (j=0; j

{

scanf("%d", &aa[i][j]);

}

}

printf("请输入要显示列的列号: ");

scanf("%d", &bb);

printf("\n该列的内容为: ");

for (i=0; i

{

for (j=0; j

{

if (j == bb)

{

printf("%d ", aa[i][j]);

}

}

}

printf("\n");

return 0;

}

9.编写一程序P271.C实现以下功能

先从键盘读入整数m和n(约定(2<=m<=20、2<=n<=20)),再从键盘读入m行(每行n个,即一个m×n 矩阵)整数,然后从键盘读入一个列序号,按示例格式显示该列上各元素之和。编程可用素材:printf("请输入m 和n: ")、printf("请输入%d 行, 每行%d 列整数:\n"…、printf("请输入要计算和之列的列号: ")、printf("\n该列上各元素之和为: …。

请输入m 和n: 5 6

请输入 5 行, 每行 6 列整数:

31 42 36 74 2358 88

1447 32 57 37 43 47

97 51 257 7 445 459

33 65 44 3 425 43

68 3425 82 789 123 2134

请输入要计算和之列的列号: 2

#include

int main (void)

{

int aa[20][20], nn, mm, i, j, bb, sum = 0;

printf("请输入 m 和 n: ");

scanf ("%d %d", &mm, &nn);

printf("请输入 %d 行, 每行 %d 列整数:\n", mm, nn);

for (i=0; i

{

for (j=0; j

{

scanf("%d", &aa[i][j]);

}

}

printf("请输入要显示列的列号: ");

scanf("%d", &bb);

for (i=0; i

{

for (j=0; j

{

if (j == bb)

{

sum = sum + aa[i][j];

}

}

}

printf("\n该列上各元素之和为: %d\n", sum);

return 0;

}

10.编写一程序P732.C实现以下功能

输入3行3列的矩阵,输出所有元素的累加和。编程可用素材:printf("Please input the 3x3 Matrix:\n")、printf("\nsum=…\n"…。

Please input the 3x3 Matrix:

9 20 13

16 51 79

32 8 6sum=234

#include

int main (void)

{

int aa[3][3], i, j, sum = 0;

printf("Please input the 3x3 Matrix:\n");

for (i = 0; i < 3 ; i++)

{

for (j = 0; j < 3 ; j++)

{

scanf("%d", &aa[i][j]);

sum = sum + aa[i][j];

}

}

printf("\nsum=%d\n", sum);

return 0;

}

第七周

1.编写一程序P137.C实现以下功能

通过键盘输入两个姓名(约定均为汉字且最多4个汉字),判断并输出二者是否同姓。编程可用素材:printf("请输入姓名1: ")、printf("请输入姓名2: ")、printf("\n“…”与“…”同姓。\n"…、printf("\n “…”与“…”不同姓。\n"…。

请输入姓名1: 张李秀吉

请输入姓名2: 张三“张李秀吉”与“张三”同姓

#include

int main (void)

{

char aa[9], bb[9];

printf("请输入姓名1: ");

gets(aa);

printf("请输入姓名2: ");

gets(bb);

if (aa[0] == bb[0])

{

printf("\n“%s”与“%s”同姓。\n", aa, bb);

}

else

{

printf("\n“%s”与“%s”不同姓。\n", aa, bb);

}

return 0;

}

2.编写一程序P216.C实现以下功能

求任意的一个m×m矩阵的最大数及其所在的行列数,m(2<=m<=20)及矩阵元素从键盘输入(只考虑int 型)。编程可用素材:printf("Please input m: ")、printf("\nPlease input array:\n")、printf("\nmax=…,i=…,j=…\n"…。

Please input m: 5

Please input array:

1 45 67 235 464

35 6 89 32342 8

347 9346 47 95 746

46 785 436 19434 634

3235 567 24 8465 25max=32342,i=1,j=3

#include

int main (void)

{

int aa[20][20], i, j, mm, bb, nn, max;

printf("Please input m: ");

scanf("%d", &mm);

printf("\nPlease input array:\n");

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

scanf("%d", &aa[i][j]);

}

}

max = aa[0][0];

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

if (aa[i][j] > max)

{

max = aa[i][j];

nn = i;

bb = j;

}

}

}

printf("\nmax=%d,i=%d,j=%d\n", max, nn, bb);

return 0;

}

3.编写一程序P217.C实现以下功能

求任意的一个m×m矩阵的对角线上元素之和,m(2<=m<=20)及矩阵元素从键盘输入(只考虑int型,且不需考虑求和的结果可能超出int型能表示的范围)。编程可用素材:printf("Please input m: ")、printf("Please input array:\n")、printf("\nsum=…\n"…。Please input m: 5

Please input array:

1 45 67 235 464

35 6 89 32342 8

347 9346 47 95 746

46 785 436 19434 634

3235 567 24 8465 25sum=56339

#include

int main (void)

{

int aa[20][20], i, j, mm, sum = 0;

printf("Please input m: ");

scanf("%d", &mm);

printf("\nPlease input array:\n");

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

scanf("%d", &aa[i][j]);

}

}

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

if (i == j || i + j == mm - 1)

{

sum = sum + aa[i][j];

}

}

}

printf("\nsum=%d\n", sum);

return 0;

}

4.编写一程序P218.C实现以下功能

求任意的一个m×m矩阵的周边元素之和,m(2<=m<=20)及矩阵元素从键盘输入(只考虑int型,且不需考虑求和的结果可能超出int型能表示的范围)。编程可用素材:printf("Please input m: ")、printf("Please input array:\n")、printf("\nsum=…\n"…。Please input m: 5

Please input array:

1 45 67 235 464

35 6 89 32342 8

347 9346 47 95 746

46 785 436 19434 634

3235 567 24 8465 25sum=14944

#include

int main (void)

{

int aa[20][20], i, j, mm, sum = 0;

printf("Please input m: ");

scanf("%d", &mm);

printf("\nPlease input array:\n");

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

scanf("%d", &aa[i][j]);

}

}

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

if (i == 0 || j == 0 || j == mm - 1 || i == mm - 1)

{

sum = sum + aa[i][j];

}

}

}

printf("\nsum=%d\n", sum);

return 0;

}

5.编写一程序P748.C实现以下功能

从键盘上输入矩阵的阶数n(n<=14), 矩阵中元素的值等于其位置的行数和列数之和的n倍(行列的值从0开始计数),如n=3时,矩阵为

0 3 6

3 6 9

6 9 12

先输出该矩阵(显示时每个数宽度为4、右对齐),然后计算输出sum1和sum2的值:sum1为矩阵中所有不靠边元素之和、sum2为矩阵的一条对角线元素之和。编程可用素材:printf("Enter n: ")、printf("\nsum1=…\nsum2=…\n"…。

Enter n: 3

0 3 6

3 6 9

6 9 12sum1=6sum2=18

#include

int main (void)

{

int aa[14][14], i, j, nn, sum1 = 0, sum2 = 0;

printf("Enter n: ");

scanf("%d", &nn);

for (i = 0 ; i < nn; i++)

{

for (j = 0 ; j < nn; j++)

{

aa[i][j] = nn * (i + j);

printf("%4d", aa[i][j]);

}

printf("\n");

}

for (i = 0 ; i < nn; i++)

{

for (j = 0 ; j < nn; j++)

{

if (i != 0 && j != 0 && j != nn - 1 && i != nn - 1)

{

sum1 = sum1 + aa[i][j];

}

if (i == j)

{

sum2 = sum2 + aa[i][j];

}

}

}

printf("\nsum1=%d\nsum2=%d\n", sum1, sum2);

return 0;

}

6.编写一程序P743.C实现以下功能

从键盘输入一行可带空格的字符串(约定:字符数≤127字节),按逆序输出该字符串。注意,程序中不能使用库函数strrev或使用同名的变量、函数、单词。编程可用素材:printf("Input a string: ")、printf("\nThe result is: ")。

Input a string: abc xyzThe result is: zyx cba

#include

#include

int main (void)

{

char aa[128], bb[128];

int len, i, j;

printf("Input a string: ");

gets(aa);

len = strlen(aa);

bb[len] = '\0';

for (i =0, j = len - 1; i < len; i++, j--)

{

bb[j] = aa[i];

}

printf("\nThe result is: ");

puts(bb);

return 0;

}

7.编写一程序P750.C实现以下功能

输入字符串s(约定:字符数≤100字节),将字符串s中所有字符‘*’删除,并将修改后的字符串显示出来。编程可用素材:printf("Please input a string: ")、printf("\nThe result is: ")。Please input a string: *dgjk* %&* *df78dg 88**

The result is: dgjk %& df78dg 88

#include

int main (void)

{

char aa[101];

int i, j;

printf("Please input a string: ");

gets(aa);

printf("\nThe result is: ");

for (i = 0, j = 0; aa[i] != '\0'; i++)

{

if (aa[i] != '*')

{

aa[j] = aa[i];

j++;

}

}

aa[j] = '\0';

puts(aa);

return 0;

}

8.编写一程序P234.C实现以下功能

求任意的一个m×m矩阵的第0行和最后一行所有数之和,m(2<=m<=20)及矩阵元素从键盘输入(只考虑int型)。编程可用素材:printf("Please input m: ")、printf("\nPlease input array:\n")、printf("\nSum = …\n"…。

Please input m: 5

Please input array:

1 45 67 235 464

35 6 89 32342 8

347 9346 47 95 746

46 785 436 19434 634

3235 567 24 8465 32225Sum = 45328

#include

int main (void)

{

int aa[20][20], i, j, mm, sum = 0;

printf("Please input m: ");

scanf("%d", &mm);

printf("\nPlease input array:\n");

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

scanf("%d", &aa[i][j]);

}

}

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

if (i == 0 || i == mm - 1)

{

sum = sum + aa[i][j];

}

}

}

printf("\nSum = %d\n", sum);

return 0;

}

9.编写一程序P235.C实现以下功能

求任意的一个m×m矩阵的第0列和最后一列所有数之和,m(2<=m<=20)及矩阵元素从键盘输入(只考虑int型)。编程可用素材:printf("Please input m: ")、printf("\nPlease input array:\n")、printf("\nSum = …\n"…。

Please input m: 5

Please input array:

1 45 67 235 464

35 6 89 32342 8

347 9346 47 95 746

46 785 436 19434 634

3235 567 24 8465 32225Sum = 37741

#include

int main (void)

{

int aa[20][20], i, j, mm, sum = 0;

printf("Please input m: ");

scanf("%d", &mm);

printf("\nPlease input array:\n");

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

scanf("%d", &aa[i][j]);

}

}

for (i = 0; i < mm; i++)

{

for (j = 0; j < mm; j++)

{

if (j == 0 || j == mm - 1)

{

sum = sum + aa[i][j];

}

}

}

printf("\nSum = %d\n", sum);

return 0;

}

计算机C语言趣味的程序设计——题目百例

Contest - 2011级C语言课程大作业 Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00 Current Time: 2012-2-23 15:51:18 Status:Running Public

写在最前: 本文档中的题目;在不不同的编译器中可能会有提示错误,呵呵,小小的动动手改下变量的定义就可以运行了……………….. 由于能力不足..有题目未解决的…或者有错误的我会…认真听取大家的..意见的…. 呵呵……..有一两个….偷了下懒哦……… 提供原题目还有本人自己的解答的源代码。感谢大家的。。。。建议……………. 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。

样例输入 10 8 15 样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++;

C语言常用函数

C语言的常用库函数 函数1。absread()读磁盘绝对扇区函数 原形:int absread(int drive,int num,int sectnum,void *buf) 功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num 个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。 参数:drive=0对应A盘,drive=1对应B盘。 返回值:0:成功;-1:失败。 头文件:dos.h 函数2。abswrite()写磁盘绝对扇区函数 原形:int abswrite(int drive,int nsects,int lsect,void *buffer) drive=0(A驱动器)、1(B驱动器)、 nsects=要写的扇区数(最多64K个); lsect=起始逻辑扇区号; buffer=要写入数据的内存起始地址。 功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目录结构所在的扇区,也照常进行。 返回值:0:成功;-1:失败。 头文件:dos.h 函数3。atof()将字符串转换成浮点数的函数 原形:double atof(const char *s) 功能:把s所指向的字符串转换成double类型。 s格式为:符号数字.数字E符号数字 返回值:字符串的转换值。 头文件:math.h、stdlib.h 函数4。atoi()将字符串转换成整型数的函数 原形:int atoi(const char *s) 功能:把s所指向的字符串转换成int类型。 s格式为:符号数字 返回值:字符串的转换值。若出错则返回0。 头文件:stdlib.h 函数5。atol()将字符串转换成长整型数的函数 原形:long atol(const char *s)

c语言趣味编程实例

1、编程序求5X+2Y+Z=50 的所有非负整数解。 #include int main() { int x, y, z; int count = 0; for (x = 0; 5 * x <= 50;x++) for (y = 0; 2 * y <= 50; y++) for (z = 0; z <= 50; z++) { if (5 * x + 2 * y + z == 50) { count++; printf("%d :", count); printf("x=%d,y=%d,z=%d", x, y, z); printf("\n"); } } return 0; } 2、把25个字母A、B、C、···、X、Y按如下要求打印出来:从最中间的字母M 开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。 要求:初始化时按字母表顺序赋值。 #include int main() { char x[] = "ABCDEFGHIJKLMNPQRST"; int k; int n = 0; while (x[n]) { n++; if (x[n] == 'M') { k = n;break; } } printf("%c,",x[k]); for (int i = 1; i <= 12; i++) if (i <= 11) printf("%c,%c,", (x[k] - i), (x[k] + i)); else printf("%c,%c。", (x[k] - i), (x[k] + i)); printf("\n");

C语言中常见的功能函数

C语言中常见的功能函数(应掌握的编程) 1、两个变量值的交换 void exchang(float *x,float *y) /*形参为两个变量的地铁(指针)*/ {float z; z=*x; *x=*y; *y=z; } void main() {float a,b; scanf(“%f%f”,&a,&b); exchang(&a,&b); /*因为形参是指针,所以实参必须给变量的地址,不能给变量名*/ printf(“a=%f,b=%f”,a,b); } 2、判断一个整数的奇偶 int jou(int n) /*如果是奇数返回1,否则返回0*/ { if(n%2==0) return 0; return 1; } 3、小写字符转换成大写字符 根据实参传给形参的字母,判断是否是小写字母,如果是小写字母,则转换成大写字母,否则不进行转换,函数返回转换后或原来的字符。 本函数仿照toupper()库函数的功能编写(toupper(c) 是将变量c字母转换成大写字母,如果不是小写字母不转换)。 char toupper1(char ch) {if(ch>=?a?&&ch<=?z?) ch-=32; /*小写字母比对应的大写字母ASCII码值大32*/ return ch; } 4、判断一个字符是否是字母(或数字) 根据实参传给形参的字符,判断是否是字母(或数字),如果是字母(或数字)返回1,否则返回0。此函数是根据库函数isalpha()(或isdigit())来编写的。 int isalpha1(char ch) /*判断是否是字母*/ {if(ch>=?A?&&ch<=?Z?||ch>=?a?&&ch<=?z?) return 1; else return 0; } int isdigit1(char ch) /*判断是否是数字字符*/ {if(ch>=?0?&&ch<=?9?) return 1; else return 0; } 5、根据学生成绩,返回其等级 char fun(float cj) {char c; switch((int)cj/10) {case 10:

C语言经典编程

猴子吃桃 1、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day--; } printf("the total is %d\n",x1); } 回文数问题 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法) 2.程序源代码: main( ) { long a,b,c,d,e,x; scanf("%ld",&x); a=x/10000;/*分解出万位*/ b=x%10000/1000;/*分解出千位*/ c=x%1000/100;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a); else if (b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b); else if (c!=0) printf(" there are 3,%ld %ld %ld\n",e,d,c); else if (d!=0) printf("there are 2, %ld %ld\n",e,d); else if (e!=0) printf(" there are 1,%ld\n",e); } 杨辉三角 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1

C语言常用IO函数

一些比较常用的io函数,总结了一下,一块贴出来了 stdin标准输入流 stdout标准输出流 stderr标准错误流 字符IO函数 1.int getchar() 说明:从stdin读取1个字符 返回值:成功,返回该字符;出错,返回EOF; 2.int fgetc(FILE fp) 说明:功能同getchar,默认从文件fp读取; 返回值:成功,返回该字符;出错,返回EOF; 可以重定向 3.int getc(FILE fp) 说明:功能与fgetc相同,但getc既可以被用作 函数实现,也可以被用作宏实现,并且它的编码效率 可能会更高. 可以重定向 4.int putchar(int ch) 说明:向stdout输出字符ch; 返回值:成功,返回该字符;出错,返回EOF; 5.int fputc(int c,FILE fp) 说明:功能同putchar,默认向fp输出字符ch; 返回值:成功,返回该字符;出错,返回EOF; 6.int putc(int c,FILE fp) 说明:功能与fputc相同,但putc与getc一样既可能被用作 函数实现,也可能被用作宏实现,并且它的编码效率可能会更高;可以重定向 字符串IO函数 1.char gets(char str) 说明:从stdin读取字符串(不包括'n')写入到字符串str中; 返回值:成功,返回str首地址;错误,返回NULL; 2.char fgets(char str,int N,FILE fp) 说明:默认从文件fp中读取N个字符(包括'n')写入到字符串str中,

如果实际输入字符串小于N,fgets自动添加'n', 返回值:成功,返回字符串首地址;错误或遇到EOF,返回NULL;可以重定向 3.int puts(const char str) 说明:向stdout输出字符串str,然受输出一个'n', 返回值:成功,返回非负值;错误,EOF; 4.int fputs(const char str,FILE fp) 说明:功能同puts,默认向文件fp写入字符串str; 返回值:成功,返回非负值;错误,EOF; 可以重定向 格式化IO函数 1.int scanf(const char format,...) 说明:根据format从stdin格式化读取N个值,并输入到... 返回值:成功,返回读取的项数;出错,返回EOF 2.int fscanf(FILE fp,const char format,...) 说明:功能同scanf,默认从文件fp读取, 返回值:成功,返回读取的项数;出错或遇到文件尾,返回EOF 可以重定向 3.int sscanf(const char buf,const char format,...) 说明:根据format从buf格式化读取N个值,并输入到... 返回值:成功,返回读取的项数;出错,返回EOF 4.int printf(const char format,...) 说明:根据format格式化数据,并输出到stdout 返回值成功,返回输出字符数;错误,返回负数; 5.int fprintf(FILE fp,const char format,...) 说明:功能同printf,默认向文件fp写入; 可以重定向 6.int sprintf(char buf,const char format,...) 说明:根据format格式化数据,并输出到buf, 返回值:成功,返回输出字符数;错误,返回负数

CC语言趣味程序设计编程百例精解

C-C++语言趣味程序设计编程百例精解() ?81.角谷猜想 日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。 *问题分析与算法设计 本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。 *程序说明与注释 #include<stdio.h> int main() { int n,count=0; printf("Please enter number:"); scanf("%d",&n); /*输入任一整数*/ do{ if(n%2)

n=n*3+1; /*若为奇数,n乘3加1*/ printf("[%d]:%d*3+1=%d\n",++count,(n-1)/3,n); } else { n/=2; /*若为偶数n除以2*/ printf("[%d]: %d/2=%d\n",++count,2*n,n); } }while(n!=1); /*n不等于1则继续以上过程*/ } 82.四方定理 数论中著名的“四方定理”讲的是:所有自然数至多只要用四个数的平方和就可以表示。 请编程证此定理。 *问题分析与算法设计 本题是一个定理,我们不去证明它而是编程序验证。 对四个变量采用试探的方法进行计算,满足要求时输出计算结果。 *程序说明与注释 #include<stdio.h> #include<stdlib.h> int main()

C语言常用函数手册

1.分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F) 返回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n') 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') 2.数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度

趣味c语言编程100例

趣味 c 语言编程100 例 【程序 1】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、 2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) / *以下为三重循环 */ for( j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /* 确保 i 、 j、 k 三位互不相同 */ printf("%d,%d,%d\n",i,j,k); } } 程序 2】 题目:企业发放的奖金根据利润提成。利润 (I) 低于或等于 10 万元时,奖金可提 10% ;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可可提成 7.5% ; 20 万到 40 万之间时,高于 20 万元的部分,可提成 5% ; 40 万到 60 万之间时高于

40 万元的部分,可提成 3% ;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5% ,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总 数? 1. 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2. 程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03;

C语言常见基本词汇及词汇解释

C语言常用基本词汇及其他提示语运算符与表达式: 1.constant 常量 2. variable 变量 3. identify 标识符 4. keywords 关键字 5. sign 符号 6. operator 运算符 7. statement语句 8. syntax 语法 9. expression 表达式 10. initialition初始化 11. number format 数据格式 12 declaration 说明 13. type conversion 类型转换 14.define 、definition 定义 条件语句: 1.select 选择 2. expression 表达式 3. logical expression 逻辑表达式 4. Relational expression 关系表达式 5.priority优先

6. operation运算 7.structure 结构 循环语句: 1.circle 循环 2. condition 条件 3. variant 变量 4. process过程 5.priority优先 6. operation运算 数组: 1. array 数组 2. reference 引用 3. element 元素 4. address 地址 5. sort 排序 6. character 字符 7. string 字符串 8. application 应用函数: 1.call 调用 2.return value 返回值 3.function 函数

4. declare 声明 5. `parameter 参数 6.static 静态的 7.extern 外部的 指针: 1. pointer 指针 2. argument 参数 3. array 数组 4. declaration 声明 5. represent 表示 6. manipulate 处理 结构体、共用体、链表: 1 structure 结构 2 member成员 3 tag 标记 4 function 函数 5 enumerate 枚举 6 union 联合(共用体) 7 create 创建 8 insert 插入 9 delete 删除 10 modify 修改

复试C语言常考趣味程序设计

狼追兔子 1 巧夺偶数 2 五猴分桃 3 高次方数 4 借书方案 5 过桥问题 6 数制转换7 打渔晒网8 喝酒问题9 哥德巴赫猜想10 打印日历11 抓交通肇事逃逸犯12 反序数13 新郎新娘14 称重砝码15 求车速16 谁是窃贼17 出售金鱼18 百钱百鸡19 谜语博士20 猜牌术(-)21 舍罕王的失算22 怎样存钱利最大23 猜牌术(二)24 爱因斯坦的数学题25 取火柴游戏26 平分鱼和筐27 可逆素数28 三色球问题29 抢n游戏30 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。 样例输入 10 8 15

样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++; } else printf("%d",i); } printf("\n"); } return 0; } 问题B: 趣味程序设计_巧夺偶数 时间限制: 1 Sec 内存限制: 128 MB

C语言常用函数名及用法

字符函数和字符串函数 头文件:字符串函数头文件:#include 字符函数头文件:#include putchar:输出一个 putchar(a):输出字符变量a的值,(其中a可为字符变量,整形变量,字符常量,整形常量) getchar:输入一个字符 a=getchar(); putchar(a);结果为b printf(格式控制符,输出列表); scanf(格式控制符,地址列表); 输入形式与格式控制部分对应 1.当为两个连续输入时:scanf(“%d%d”,&a,&b); 输入量数据之间可为:一个或多个空格,也可以用enter,tab无逗号时输入时不能用逗号作分隔。 2.格式控制中两%d有两个空格,输入时两数据间应有两个空格或两个以上。 3.当为“:”时输入时应对应一样,当为:scanf(“a=%d,b=%d”,&a,&b);输入a=12,b=22。 4.当格式控制符为%c时,输入时空格与转义字符都作为有效字符记录在里面:scanf(“%c%c%c”,&a,&b,&c); 输入时:ab c↙空间不能插空格或其他符

5. Scanf(“%d%c%f”,&a,&b,&c); 输入时1234a123h26↙在输入遇到时空格回车 tab或其他非法输入就会认定输入完毕 Gets (字符数组):读入字符串函数 Gets(str)从键盘键入a b↙括号里为字符数组str的起始地址,Puts(字符数组):输出字符串函数 Strcat(字符数组1,字符数组2):字符串连接函数(2连接在1后面) Strcpy和strncpy:字符串复制函数 Strcpy(字符数组1,字符数组2):将2复制到1 数组1 要为数组名,字符串2可以为数组名或者字符串 Strncpy(str1,str2,2):将str2的前两个字符复制到str1,取代str1的前两个字符 Strcmp:字符串比较函数 Strcmp(str1,str2):相等则为0(对字符串自左向右逐个字母进行比较) Strlen(字符数组):测字符串的实际长度 Strlwr(字符串)将字符串转换为大写 Strupr(字符串)将字符串转换为小写

C语言常用的库函数

库函数并不是C语言的一部分,它是由编译系统根据一般用户的需要编制并 提供给用户使用的一组程序。每一种C编译系统都提供了一批库函数,不同的 编译系统所提供的库函数的数目和函数名以及函数功能是不完全相同的。ANSI C标准提出了一批建议提供的标准库函数。它包括了目前多数C编译系统所提供 的库函数,但也有一些是某些C编译系统未曾实现的。考虑到通用性,本附录 列出ANSI C建议的常用库函数。 由于C库函数的种类和数目很多,例如还有屏幕和图形函数、时间日期函数、 与系统有关的函数等,每一类函数又包括各种功能的函数,限于篇幅,本附录不 能全部介绍,只从教学需要的角度列出最基本的。读者在编写C程序时可根据 需要,查阅有关系统的函数使用手册。 1.数学函数 使用数学函数时,应该在源文件中使用预编译命令: #include或#include "math.h" 函数名函数原型功能返回值 acos double acos(double x);计算arccos x的值,其中-1<=x<=1计算结果 asin double asin(double x);计算arcsin x的值,其中-1<=x<=1计算结果 atan double atan(double x);计算arctan x的值计算结果 atan2double atan2(double x, double y);计算arctan x/y的值计算结果 cos double cos(double x);计算cos x的值,其中x的单位为弧度计算结果 cosh double cosh(double x);计算x的双曲余弦cosh x的值计算结果 exp double exp(double x);求e x的值计算结果

c语言中常用的函数和头文件

头文件ctype.h 函数列表<> 函数类别函数用途详细说明 字符测试是否字母和数字isalnum 是否字母isalpha 是否控制字符iscntrl 是否数字isdigit 是否可显示字符(除空格外)isgraph 是否可显示字符(包括空格)isprint 是否既不是空格,又不是字母和数字的可显示字符ispunct 是否空格isspace 是否大写字母isupper 是否16进制数字(0-9,A-F)字符isxdigit 字符大小写转换函数转换为大写字母toupper 转换为小写字母tolower 地区化 本类别的函数用于处理不同国家的语言差异。 头文件local.h 函数列表 函数类别函数用途详细说明 地区控制地区设置setlocale 数字格式约定查询国家的货币、日期、时间等的格式转换localeconv 数学函数 本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) 头文件math.h 函数列表 函数类别函数用途详细说明 错误条件处理定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内) 三角函数反余弦acos 反正弦asin 反正切atan 反正切2 atan2 余弦cos

正弦sin 正切tan 双曲函数双曲余弦cosh 双曲正弦sinh 双曲正切tanh 指数和对数指数函数exp 指数分解函数frexp 乘积指数函数fdexp 自然对数log 以10为底的对数log10 浮点数分解函数modf 幂函数幂函数pow 平方根函数sqrt 整数截断,绝对值和求余数函数求下限接近整数ceil 绝对值fabs 求上限接近整数floor 求余数fmod 本分类函数用于实现在不同底函数之间直接跳转代码。头文件setjmp.h io.h 函数列表 函数类别函数用途详细说明 保存调用环境setjmp 恢复调用环境longjmp 信号处理 该分类函数用于处理那些在程序执行过程中发生例外的情况。 头文件signal.h 函数列表 函数类别函数用途详细说明 指定信号处理函数signal 发送信号raise 可变参数处理 本类函数用于实现诸如printf,scanf等参数数量可变底函数。 头文件stdarg.h 函数列表

C语言趣味程序设计编程100例精解

C/C++语言经典、实用、趣味程序设计编程百例精解(1) 1.绘制余弦曲线 在屏幕上用―*‖显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个―*‖。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y) 的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释 #include #include int m ain() { double y; int x,m; for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/ { m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for(x=1;x

C语言中游戏编程常用的函数实例解说

VGA文本16/256K40*25360*4009*16B8000彩色 CGA文本16/1680*25640*2008*8B8000彩色 2/3EGA文本16/6480*25640*3508*14B8000彩色 VGA(3+)文本16/256K80*25720*4009*16B8000彩色 CGA图形4/1640*25320*2008*8B8000彩色 4/5EGA图形4/6440*25320*2008*8B8000彩色 VGA图形4/256K40*25320*2008*8B8000彩色 CGA图形2/1640*25640*2008*8B8000单色 6EGA图形2/6440*25640*2008*8B8000单色 VGA图形2/256K40*25640*2008*8B8000单色 7MDA/EGA文本单色80*25720*3509*14B0000单色 VGA(7+)文本单色80*25720*4009*16B0000单色 D EGA图形16/6440*25320*2008*8A0000彩色 VGA图形16/256K40*25320*2008*8A0000彩色 E EGA图形16/6480*25640*2008*8A0000彩色 VGA图形16/256K80*25640*2008*8A0000彩色 F EGA/VGA图形单色80*25640*3508*14A0000单色 10EGA图形16/6480*25640*3508*14A0000彩色 VGA图形16/256K80*25640*3508*14A0000彩色 11VGA图形2/256K80*30640*4808*16A0000彩色 12VGA图形16/256K80*30640*4808*16A0000彩色 13VGA图形256/256K40*25320*2008*8A000彩色 常规内存函数 申请函数: malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()函数名:malloc 功能:内存分配函数 用法:void*malloc(unsigned size); 函数名:farmalloc 功能:从远堆中分配存储块 用法:void far*farmalloc(unsigned long size); 函数名:calloc 功能:分配主存储器 用法:void*calloc(size_t nelem,size_t elsize); 函数名:farcalloc 功能:从远堆栈中申请空间

有趣的C语言笔试题

有趣的C语言笔试题 1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf(" The buffer entered is[%s] ",buff); return 0; } 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 2.strcpy()函数 问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗? #include int main(int argc,char*argv[]) { int flag=0; char passwd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd,argv[1]); if(0==strcmp("LinuxGeek",passwd)) { flag=1; }

if(flag) { printf(" Password cracked "); } else { printf(" Incorrect passwd "); } return 0; } 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如: $./psswd aaaaaaaaaaaaa Password cracked 虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。 要避免这样的问题,建议使用strncpy()函数。 作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。 3.main()的返回类型 问:下面的代码能编译通过吗?如果能,它有什么潜在的问题吗? #include void main(void) { char*ptr=(char*)malloc(10); if(NULL==ptr) {

C语言中最常用标准库函数 - candyliuxj - CSDN博客

C语言中最常用标准库函数- candyliuxj - CSDN博客 C语言中最常用标准库函数收藏 标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits.h> <locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <stdlib.h> <stdio.h> <string.h> <time.h> 一、标准定义(<stddef.h>) 文件<stddef.h>里包含了标准库的一些常用定义,无论我们包含哪个标准头文件,<stddef.h>都会被自动包含进来。 这个文件里定义: l 类型size_t (sizeof运算符的结果类型,是某个无符号整型); l 类型ptrdiff_t(两个指针相减运算的结果类型,是某个有符号整型);

l 类型wchar_t (宽字符类型,是一个整型,其中足以存放本系统所支持的所有本地环境中的 字符集的所有编码值。这里还保证空字符的编码值为0); l 符号常量NULL (空指针值); l 宏offsetor (这是一个带参数的宏,第一个参数应是一个结构类型,第二个参数应是结构 成员名。offsetor(s,m)求出成员m在结构类型t的变量里的偏移量)。 注:其中有些定义也出现在其他头文件里(如NULL)。 二、错误信息(<errno.h>) <errno.h>定义了一个int类型的表达式errno,可以看作一个变量,其初始值为0,一些标准库函数执行中出错时将它设为非0值,但任何标准库函数都设置它为0。 <errno.h>里还定义了两个宏EDOM和ERANGE,都是非0的整数值。数学函数执行中遇到参数错误,就会将errno 置为EDOM,如出现值域错误就会将errno置为ERANGE。 三、输入输出函数(<stdio.h>) 文件打开和关闭: FILE *fopen(const char *filename, const char *mode); int fclose(FILE * stream);

相关文档
相关文档 最新文档