c语言讲座

First Post:

Last Update:

c语言程序设计题

一.分支与跳转

(if else switch continue break case default goto)

1.利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
int sc;
scanf("%d", &sc);
if (sc >= 90)
{
printf("A\n");
}
else if (sc >= 60 && sc <= 89)//注意这里不可以写成 60<=sc <=89
{
printf("B\n");
}
else
{
printf("C\n");
}
return 0;
}

二.循环

(while for do…while)

1.计算下列表达式:s=1!+2!+3!+4!+……+10!

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
int i;
int t=1, s=0;
for (i = 1; i <= 10; i++)
{
t *= i;
s += t;
}
printf("%d", s);
return 0;
}

2.九九乘法表(3种循环解决)

for循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main()
{
int i;
int j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}

while:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
int row = 1;
while (row <= 9)
{
int col = 1;
while (col <= row)
{
printf("%d * %d = %d\t", col, row, col * row);
col += 1;
}
printf("\n");
row += 1;
return 0;
}

do while:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main ()
{
int i=1,j;
do{
j=1;
do{
printf("%d*%d=%d ",i,j,i*j);
j++;
}while(j<=i);
i++;
printf("\n");
}while(i<=9);
}


三.数组

1.将一个一维数组{1,2,3,4,5,6,7,8,9,10}的成员逆序后输出

正确的结果为:10 9 8 7 6 5 4 3 2 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int t,i;
for(i=0;i<5;i++)
{
t=a[i];
a[i]=a[9-i];
a[9-i]=t;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);

printf("\n");

return 0;
}

2.打印杨辉三角前n行(二维数组)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
int arr[31][31] = { 0 };
void init(int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0 || j == i)
arr[i][j] = 1;
else
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
int main()
{
init(30);
int n, i, j;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
if (j != i)
printf("%d ", arr[i][j]);
else
printf("%d", arr[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}

1
1 2 1
1 3 3 1
1 4 6 4 1


四.经典题

1.输入两个正整数m和n,求其最大公约数。

(辗转相除法)

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
#include <stdio.h>
int main()
{
int a, b , temp;
scanf("%d%d" ,&a, &b);
if (a < b)
{
temp = a;
a = b;
b = temp;
}

while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
printf("最大公约数:%d\n ", a);
return 0;
}

//求最大公约数可以使用gcd函数
//自己实现:
int gcd(int a,int b)
{
return b > 0 ? gcd(b, a % b) : a;
}

2.水仙花数:

打印出所有得“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,例如,152是水仙花数,因为153=1×1×1+5×5×5+3×3×3。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main()
{
int i,j,k,n;
printf("水仙花数是:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
printf("%d ",n);
}
return 0;
}

3.求素数(2–100之间)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void FindPrime()
{
int i = 0; int j = 0;
for (i = 1; i <= 100; i++)//这里可以直接+=2,因为偶数不可能是素数
{
for ( j = 2; j <= i; j++)//还可以优化为sqrt(i)
{
if (i % j == 0)//如果余数为0,则不是素数,结束循环
break;
}
if(i==j)//如果j一直加到和i相等,证明i是素数
printf("%d ", i);
}
}
int main()
{
FindPrime();
return 0;
}

4.冒泡排序:(排序(冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,基数排序) - VisuAlgo

从键盘输入的10个整数按从小到大的顺序排序后输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>	
int main()
{
int n[10] = { 25,35,68,79,21,13,98,7,16,62 };//定义一个大小为10的数组
int i, j, temp;
for (i = 1; i <= 9; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j <= 9 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
printf("排序过后的数顺序:\n");
for (i = 0; i < 10; i++)
printf("%d ", n[i]);
printf("\n");
}


五.指针

1.使用指针方法,计算两个数组中各元素对应位置的和,和的结果存入第三个数组中,然后输出。

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
#include <stdio.h>
//
void count(int *p1,int *p2,int *p3,int x)
{
int i;
for(i=0;i<x;i++)
{
*(p3+i) = (*(p1+i))+ (*(p2+i));
}
printf("两个数组对应各元素和分别为:\n");
for(i=0;i<x;i++)
{
printf("%d ",p3[i]);
}
}

int main()
{
int arr01[4]={2,4,5,8};
int arr02[4]={1,0,4,6};
int arr03[4];
count(arr01,arr02,arr03,4);
}


2.输出值为:at

(二级)

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}

char* a[]为指针数组,是数组用来存放指针,该数组有三个元素,分别是三个字符串的地址。

pa = a;是将数组a的首元素的地址放入二级指针变量pa中。

pa++:即为a++,从数组首元素的地址变为第二个元素的地址。

*pa:此时pa为a[1],也就是第二个元素表示字符串的首地址,以%s的形式输出,依次打印字符串。

六.递归

1.用递归的方法求正整数N的阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>

long jiecheng(int n)
{
long p;
if(n==0||n==1)//0的阶乘为1
p=1;

else
p=n*jiecheng(n-1);
return p;
}

int main()
{
int n;
scanf("%d",&n);
printf("%d",jiecheng(n));
return 0;
}

至此,面向考试的题就都讲完了,最后祝大家都能在考试中取得自己满意的成绩!