题目内容:
编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:
两个正整数
输出格式:
最大公约数和最小公倍数
输入样例:
12,40[回车]
输出样例:
最大公约数:4[回车]
最小公倍数:120[回车]
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int LCM(int x, int y); 5 int GCD(int x, int y); 6 int main() 7 { 8 int a,b; 9 scanf("%d,%d",&a,&b); 10 printf("最大公约数:%d ",GCD(a,b)); 11 printf("最小公倍数:%d",LCM(a,b)); 12 return 0; 13 } 14 15 int LCM(int x, int y){ 16 return x/GCD(x,y)*y; 17 } 18 int GCD(int x, int y){ 19 return y == 0 ? x : GCD(y, x%y); 20 }
题目内容:
编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:
9个整数和1个整数
输出格式:
10个整数
输入样例:
2,3,1,5,6,76,89,31,90[回车]
7[回车]
输出样例:
1,2,3,5,6,7,31,76,89,90[回车]
1 #include<stdio.h> 2 void sortArr(int *arr, int n, int x) 3 { 4 arr[n-1] = x; 5 //插入排序 6 int i; 7 for(i=1; i<n; ++i){ 8 int j=i-1,key=arr[i]; 9 while(j>=0 && key<arr[j]){ 10 arr[j+1]=arr[j]; 11 j--; 12 } 13 arr[j+1]=key; 14 } 15 } 16 int main() 17 { 18 int arr[10] = {0},i,x; 19 for(i=0; i<8; ++i) 20 scanf("%d,",&arr[i]); 21 scanf("%d%d",&arr[i],&x); 22 23 sortArr(arr,10,x); 24 for(i=0; i<9; ++i) 25 printf("%d,",arr[i]); 26 printf("%d ",arr[i]); 27 return 0; 28 }
3、奇数求和
题目内容:
用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和
输入格式:
输入整数n
输出格式:
输出和
输入样例:
5[回车]
输出样例:
25[回车]
1 #include<stdio.h> 2 3 int sum(int n); 4 int main() 5 { 6 int n; 7 scanf("%d",&n); 8 printf("%d ",sum(n)); 9 return 0; 10 } 11 12 int sum(int n) 13 { 14 if(n == 1) 15 return 1; 16 return 2*n-1 + sum(n-1); 17 }
4、巧算自然数
题目内容:
编程实现输入一个自然数,若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。输出经过多少次可以得到自然数1和每次得到的值。
输入格式:
输入一个自然数
输出格式:
输出经过多少次可以得到自然数1和每次得到的值
输入样例:
22[回车]
输出样例:
22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1[回车]
step=16[回车]
1 #include <stdio.h> 2 int main() 3 { 4 int n, step=1; 5 scanf("%d",&n); 6 while(n!=1) 7 { 8 printf("%d,",n); 9 step++; 10 if(n%2==0) 11 n /= 2; 12 else if(n%2) 13 n = n*3+1; 14 } 15 printf("1 "); 16 printf("step=%d ", step); 17 return 0; 18 }
5、卖鸭子
题目内容:
编程调用递归函数。一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了7个村子后还剩2只鸭子,问他出发时共赶多少只鸭子?经过每个村子时依次卖出多少只鸭子?
输入格式:
无
输出格式:
出发时总鸭子数
每个村子卖出鸭子数
输入样例:
无
输出样例:(不是结果,仅表示格式)
sum=25[回车]
sell=8,sell=4,[回车]
1 #include <stdio.h> 2 int fun(int arr[],int n,int m) 3 { 4 if(n==0){ 5 arr[n] = m/2+1; 6 return m; 7 } 8 arr[n] = m/2+1; 9 return fun(arr, n-1,m=2*(m+1)); 10 } 11 int main() 12 { 13 int arr[7] = {0}; 14 printf("sum=%d ", fun(arr,7,2)); 15 for(int i=0; i<7; ++i) 16 printf("sell=%d,", arr[i]); 17 return 0; 18 }
6、输出各位数字之和
题目内容:
编程调用递归函数,求输入一个数,输出这个数的各位数字之和。
输入格式:
输入一个数
输出格式:
输出这个数的各位数字之和
输入样例:
2354[回车]
输出样例:
14[回车]
1 #include <stdio.h> 2 int fun(int n) 3 { 4 if(n==0) 5 return 0; 6 return n%10 + fun(n/10); 7 } 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 printf("%d ", fun(n)); 13 return 0; 14 }
7、排序
题目内容:
用指针方法,将一维数组int a[10] 中元素按从小到大顺序输出。
输入格式:
10个整数,空格隔开
输出格式:
排序后的10个数,逗号隔开
输入样例:
12 34 56 43 7 89 81 11 33 90[回车]
输出样例:
7,11,12,33,34,43,56,81,89,90[回车]
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0},x; 8 for(int i=0; i<10; ++i){ 9 scanf("%d",&x); 10 arr[x]++; 11 } 12 int flag = 1; 13 for(int j=0; j<N; ++j){ 14 while(arr[j]){ 15 if(!flag) 16 printf(","); 17 printf("%d",j); 18 flag = 0; 19 arr[j]--; 20 } 21 } 22 return 0; 23 }
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0}; 8 for(int i=0; i<10; ++i) 9 scanf("%d",&arr[i]); 10 //选择(选一个最小的) 11 for(int *p = arr; p<arr+9; ++p){ 12 for(int *q = p+1; q<arr+10; ++q){ 13 if(*q<*p){ 14 int t = *q; 15 *q = *p; 16 *p = t; 17 } 18 } 19 } 20 21 int flag = 0; 22 for(int *p = arr; p<arr+10; ++p){ 23 if(flag) 24 printf(","); 25 flag = 1; 26 printf("%d",*p); 27 } 28 return 0; 29 }
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0}; 8 for(int i=0; i<10; ++i) 9 scanf("%d",&arr[i]); 10 //冒泡 11 for(int i=0; i<10; ++i){ 12 for(int j=9; j>i; --j){ 13 if(arr[j-1]>arr[j]){ 14 int t = arr[j-1]; 15 arr[j-1] = arr[j]; 16 arr[j] = t; 17 } 18 } 19 } 20 21 for(int k=0; k<10; ++k){ 22 if(k) 23 printf(","); 24 printf("%d",arr[k]); 25 } 26 return 0; 27 }
8、成绩排序
题目内容:
从键盘输入3个同学4门课的成绩,将其按平均分从高到低排序输出。
输入格式:
输入3个同学4门课的成绩
输出格式:
按平均分从高到低排序输出
输入样例:
89 78 80 76 88 78 75 90 99 92 100 89[回车]
输出样例:
99,92,100,89[回车]
88,78,75,90[回车]
89,78,80,76[回车]
1 #include <stdio.h> 2 struct student{ 3 int a,b,c,d; 4 double avg; 5 }; 6 void swap(struct student *a,struct student *b){ 7 struct student t = *a; 8 *a = *b; 9 *b = t; 10 } 11 int main() 12 { 13 struct student s[3]; 14 for(int i=0; i<3; ++i){ 15 scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d); 16 s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0; 17 } 18 19 if(s[0].avg<s[1].avg) 20 swap(&s[0],&s[1]); 21 if(s[0].avg<s[2].avg) 22 swap(&s[0],&s[2]); 23 if(s[1].avg<s[2].avg) 24 swap(&s[1],&s[2]); 25 26 for(int i=0; i<3;++i) 27 printf("%d,%d,%d,%d ",s[i].a,s[i].b,s[i].c,s[i].d); 28 return 0; 29 }
9、输出指定学生成绩
题目内容:
从键盘输入3个同学4门课的成绩,输出指定同学的成绩和平均分。
输入格式:
输入3个同学4门课的成绩
输出格式:
输出指定同学的成绩和平均分
输入样例:
89 78 80 76 88 78 75 90 99 92 100 89[回车]
1[回车]
输出样例:
89 78 80 76[回车]
80.75[回车]
1 #include <stdio.h> 2 struct student{ 3 int a,b,c,d; 4 double avg; 5 }; 6 7 int main() 8 { 9 struct student s[3]; 10 for(int i=0; i<3; ++i){ 11 scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d); 12 s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0; 13 } 14 15 int i; 16 scanf("%d",&i); 17 printf("%d %d %d %d ",s[i-1].a,s[i-1].b,s[i-1].c,s[i-1].d); 18 if(s[i-1].avg==(int)s[i-1].avg) 19 printf("%.f ",s[i-1].avg); 20 else 21 printf("%.2f ",s[i-1].avg); 22 return 0; 23 }
10、统计字符串出现次数
题目内容:
从键盘输入两个字符串,输出第二个串在第一个串中出现的次数。如果没有,输出“No”。
输入格式:
输入两个字符串
输出格式:
输出第二个串在第一个串中出现的次数。
如果没有,输出 No
输入样例1:
This is his book[回车]
is[回车]
输出样例1:
3[回车]
输入样例2:
This is my book[回车]
at[回车]
输出样例2:
No[回车]
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int KMPStrMatching(char* S, char* P, int *N, int start) 6 { 7 int j= 0; // 模式的下标变量 8 int i = start; // 目标的下标变量 9 int pLen = strlen(P); // 模式的长度 10 int tLen = strlen(S); // 目标的长度 11 if (tLen - start < pLen) // 若目标比模式短,匹配无法成功 12 return (-1); 13 while ( j < pLen && i < tLen) 14 { // 反复比较,进行匹配 15 if ( j == -1 || S[i] == P[j]) 16 i++, j++; 17 else j = N[j]; 18 } 19 if (j >= pLen) 20 return (i-pLen); // 注意仔细算下标 21 else return (-1); 22 } 23 24 int* findNext(char* P) 25 { 26 int j, k; 27 int m = strlen(P); // m为模式P的长度 28 int *next = (int*)malloc(m*sizeof(int)); 29 next[0] = -1; 30 j = 0; k = -1; 31 while (j < m-1) 32 { 33 if(k == -1 || P[k] == P[j]){ 34 j++; k++; next[j] = k; 35 } 36 else 37 k = next[k]; //不等则采用 KMP 递归找首尾子串 38 } 39 return next; 40 } 41 42 int main() 43 { 44 int count=0; 45 char s1[256]="",s2[256]=""; 46 gets(s1); 47 gets(s2); 48 int len1 = strlen(s1); 49 int len2 = strlen(s2); 50 int ret = 0; 51 for(int i=0; i<len1; i=ret+len2) 52 { 53 ret = KMPStrMatching(s1,s2,findNext(s2),i); 54 if(ret == -1) 55 break; 56 count++; 57 } 58 if(count) 59 printf("%d ",count); 60 else 61 printf("No "); 62 return 0; 63 }
11、成绩统计
题目内容: 有如下学生成绩表,第一列前4行为学生姓名,第一列最后一行为平均分,表中给定数据为学生成绩(每一列为同一门课)
编程输出:学生姓名,每个学生的平均分,及各门课程平均分
输入格式:
无
输出格式:
学生姓名,每个学生的平均分(按行输出)各门课程平均分(按列输出)(若平均分为整数,则输出整数,若平均分为小数,则保留两位)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 static float av[4]; 6 7 struct student{ 8 char *s; 9 float score[4]; 10 }stu[4]; 11 12 void fun1(struct student *stu) 13 { 14 float sum=0; 15 for(int i=0; i<4; ++i) 16 { 17 av[i]+=stu->score[i]; 18 sum += stu->score[i]; 19 } 20 if((int)sum/4==sum/4) 21 printf("%s,%.f ",stu->s,sum/4); 22 else 23 printf("%s,%.2f ",stu->s,sum/4); 24 } 25 26 void fun2(float av) 27 { 28 if((int)(av/4)==av/4) 29 printf("%.f",av/4); 30 else 31 printf("%.2f",av/4); 32 } 33 34 int main() 35 { //0 36 stu[0].s = "wanglei",stu[0].score[0] = 78,stu[0].score[1] = 90,stu[0].score[2] = 87,stu[0].score[3] = 92; 37 fun1(&stu[0]); 38 //1 39 stu[1].s = "lihong",stu[1].score[0] = 88,stu[1].score[1] = 91,stu[1].score[2] = 89,stu[1].score[3] = 78; 40 fun1(&stu[1]); 41 //2 42 stu[2].s = "zhangli",stu[2].score[0] = 84,stu[2].score[1] = 76,stu[2].score[2] = 83,stu[2].score[3] = 75; 43 fun1(&stu[2]); 44 //3 45 stu[3].s = "liuming",stu[3].score[0] = 88,stu[3].score[1] = 90,stu[3].score[2] = 71,stu[3].score[3] = 83; 46 fun1(&stu[3]); 47 //4 48 printf("AVERAGE:"); 49 for(int i=0; i<4; ++i){ 50 if(i) 51 printf(","); 52 fun2(av[i]); 53 } 54 return 0; 55 }
12、输出菱形
题目内容:
输入数字和大写字母,输出由字母组成的菱形。
例如:3 B
B
C C
D D
E E
F
输入格式:
数字和大写字母
输出格式:
由字母组成的菱形
输入样例:
3[空格]B[回车]
输出样例:
[空格][空格]B[回车]
[空格]C[空格]C[回车]
D[空格][空格][空格]D[回车]
[空格]E[空格]E[回车]
[空格][空格]F[回车]
1 #include <stdio.h> 2 int main() 3 { 4 char start; 5 int high,i,j; 6 scanf("%d %c",&high,&start); 7 //上半部 8 for (i=0; i<high; i++) 9 { 10 //空格 11 for (j=1;j<high-i;j++) 12 printf (" "); 13 //字符、空格、字符 14 printf ("%c",start); 15 for (j=0;j<2*i-1;j++) 16 printf (" "); 17 if (i) 18 printf ("%c",start); 19 start++; 20 //换行 21 printf (" "); 22 } 23 24 //下半部 25 for (i=high-1; i>0 ;i--) 26 { 27 //空格 28 for (j=0;j<high-i;j++) 29 printf (" "); 30 //字符、空格、字符 31 printf ("%c",start); 32 for (j=0;j<2*i-3;j++) 33 printf (" "); 34 if (i-1){ 35 printf ("%c",start); 36 } 37 start++; 38 //换行 39 printf (" "); 40 } 41 return 0; 42 }
13、最大数
题目内容:
任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531。
输入格式:
自然数 n
输出格式:
各位数字组成的最大数
输入样例:
1593[回车]
输出样例:
9531[回车]
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 scanf("%d",&n); 6 int key[10] = {0}; 7 while(n) 8 { 9 key[n%10]++; 10 n /= 10; 11 } 12 for(int i=9; i>=0; --i){ 13 while(key[i]){ 14 printf("%d",i); 15 key[i]--; 16 } 17 } 18 return 0; 19 }
14、字符串删除
题目内容:
输入一个字符串,找出其中相同的字符(不区分大小写),并删除,输出剩余的部分。
例如:输入:eye 输出:y
输入格式:
字符串
输出格式:
删除相同字符之后的字符串
输入样例:
eye[回车]
输出样例:
y[回车]
1 #include<stdio.h> 2 #define N 256 3 4 int main() 5 { 6 /* 输入一个字符串 */ 7 char s[N] = ""; 8 gets(s); 9 char *p = s; 10 /* 判断是否重复 */ 11 int key[N] = {0}; 12 while(*p) 13 { 14 key[*p++]++; 15 } 16 /* 输出不重复的字符 */ 17 for(int i=0; s[i]; ++i) 18 if(key[s[i]]==1) 19 printf("%c",s[i]); 20 return 0; 21 }
15、字母存储
题目内容:
使用单项链表存储一组字母{a, b, c, d, c, b , a},输入序号输出字母,输入字母输出最后一次出现的序号,越界则输出N。
输入格式:
序号或字母
输出格式:
字母或序号
输入样例1:
2[回车]
输出样例1:
c[回车]
输入样例2:
c[回车]
输出样例2:
4[回车]
输入样例3:
8[回车]
输出样例3:
N[回车]
1 #include <stdio.h> 2 #include <ctype.h> 3 #include <malloc.h> 4 5 typedef struct node *PNODE; 6 typedef struct node NODE; 7 struct node{ 8 char ch; 9 PNODE next; 10 }; 11 12 /* void print(PNODE head){ 13 while(head){ 14 printf("%c",head->ch); 15 head = head->next; 16 } 17 printf(" "); 18 } */ 19 20 void print(PNODE head,int ch){ 21 if(!isalpha(ch)&&ch>'7'){ 22 printf("N "); 23 return; 24 } 25 int index = -1,t = -1;//元素从0开始计算 26 while(head){ 27 index++; //元素计数 28 if(head->ch==ch)//是字母 29 t = index + '0';//序号转字符 30 else if(index==ch-'0')//是数字 31 t = head->ch; //保存字母 32 head = head->next; 33 } 34 printf("%c ",t);//打印字母(数字) 35 } 36 37 int main() 38 { 39 /* 创建头结点 */ 40 PNODE head,rear; 41 head = rear = (PNODE)malloc(sizeof(NODE)); 42 head->next = NULL; 43 /* 字符串 */ 44 char s[] = "abcdcba"; 45 char*p = s; 46 while(*p) 47 { 48 PNODE s = (PNODE)malloc(sizeof(NODE)); 49 s->ch = *p++; 50 s->next = NULL; 51 rear->next = s;//尾插法 52 rear = s; 53 } 54 /* print(head->next); */ 55 int ch; 56 ch = getchar(); 57 print(head->next,ch); 58 59 return 0; 60 }
16、链表合并
题目内容:
实现两个由单项链表存储的有序字母数据的合并,如有重复的则只保留一个。
例如:给定{a, c ,f}, { b, e, g}合并后结果为{a, b, c , e , f , g}。
输入格式:
两个有序字母数据
输出格式:
合并后的字母数据
输入样例1:
a b c[回车]
d e f[回车]
输出样例1:
a b c d e f[回车]
输入样例2:
e f g[回车]
e g m[回车]
输出样例2:
e f g m[回车]
1 #include <stdio.h> 2 #include <malloc.h> 3 typedef struct node NODE; 4 typedef struct node* Linklist; 5 struct node{ 6 char ch; 7 Linklist next; 8 }; 9 Linklist mergelist(Linklist LA,Linklist LB) 10 { 11 /* 12 LA的头指针为新链表的头、尾指针 13 LB的头结点释放 14 */ 15 Linklist head = LA,rear = LA,temp = LB; 16 LA = LA->next; 17 LB = LB->next; 18 free(temp); 19 /* 逐个结点链接到新链表 */ 20 while(LA && LB) 21 { 22 if(LA->ch == LB->ch) 23 { 24 Linklist p = LB; 25 LB = LB->next; 26 free(p); //删除重复内容的结点 27 continue; 28 } 29 else if(LB->ch<LA->ch) 30 { 31 rear->next = LB;//尾插结点 32 LB = LB->next; 33 } 34 else if(LA->ch<LB->ch) 35 { 36 rear->next = LA;//尾插结点 37 LA = LA->next; 38 } 39 rear = rear->next;//更新尾结点 40 } 41 if(LA) 42 rear->next = LA;//尾插剩余结点 43 if(LB) 44 rear->next = LB; 45 return head; 46 } 47 Linklist create(){ 48 Linklist L,p,r; 49 L = r = (Linklist)malloc(sizeof(NODE)); 50 L->next = NULL; 51 char ch; 52 while((ch=getchar())!=' ')//空格结束 53 { 54 if(ch!=' '){ //去除空格 55 p = (Linklist)malloc(sizeof(NODE)); 56 p->ch = ch; 57 p->next = NULL; 58 r->next = p; 59 r = p; 60 } 61 } 62 return L; 63 } 64 void print(Linklist L){ 65 int flag = 0; 66 while(L->next) 67 { 68 if(flag) 69 printf(" "); 70 flag = 1; 71 L = L->next; 72 printf("%c",L->ch); 73 } 74 printf(" "); 75 } 76 int main() 77 { 78 Linklist L1 = create(); 79 Linklist L2 = create(); 80 Linklist L3 = mergelist(L1,L2); 81 print(L3); 82 return 0; 83 }
17、解析字符串
题目内容:
输入一个字符串,要求将其中的字母‘n’理解为回车符号’ ’,模拟文件缓冲区读取的数据,并按替换后的数据流解析出其中包括的字符串。(即通过'n'分割两个字符串)
输入格式:
一个字符串
输出格式:
其中包括的字符串
输入样例:
abcnde[回车]
输出样例:
abc[回车]
de[回车]
1 #include <stdio.h> 2 #define N 256 3 int main() 4 { 5 char str[N]="",*p; 6 p = str; 7 gets(str); 8 while(*p) 9 { 10 if(*p=='n'){ 11 if(*(p-1)!='n') 12 putchar(' '); 13 } 14 else 15 putchar(*p); 16 p++; 17 } 18 return 0; 19 }
18、字符串的输入与反向显示
题目内容:
请用标准设备文件的方式完成字符串的输入与反向显示。
输入格式:
字符串
输出格式:
字符串
输入样例:
abc[回车]
输出样例:
cba[回车]
1 #include <stdio.h> 2 #include<string.h> 3 #define N 256 4 int main() 5 { 6 char str[N]="",*p = str; 7 gets(str); 8 p += strlen(str) - 1; 9 while(*p) 10 putchar(*p--); 11 return 0; 12 }
19、基本四则运算表达式
题目内容:
请结合C语言语法知识以及对编译过程的理解,完成一个仅含一个运算符的基本四则运算表达式字符串的计算。
输入格式:
基本四则运算表达式字符串
输出格式:
运算结果
输入样例:
1+2
输出样例:
3
1 #include <stdio.h> 2 int main() 3 { 4 char op; 5 int i,a,b; 6 scanf("%d%c%d",&a,&op,&b); 7 switch(op) 8 { 9 case '+':printf("%d",a+b);break; 10 case '-':printf("%d",a-b);break; 11 case '*':printf("%d",a*b);break; 12 case '/':printf("%d",a/b);break; 13 } 14 return 0; 15 }
20、递归的方法计算含多个运算符的四则运算表达式字符串的值
题目内容:
请在上一题的基础上,采用递归的方法,计算含多个运算符的四则运算表达式字符串的值(无括号,但要考虑优先级)
输入格式:
多个运算符的四则运算表达式字符串
输出格式:
运算结果
输入样例:
3*2+3
输出样例:
9
1 #include <stdio.h> 2 #include <ctype.h> 3 double expression_value();//求一个表达式的值 4 double term_value();//求一个项的值 5 double factor_value();//求一个因子的值 6 double expression_value() 7 { 8 double result=term_value(); 9 while(1) 10 { 11 char op = getc(stdin); 12 ungetc(op, stdin); 13 if(op=='+'||op=='-') 14 { 15 getchar(); 16 double value=term_value(); 17 if(op=='+') 18 result+=value; 19 else 20 result-=value; 21 } 22 else 23 break; 24 } 25 return result; 26 } 27 double term_value() 28 { 29 double result = factor_value(); 30 while(1) 31 { 32 char c= getc(stdin); 33 ungetc(c, stdin); 34 if(c=='*'||c=='/') 35 { 36 getchar(); 37 double value = factor_value(); 38 if(c=='*') 39 result*=value; 40 else 41 result/=value; 42 } 43 else 44 break; 45 } 46 return result; 47 } 48 double factor_value() 49 { 50 double result=0; 51 char c= getc(stdin); 52 ungetc(c, stdin); 53 if(c=='(') 54 { 55 getchar(); 56 result = expression_value(); 57 getchar(); 58 } 59 else//因子本身是一个数字(整个递归的出口) 60 { 61 while(isdigit(c))//处理整数部分 62 { 63 result = 10*result+c-'0'; 64 getchar(); 65 c = getc(stdin); 66 ungetc(c, stdin); 67 } 68 if(c=='.')//处理小数部分 69 { 70 getchar(); 71 c = getc(stdin); 72 ungetc(c, stdin); 73 double t=0.1; 74 while(isdigit(c)) 75 { 76 result += (c-'0')*t; 77 t*=0.1; 78 getchar(); 79 c = getc(stdin); 80 ungetc(c, stdin); 81 } 82 } 83 } 84 return result; 85 } 86 int main() 87 { 88 printf("%.f ",expression_value()); 89 return 0; 90 }
21、从键盘输入一个字符串,该串中包含字母和数字,然后将数字排在最前面,字母 排在后面,不改变原有数字或字母间的顺序。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[256]="",b[256]=""; 6 char *p,*q,*ptr; 7 p = q = a; 8 ptr = b; 9 gets(a); 10 while(*p) 11 { 12 if(*p>='0'&&*p<='9'){ 13 *ptr++ = *p; 14 } 15 else 16 *q++ = *p; 17 p++; 18 } 19 *q = '