小白学C语言(二)

mac2026-05-04  7

目录

六、数组七、指针八、结构九、递归十、指针进阶 小白学C语言的记录博,课程已经结束了,不会再更新了。 题目都是实验课老师布置的,代码有参考其他大佬,特此致谢! 使用教材:C语言程序设计(第3版) 何钦铭、颜晖主编 高等教育出版社

六、数组

1 以等腰三角形输出n行杨辉三角形。n的值从键盘输入且小于10,每个数字输出占4列。

#include <stdio.h> int main (void) { int a[14][14],n=0,i,j,k; while (n<=0 || n>=13) scanf("%d",&n); for (i=1;i<=n;i++) a[i][1]=a[i][i]=1; for (i=3;i<=n;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for (i=1;i<=n;i++){ for (k=1;k<=n-i;k++) printf (" "); for (j=1;j<=i;j++) printf("%4d",a[i][j]); printf("\n"); } return 0; }

样例 2 教材P177:第7章课后习题题三(2)-数字个数统计。

#include <stdio.h> int main (void) { int n,a[1001],s[10]={0},i,j,max; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { while(a[i]!=0) { j=a[i]%10; s[j]++; a[i]=a[i]/10; } } max=0; for(j=1;j<10;j++) { if(s[j]>s[max]) max=j; } printf("%d:%d\n",max,s[max]); return 0; }

样例 3 从键盘接收一个字符串,判定输入的字符串是否为回文。

#include <stdio.h> int main (void) { int i,k; char line[50]; printf("input a string\n"); k=0; while ((line[k]=getchar())!='\n') k++; line[k]='\0'; i=0; k=k-1; while (i<k) { if(line[i]!=line[k]) break; i++; k--; } if(i>=k) printf("yes"); else printf("no"); return 0; }

样例 4 从键盘输入由小写英文字母构成的字符串,统计字符串中各个字母出现的次数,并输出其中至少出现过一次的字母及其出现的次数。

#include<stdio.h> int main() { int a[100]={0},i,j; char c; while((c=getchar())!='\n') for (i=65;i<=90;i++) if(c==i+32) a[i]++; for (j=65;j<=90;j++) if (a[j]>0) printf("%c:%d\n",j+32,a[j]); return 0; }

样例 5 从键盘输入三行文字(每行不超过80个字符),统计出其中大写字母、小写字母、数字字符、空格、其它字符的个数。

#include <stdio.h> int main (void) { int i,j; int up=0,low=0,dig=0,spa=0,oth=0; char a[3][80]; for (i=0;i<3;i++) gets(a[i]); for (i=0;i<3;i++) for (j=0;j<80 && a[i][j]!='\0';j++) if (a[i][j]>='A' && a[i][j]<='Z') up++; else if (a[i][j]>='a' && a[i][j]<='z') low++; else if (a[i][j]>='0' && a[i][j]<='9') dig++; else if (a[i][j]==' ') spa++; else oth++; printf("upper: %d\nlower: %d\ndigit: %d\nspace: %d\nother: %d",up,low,dig,spa,oth); return 0; }

样例 6 从键盘输入两个整数m和n(1<m<n<20),再输入n个整数,使其前面各数顺序向左移动m个位置,即最前面m个整数变成最后面的m个数。

#include <stdio.h> int main(void) { int m,n,i,j,temp; int a[20]; scanf("n=%d,m=%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<m;i++) { temp=a[0]; for(j=0;j<n-1;j++) a[j]=a[j+1]; a[n-1]=temp; } for(i=0;i<n;i++) printf("%3d",a[i]); return 0; }

样例 7 已知一个二维整型数组已初始化a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}},请删除此数组中所有等于输入值的元素,删除后,各元素依次前移。 请注意,C语言二维数组的行优先方式存储。例如:a[3][2]的数组,在内存中依次存储a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1],也就是说,先存储第“0”行的元素,再存储第“1”行的元素。

