C语言练习题
编程题
输入三个整数作为三角形的三条边,判断如果不能构成一个三角形,则输出“not a triangle”;否则如能构成一个直角三角形,则输出”yes”;否则输出”no”。
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, b, c;
while(scanf("%d %d %d",&a, &b,&c)!=EOF) //实现多组数据重复输入
if((a+b>c)&&(a+c>b)&&(b+c>a)) //判断是否构成三角形
{
//判断是否构成直角三角形
if((a*a + b*b == c*c)||(a*a + c*c == b*b)||(b*b + c*c == a*a))
printf("yes\n");
else printf("no\n");
}
else printf("not a triangle\n");
return 0;
}请编程实现从键盘输入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
25
26
27#include <stdio.h>
int main()
{
int a[10];
int i = 0;
int j = 0;
int k = 0;
int b[10];
int sum;
while(i < 10)
{
scanf("%d", &a[i]); //将10个数依次传递到数组a里
if(a[i] > 0)
{
b[j] = a[i]; //将数组a中符合条件的元素传递到数组b里
j ++;
}
i ++;
}
for(k = 0; k < j; k++)
sum += b[k]; //求和
printf("%d\n", sum);
return 0;
}复习:C 数组
请编程实现输出自然数1到1000中含有数字2的数的个数。
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#include <stdio.h>
int main()
{
int i = 0; /*1=<i<=1000*/
int j = 0; /*控制输出个数为10时换行*/
int count = 0; /*计数符合要求的数的个数*/
int one, two, three; /*one(百位) two(十位) three(个位)*/
for (i=1; i<=1000; i++)
{
one = i/100; //提取百位数
two = i%100/10; //提取十位数
three = i%10; //提取个位数
if (2==one || 2==two || 2==three)
{
j ++;
count ++;
printf("%3d ", i); //%3d表示把结果进行排版
}
if (10==j) //每执行10次就再将结果换行输出
{
j = 0;
printf("\n");
}
}
printf("总数为:%d\n", count);
return 0;
}请编程实现输出1到100以内能被3或5整除,但不能同时被3和5整除的数及其个数。
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 i = 0;
int count = 0;
int j = 0; //将结果换行输出
for (i = 1;i <= 100;i ++) //从1开始输入数字直到100
{
if ((i%3 == 0)||(i%5 == 0)) //判断能否被3或5整除
{
if (i%15 != 0) //判断能否被3和5同时整除
{
printf("%3d ", i);
count ++;
j ++;
}
if (6==j) //每行6个结果
{
j = 0;
printf("\n");
}
}
}
printf("\n个数%d\n", count); //输出个数
return 0;
}请编程实现求解sum=1+2+3+…..+n<s的最大的sum值,其中s的值由键盘输入。
1
2
3
4
5
6
7
8
9
10
11
12
13#include <stdio.h>
int main( )
{
int i = 1;
int s = 0;
int sum = 0;
scanf ("%d", &s); //键盘输入s
for (i = 1;i < s;i ++) //for循环求sum的值
sum += i; //求和
printf("%d\n", sum);
return 0;
}请编程实现求解s=1/(1x2)+1/(2x3)+1/(3x4)+……+1/(10x11),输出结果保留两位小数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <stdio.h>
int main( )
{
float i = 0.000000;
float n = 0.000000;
float sum = 0.000000;
for (i = 1;i <= 10;++ i)
{
n = 1/(i*(i+1));
sum += n;
}
printf("%.2f", sum); //结果保留两位小数
return 0;
}请编程实现如下问题的求解。猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。
1
2
3
4
5
6
7
8
9
10
11#include <stdio.h>
int main( )
{
int x = 1; //第十天剩下一个桃子
int i = 0; //天数
for (i= 0; i < 9; ++i) //逆向思维
x = (x+1)*2;
printf("桃子总数:%d", x);
return 0;
}有一分数序列,2/1, 3/2, 5/3, 8/5, 13/8, 21/13,……,请编程求出这个数列的前20项之和。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <stdio.h>
int main( )
{
int i, t, n = 20;
double a = 2, b = 1, s = 0; //分子为a,分母为b,式子的和为s
for (i=1; i<=n; i++)
{
s = s + a/b;
t = a; //将前一项的分子的值赋给中间变量t
a = a+b; // 将前一项分子与分母之和作为下一项的分子
b = t; // 将前一项的分子作为下一项的分母
}
printf("%f", s);
return 0;
}请编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可为+,—,*,/(用switch语句实现)。
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
43
44
45
46#include<stdio.h>
int main()
{
double data1, data2, data;
char op;
scanf("%lf%c%lf", &data1, &op, &data2);
switch(op)
{
case '+':
data=data1+data2;break;
case '-':
data=data1-data2;break;
case '*':
data=data1*data2;break;
case '/':
{
if (data2!=0)
data=data1/data2;
else
{
printf("除数不能为0!\n");
return 0;
}
};break;
default :
{
printf("Error!");
return 0;
}
}
printf("%g%c%g=%g",data1,op,data2,data);
return 0;
}复习:C switch 语句
输入整数n,其中0<n<7,输出用n、n+1、n+2、n+3这4个数字组成的无重复数字的3位数。
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#include<stdio.h>
int main()
{
int n;
int i, j, k;
printf("请输入n\n");
scanf("%d", &n);
if ((n>0)&&(n<7))
{
//穷举法全排列
for (i = n; i <= n + 3; i++)
{
for (j = n; j <= n + 3; j++)
{
for (k = n; k <= n + 3; k++)
{
//当i,j,k中有任意两个相等时
if (i == j || i == k || j == k)
continue; //直接开始下一次循环
printf("%d%d%d ", i, j, k);
}
}
}
}
else printf("Error!");
return 0;
}在键盘上输入n(n<100)个整数,试编写程序使该数组中的数按照从大到小的次序排列。其中数组元素排序是通过sortarr函数实现的。其中部分程序已经给出,请把程序补充完整。
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>
#include<string.h>
int main()
{
int a[100],n,i,j,temp;
printf("Input number of integers\n");
scanf("%d",&n);
printf("Input integers in order\n");
for (i=0;i<n;i++)
scanf("%d",&a[i]); //将数据录入数组
//冒泡排序
for (i=0;i<n-1;i++) //外层循环
for (j=0;j<n-1-i;j++) //内层循环
if (a[j]>a[j+1]) //比较相邻两个数的大小
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
//将排序后的数组元素依次输出
for(i=n-1;i>=0;i--) //注意此处for(i=n-1;i>=0;i--)才是把数据从大到小输出
//for(i=0;i<n;i++)是把数据从小到大输出!!!
//因为第14行代码用的是'>'
{
printf("%d",a[i]);
printf(" ");
}
}复习:冒泡排序法
请编程实现两个字符串的连接(函数strcon内不能使用库函数)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include<stdio.h>
#include<string.h>
void strcon(char *a, char *b) //传递字符串a和b的首地址
{
int i=strlen(a), j; //strlen函数用于计算字符串的长度
for (j=0; j<=strlen(b); j++)
a[i++]=b[j];
}
int main()
{
char a[200], b[100];
printf("输入一个字符串:\n");
gets(a);
printf("输入另一个的字符:\n");
gets(b);
strcon(a,b);
printf("%s",a);
return 0;
}请编程实现如下功能:数组a中存放着本班C语言期末考试的成绩,请把程序补充完整,使其能实现求平均成绩、最高分、最低分(1号学生的成绩存在数组的0号元素中,如果学号对应的同学退学或缺考,则输入分数为-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
26
27
28
29
30
31
32
33
34
35
36
37
38#include<stdio.h>
int main()
{
double ave=0,sum=0;
int i,a[100],n,t,max,min;
printf("输入本班人数:\n");
scanf("%d", &n);
//录入成绩
printf("依次输入学生成绩:\n");
for (i=0;i<n;i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
printf("输入退学人数:\n");
scanf("%d",&t);
max = a[0]; //假设数组a第一个元素既是最大值也是最小值
min = a[0]; //注意:max=min=a[0]这种写法是错误的!赋值运算符为双目运算符
//在数组a中找最高分和最低分
for (i=0;i<n;i++)
{
if (a[i]>max)
max=a[i];
if (a[i]<min)
min=a[i];
}
ave=sum/(n-t); //求平均成绩
printf("平均成绩:%f\n最高分:%d\n最低分:%d",ave,max,min);
return 0;
}请编程实现求解二维数组a[3][3]={1,2,3,4,5,6,7,8,9}周边元素的和。
1
请编程实现求解方阵a[3][3]={1,2,3,4,5,6,7,8,9}上三角(包含对角线)的元素的和。
1
请编程实现两个字符串的比较(不能使用库函数strcmp)。
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
43
44
45
46
47#include <stdio.h>
#include <string.h>
void strcmp(char str1[],char str2[]);
int main()
{
puts("请输入两个字符串");
char str1[100], str2[100];
gets (str1);
gets (str2);
strcmp (str1, str2);
return 0;
}
//编写strcmp函数
void strcmp (char str1[], char str2[])
{
int a = strlen(str1);
int b = strlen(str2);
int i, flag=0, max;
max = a>=b?a:b;
for (i = 0; i < max; i++)
{
if (str1[i] > str2[i])
{
printf("%s大于%s", str1, str2);
break;
}
else if (str1[i] < str2[i])
{
printf("%s小于%s", str1, str2);
break;
}
if (str1[i] == str2[i])
{
flag++;
}
}
//两字符串相等
if (flag == max)
{
printf("%s等于%s", str1, str2);
}
}已有一个按升序排好的数组,要求输入一个数后,按升序规律插入到数组中。
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
43
44#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, num;
//确定原数组的长度
printf("输入数组长度:");
scanf("%d", &n);
int nums[n+1]; //插入元素后的数组长度是n+1
//给原数组的各个元素赋值
printf("按升序输入 %d 个数值:", n);
for(int i = 0; i < n; i++)
scanf("%d", &nums[i]);
//输入要插入原数组中的新元素
printf("输入一个插入数值:");
scanf("%d", &num);
//查找新元素在原数组中要插入的位置
for (int i = 0, j = 0; i < n; i++)
{
//若nums[i] > num,则说明找到插入位置
if (nums[i] > num)
{
//在nunms[i]前面插入新元素后,新元素后的元素都要后移一位
for (int j = i; j < n+1; j++)
{
nums[j] -= num;
num += nums[j];
nums[j] = num - nums[j];
}
break; //跳出整个寻找位置的循环
}
}
//把插入新元素后的新数组输出
for (int i = 0; i < n+1; i++)
printf("%d ", nums[i]);
return 0;
}链接:解析
统计字符数组中各小写字母(忽略大小写,即’A’视为小写’a’)出现的次数,其统计结果放入另一个数组中。
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>
int main()
{
char c;
int str[256] = {0}; //(注意是用int)建数组str[256]={0},分别统计a到z出现的次数;
int i = 0;
printf("输入一行字符串,我们将统计各个小写字母(忽略大小写)出现的次数\n");
while ( ( c = getchar() ) != '\n') //键入字符
{
//将A~Z(大写字母)的统计结果整合到对应的小写字母的统计结果中去
if ( (c > 'A')&&(c < 'Z') )
str[c+32]++;
//c所对应的字符的计数器自增1
else
str[c]++;
}
//用for循环实现a~z的统计结果的输出
for (int i = 'a'; i < 'z'+1; i++)
if ( str[i] )
printf ("%c: %d\n", i, str[i]);
return 0;
}链接:字符数组
请编程实现求最长单词的长度(字符串中不包含标点符号,单词之间以空格隔开)。
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
43
44
45#include<stdio.h>
int main()
{
char a[200];
int b[200], c[200], len=0, i, j, max;
printf("输入多个单词(单词间用空隔来隔开)\n");
gets(a);
for (i = 0, j = 0; i <= 199; i++)
{
if (a[i] != 32 && a[i] != '\0')//32代表空格,\0是字符串结束标志
{
len++;
//len用于记录每个单词的长度
}
if (a[i-1] != 32 && a[i] == 32)
{
c[j] = i;//数组c用于记录每个单词的末尾的位置
b[j] = len;//把每个单词的长度存入一个数组中
len = 0;
j++;//j用于记录单词数,遇到空格时,单词数+1
}
if (a[i] == '\0')
{
c[j] = i;
b[j] = len;
break;
}
}
max=0;
for (i = 1; i <= j; i++)
if (b[i] > b[max])
max = i;//求出单词的最大长度
for (i = 0; i <= j; i++)
if (b[i] == b[max])//找出第一个最长的单词
break;
for (j = c[i] - b[i]; j < c[i]; j++)//通过数组c找到其位置并输出
printf("%c", a[j]);
printf("\n上述单词中长度最长的单词的长度为%d", len);
return 0;
}猴子选大王。n只猴子围成一圈,每次从第1只开始报数,凡是报到m者退出圈子。最后留在圈子中的猴子为大王。输入n, m,输出猴子出圈的序号。
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <stdio.h>
#include <stdlib.h>
struct mon
{
int num;
struct Node *next;
};
struct mon *create(int n)
{ // 新建链表,无头结点,并且最后一个结点的next指向第一个结点
int i;
struct mon *p,*tail,*head;
p=(struct mon *)malloc(sizeof(struct mon));
p->num=1;
p->next=NULL;
head= p;
tail=p;
for(i=2;i<=n;i++)
{
p=( struct mon *)malloc(sizeof(struct mon));
p->num=i;
tail->next=p;
tail=p;
p->next=NULL;
}
tail->next=head;
return head;
}
int sel( struct mon *head,int m,int n)
{
int num1=0;//表示猴子报数的计数变量<br> int count =0; //用以统计出圈猴子数目的计数变量
struct mon *p,*q; //分别指向当前结点及其前驱结点的指针
q=head;
while(q->next!=head)
q= q->next; //第一个结点的前驱结点
printf("被删除的猴子的序号依次是:");
while(count<n-1)
{
p=q->next;
num1++;
if(num1%m==0)
{ //找到一个被删除结点,完成删除、计数、输出
q->next=p->next;
printf("%3d",p->num);
free(p);
count++;
}
else
q=p;
}
return q->num; // 最后一个结点的数据域即为留在圈内猴王的序号
}
int main()
{
int n,m;
struct mon * head;
scanf("%d%d",&n,&m);
head=create(n);
printf("\n猴王是%d\n",sel(head,m,n));
return 0;
}链接:源代码出处