#include <stdio.h> int main() { int i,j,count=0,num; int a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}}; scanf("%d",&num); for(i=0;i<5;i++) for(j=0;j<5;j++) if(a[i][j]!=num) { a[count/5][count%5]=a[i][j]; //利用count获得保留下来的元素的下标 count++; } for(i=0;i<5;i++) { for(j=0;j<5;j++) { count--; if(count<0) //如果count原本为0,即一个都没有 break; printf("%3d",a[i][j]);//如果至少还有一个,输出 } printf("\n"); } return 0; }

样例 8 从键盘输入一串仅由英文字母和空格构成的字符串,统计其中单词的个数,并将每个单词的第一个字母改成小写,输出统计结果以及修改后的字符串。这里“单词”是指由空格隔开的英文字符串。

#include <stdio.h> int main() { char x[100]; int i,cnt=1; gets(x); x[0]=x[0]+32; for (i=0;x[i]!='\0';i++) { if (x[i]==' ') cnt++; if (x[i]==' '&&(x[i+1]>='A'&&x[i+1]<='Z')) x[i+1]=x[i+1]+32; } printf("count:%d\n",cnt); for (i=0;x[i]!='\0';i++) printf("%c",x[i]); return 0; }

样例

七、指针

1 通过调用自定义函数void find(int *p,int n,int *max,int *min),在数组a中同时查找最大元素和最小元素的下标,分别存放在main()函数中的max和min变量中。

#include <stdio.h> void find(int *p,int n,int *max,int *min) { int i; *max=*min=0; for(i=1;i<n;i++) { if(p[i]>p[*max]) *max=i; if(p[i]<p[*min]) *min=i; } } int main() { int a[5],i,max,min; for(i=0;i<5;i++) scanf("%d",&a[i]); find(a,5,&max,&min); printf("%d,%d",max,min); return 0; }

样例 2 从键盘输入一个正整数n(n的值不超过10),然后输入n个互不相同的整数,通过调用一个排序函数void sort(int *x,int n)对这n个整数按从大到小的顺序排序,然后依次输出。(冒泡排序)

#include<stdio.h> #define N 10 void sort(int *x,int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-1;j++) if(x[j]<x[j+1]) t=x[j],x[j]=x[j+1],x[j+1]=t; } void main() { int a[N],n,*p; scanf("n=%d",&n); for(p=a;p<a+n;p++) scanf("%d",p); sort(a,n); for(p=a;p<a+n;p++) printf("%3d",*p); }

样例 3 在主函数中输入一个字符串,然后再输入任意一个字符,通过调用一个自定义函数void chardel(char *p,char c),将字符串中存在的该指定字符删除掉,在主函数中输出删除指定字符后的字符串。

#include <stdio.h> void chardel(char *p,char c) { char *q; for(q=p;*p!='\0';p++) if(*p!= c) *q++=*p; *q='\0'; } void main() { char a[100],c; gets(a); c=getchar(); chardel(a,c); printf("After delete:\n"); puts(a); }

样例 4 对任意输入的一串字符,判断其是否为回文字符串。

#include <stdio.h> #include <string.h> int ishw(char *p) { char *q; q=p; while(*q) q++; q--; while(p<q) { if(*p!=*q) return 0; p++; q--; } return 1; } main (void) { char str[20],*p=str; gets(p); if(ishw(p)) printf("yes"); else printf("no"); }

样例 5 实数拆分:输入一个小数,输出整数部分和小数部分。

#include <stdio.h> void splitfloat(double x,int *intpart,double *fracpart); int main() { double a,fracpart; int intpart; scanf("%lf",&a); splitfloat(a,&intpart,&fracpart); printf("INT:%d\nFRAC:%lf\n",intpart,fracpart); return 0; } void splitfloat(double x,int *intpart,double *fracpart) { *intpart=(int)x; *fracpart=x-*intpart; }

样例

八、结构

1 定义一个有5条记录的图书类型数组,输入待查找的书名,通过调用函数void search(struct book *p,int n,char *c)在图书数组中查找该书名是否存在,如果存在,显示出该书的价格,否则显示“No found”。

#include<stdio.h> #include<string.h> struct book { char name[20]; int price; }; void search(struct book *p,int n,char *c) { int i,index=-1; for(i=0;i<n;i++,p++) if(strcmp(p->name,c)==0) { index=i; printf ("price:%d",p->price); break; } if(index==-1) printf("No found"); } void main() { char c[20]; struct book bk[5]={{"c++",35},{"python",60},{"jsp",40},{"html",20},{"java",36}}; gets(c); search(bk,5,c); }

样例 2 教材第9章P233课后习题题三(1):时间换算问题。

#include <stdio.h> struct time { int hour, minute, second; }; int main(void) { struct time t; int n; scanf("%d:%d:%d", &t.hour, &t.minute, &t.second);//输入时注意用英文标点 scanf("%d",&n); t.second += n; if(t.second >= 60) { t.minute += t.second / 60; t.second %= 60; if(t.minute >= 60) { t.hour += t.minute / 60; t.minute %= 60; if(t.hour >= 24) t.hour %= 24; } } printf("After %d seconds is %d:%d:%d", n, t.hour, t.minute, t.second); return 0; }

样例 3 教材P233第9章课后习题题三(2):复数的乘积运算。

#include <stdio.h> struct complex { double sb; double xb; }; struct complex complexproduct(struct complex s1,struct complex s2); int main() { struct complex c1,c2,c3; scanf("%lf+%lfi",&c1.sb,&c1.xb); scanf("%lf+%lfi",&c2.sb,&c2.xb); c3=complexproduct(c1,c2); printf("c1*c2=%f+%fi\n",c3.sb,c3.xb); return 0; } struct complex complexproduct(struct complex s1,struct complex s2) { struct complex w; w.sb=s1.sb*s2.sb-s1.xb*s2.xb; w.xb=s1.sb*s2.xb+s1.xb*s2.sb; return w; }

样例

九、递归

1 通过调用一个用递归方式实现的求整数n的阶乘函数double fac(int n),计算并输出从1到n的阶乘之和,即s=1!+2!+…+n!,n的值从键盘输入(n<11)。

#include <stdio.h> double fac(int n) { double f; if(n==1||n==0) f=1; else f=n*fac(n-1); return f; } int main(void) { double s=0; int i,n; scanf("%d",&n); for(i=1;i<=n;i++) s+=fac(i); printf("s=%.2lf",s); }

样例 2 从键盘输入一个十进制正整数n,通过调用一个递归函数int order(int n)实现对整数n按位顺序输出。

#include <stdio.h> void order(int n) { if(n<10) printf("%d",n); else { order(n/10); printf("%d",n%10); } } void main() { int n; scanf("%d",&n); printf("out:"); order(n); }

样例 3 按以下所给的公式计算并输出组合数: 要求: ①分别编写一个求阶乘n!的函数int fac(int n)、一个求组合数函数int cnm(int n,int m); ②编写主函数,由键盘输入n和m(n不得小于m,否则显示“input error”),通过嵌套调用①中的函数完成计算。

#include<stdio.h> int fac(int n); int cnm(int n,int m); int main(void) { int n,m; scanf("n=%d,m=%d",&n,&m); if(n<m) { printf("input error"); return 0; } printf("cnm=%d",cnm(n,m)); return 0; } int fac(int n) { int i,fact=1; for(i=1;i<=n;i++) fact=fact*i; return fact; } int cnm(int n,int m) { int c,nm=n-m; n=fac(n),m=fac(m),nm=fac(nm); c=n/(nm*m); return c; }

样例 4 教材P262第10章课后习题题三(6):递归方法求Fibonacci数列第n项。

#include<stdio.h> int fib(int n) { if(n==1||n==2) return 1; else return fib(n-1)+fib(n-2); } int main() { int n; scanf("%d",&n); printf("NO.%d=%d",n,fib(n)); return 0; }

样例 5 教材P262第10章课后习题题三(7):递归方法实现十进制显示为二进制形式。

#include<stdio.h> void dec2bin(int n) { int i=n%2; if(n>0) { dec2bin(n/2); printf("%d",i); } } int main() { int n; scanf("%d",&n); dec2bin(n); return 0; }

样例

十、指针进阶

1 输入两个字符串,通过调用自定义函数char *strcat(char *s,char *t)将两个字符串连接,输出连接后的字符串。

#include<stdio.h> char *strcat(char *s,char *t) { char *p; for(p=s;*p;p++); while(*p++=*t++); return s; } void main() { char s1[50],s2[50]; gets(s1); gets(s2); printf("%s",strcat(s1,s2)); }

样例 2 从键盘输入n个字符串(n的值由键盘输入,n<11),用选择排序法对这些字符串按其值的升序进行排序,输出排序后的各个字符串。

#include <stdio.h> #include <string.h> char a[50][50]; int i,j,n=10; void sort() { char temp[50]; for(j=0;j<n;j++) for(i=0;i<n-j-1;i++) if(strcmp(a[i],a[i+1])>0) { strcpy(temp,a[i]); strcpy(a[i],a[i+1]); strcpy(a[i+1],temp); } } void main() { scanf("%d\n",&n); for(i=0;i<n;i++) gets(a[i]); printf("\n"); sort(); for(i=0;i<n;i++) puts(a[i]); }

样例 3 用一个指针数组将表示星期的7个英文单词组织起来;任意输入一个字符串,在表中查找,若存在,则输出该字符串在表中的序号,否则输出-1。

#include <stdio.h> #include <string.h> int getindex(char *w[],char *s); int main() { int n; char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thurday","Friday","Saturday"},str[20]; gets(str); n=getindex(week,str); if(n==-1) printf("wrong input!"); else printf("%d",n); return 0; } int getindex(char *w[],char *s ) { int i,result=-1; for(i=0;i<7;i++) if(strcmp(w[i],s)==0) { result=i; break; } return result; }

样例 4 输入整数n及n个字符串,试将这些字符串按照长度的升序排列并显示出来。

#include <stdio.h> #include <string.h> char a[50][50]; int i,j,n=10; void sort() { char temp[50]; for(j=0;j<n;j++) for(i=0;i<n-j-1;i++) if(strlen(a[i])>strlen(a[i+1])) { strcpy(temp,a[i]); strcpy(a[i],a[i+1]); strcpy(a[i+1],temp); } } void main() { scanf("%d\n",&n); for(i=0;i<n;i++) gets(a[i]); printf("Sorted result:\n"); sort(); for(i=0;i<n;i++) puts(a[i]); }

样例 5 输入一个字符串后再输入两个字符,输出此字符串中从与第1 个字符匹配的位置开始到与第2 个字符匹配的位置结束的所有字符。例如,输入字符串“program”与2 个字符’r’和’g’后,输出”rog”。

#include <stdio.h> char *match(char *s,char c1,char c2);//获取字符串s中从c1到c2之间的所有字符,并且返回c1的地址 int main() { char str[100],ch_start,ch_end,*p; scanf("%s\n",str); scanf("%c %c",&ch_start,&ch_end); p=match(str,ch_start,ch_end); printf("%s",p); return 0; } char *match(char *s, char c1, char c2) { int i,length,start=0,end; length=strlen(s); end=length-1; for(i=0;i<length;i++) if(s[i]==c1) { start=i; break; } for(i=(start+1);i<length;++i) if(s[i]==c2) { end=i; break; } for(i=0;i<=end-start;i++) s[i]=s[start+i]; s[i]='\0'; return s; }

样例

最新回复(0)