C语言复习纲要.docx
- 文档编号:3680135
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:35
- 大小:26.44KB
C语言复习纲要.docx
《C语言复习纲要.docx》由会员分享,可在线阅读,更多相关《C语言复习纲要.docx(35页珍藏版)》请在冰豆网上搜索。
C语言复习纲要
C语言复习纲要
1.合并字符串(已知为升序,合并为升序)
程序:
#include
intmain()
{charstr1[80],str2[80],str[80];//str存放合并后的字符串,注意//str要足够大
inti,j,n;
gets(str1);//用gets()函数读取字符串str1.
gets(str2);//用gets()函数读取字符串str2.
n=0;
for(i=0,j=0;str1[i]!
='\0'&&str2[j]!
='\0';)
if(str1[i] elsestr[n++]=str2[j++]; while(str1[i]! ='\0')str[n++]=str1[i++]; while(str2[j]! ='\0')str[n++]=str2[j++]; str[n]='\0';//在合并后的字符串后面添加‘\0’,表示字符串结束。 puts(str);//用puts()函数输出字符串。 return0; } 算法分析: 由于已经确定str1和str2为升序排列,在str1[i]! ='\0'&&str2[j]! ='\0'的条件下从i=0,j=0,n=0,开始对str(i)和str(j)的值进行比较,将其中小的值赋给str(n),并且同时令相应的n和对应的i或j加一,继续比较,就可以依次将str1和str2字符中较小的字符赋给str,当str1或者str2中有一方的值为’\0’时,循环终止,此时,只需将另一字符串的值依次赋给str即可,最后在str结尾添加‘\0’. 重要语法: if(str1[i] elsestr[n++]=str2[j++]; 用来将str1和str2中较小值赋给str,并同时令n和i或j加一,继续循环。 2.整数问题: 请输出满足以下条件的n位正整数的个数: 要求该n位整数的从高位开始前1位可以被1整除,前2位可以被2*2整除,前3位可以被3*3整除,前4位可以被4*4整除……。 即该整数前k位都可被k平方整除。 程序: #include intmain() { intn,i,x=1,y,p,q,flag,k=0;//n=位数,k=个数 scanf("%d",&n); if(n==0)printf("0\n");//0为特殊情况,单独考虑 else { for(i=1;i x=x*10;//x=起始值,此处,直接写循环比用子函数方便。 p=x;//将初始值x赋给p。 for(y=x*10;x 若将x=x+q改成x=x+1,则//当输入为8或9等较大数字时,无法正确输出。 { for(i=2,q=p,flag=1;i<=n&&flag;i++)//用flag标志判断x是否//符合条件。 { q=q/10;//依次用x/q,取出x的前i位数 if((x/q)%(i*i)! =0)flag=0;//判断是否满足条件 } if(flag==1)k++; } printf("%d\n",k); } return0; } 算法分析: 首先对于一个n位数,很容易确定其循环的起点和终点,接下来依次取出该数的前i位,并判断是否符合条件,关键是当不符合条件时,直接加上q,即可进行下一步判断,如果每次+1,效率太低,对于高位数无法输出。 重要语法: for(i=2,q=p,flag=1;i<=n&&flag;i++) { q=q/10; if((x/q)%(i*i)! =0)flag=0; } if(flag==1)k++; } q每次/10,来取出n的前i位数,并判断,当不符合时,x=x+q。 3.删除重复字符: 输入一个长度不超过100的字符串,删除串中的重复字符。 程序: #include intmain() { charstr1[100],str[100]; inti,j,n=0,flag; gets(str1); str[n++]=str1[0];//str1[0]无需判断,直接赋给str[0] for(i=1;str1[i]! ='\0';i++) { for(j=0,flag=1;j { if(str1[j]==str1[i])flag=0; }//判断str[i]是否与前面的字符重复,并决定是否赋给str[n] if(flag==1)str[n++]=str1[i]; } str[n]='\0'; puts(str);//用puts()输出字符后,无需再换行 return0; } 算法分析: 先将str1[0]的值赋给str[0],再依次判断str1[i]是否不与前面字符重复,若不重复,则赋给str[n]。 重要语法: for(j=0,flag=1;j { if(str1[j]==str1[i])flag=0; }对str[i]是否与前面字符重复的判断。 4.串的减法: 输入字符串s和t(串长不超过80个字符),将在字符串s中出现,但未在字符串t中出现的字符组成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符,输出u。 程序: #include intmain() {chars[80],t[80],u[80]; inti,j,k=0; gets(s); gets(t); for(i=0;s[i]! ='\0';i++) { for(j=0;t[j]! ='\0';j++) if(s[i]==t[j]) break;//用break提前结束循环 if(t[j]=='\0')//根据循环结束条件,判断s[i]是否在t中出现,//以决定是否赋给u[K] u[k++]=s[i]; } u[k]='\0'; puts(u); return0; } 算法分析: 用两个循环,外循环为s,依次判断s中字符是否出现在t中,若未出现,则赋给u。 重要语法: for(i=0;s[i]! ='\0';i++) { for(j=0;t[j]! ='\0';j++) if(s[i]==t[j]) break; if(t[j]=='\0') u[k++]=s[i]; } 用break来结束第二个循环,根据循环结束条件,判断s中字符是否出现在t中。 5.字符串的排序 选择排序法: 程序: #include intmain() {inti,j,p; charstr[10000],t;//若出现无效内存引用,则应该适当扩大gets(str);//数组的容量 for(i=0;str[i]! ='\0';i++) {p=i; for(j=i+1;str[j]! ='\0';j++) if(str[p] if(p! =i) {t=str[p];str[p]=str[i];str[i]=t;} } str[i]='\0'; puts(str); return0; } 算法分析: 利用循环,依次将未排序的第一个数的下标赋给p,再用循环依次比较,找出符合升序或降序的正确下标,赋给p。 重复第一次循环,便可以得到升序或降序的排列。 对于数字同样可以用该算法排序。 重要语法: for(i=0;str[i]! ='\0';i++) {p=i; for(j=i+1;str[j]! ='\0';j++) if(str[p] if(p! =i) {t=str[p];str[p]=str[i];str[i]=t;} } 选择排序的语法,注意思路。 6.单词排序 二维数组法: 程序: #include #include #include intmain() { charstr1[5][100],str2[100]; inti,j,p; for(i=0;i<5;i++) gets(str1[i]);//输入5个字符串,str1[i]代表二维数组str[i][100] for(i=0;i<5;i++)//的地址 { p=i; for(j=i+1;j<5;j++) if(strcmp(str1[j],str1[p])>0){strcpy(str2,str1[p]),strcpy(str1[p],str1[j]),strcpy(str1[j],str2);}//用数组名对数组进行操作 } for(i=0;i<5;i++) printf("%s\n",str1[i]);//通过二维数组的地址输出字符串 system("pause"); return0; } 算法分析: 关键在于将5个字符串进行循环处理,以此来方便排序。 利用二维数组的概念,将字符串放在二维数组第二维,引用二维数组的单维数组名便可以调用整个字符数组,记住二维数组的特点。 7.打印字符(TestA1) 输入行数和起始字母,输出大写字母等腰三角形。 输出的字母是循环的,即递增到字母'Z'以后输出'A';递减到字母'A'以后输出'Z'。 例如: 输入: 4X↙ 输出: X↙ YZY↙ ZABAZ↙ ABCDCBA↙ 程序: #include #include intmain() {inti,j,n; charch; scanf("%d%c",&n,&ch);//输入参数 for(i=1;i<=n;i++) {for(j=1;j<=n-i;j++) putchar('');//先在每行打印空格 for(j=1;j<=i;j++) {if(ch>'Z') ch=ch-26;//注意该判断条件的位置,由于此处会 putchar(ch);//对字符进行递加,故应该判断字符 ch++;//是否大于‘Z’. } ch--; ch--;//两个ch--的作用是使字符变到中间字符减一的字符 for(j=1;j<=i-1;j++) {if(ch<'A') ch=ch+26;//注意该判断条件的位置 putchar(ch); ch--; } putchar('\n'); ch++; ch++;//使字符变为下一行开始字符 } system("PAUSE"); return0; } 算法分析: 对于打印图形类问题,关键在于分析规律! 注意打印的形式,将空格当字符打印出来! 本题的规律在于每行的空格数与行数成函数关系,每行需打印的字符成对称关系! 按照对称性,用两个循环,分别打印出来! 另外注意相邻两行的规律,前一行最后一个字符递加一个就是下一行开始的字符! 这样对于所有打印的字符可以用一个变量来处理,程序更加简单! 重要语法: putchar('\n'); ch++; ch++; for(j=1;j<=i;j++) {if(ch>'Z') ch=ch-26; putchar(ch); ch++; } ch--; ch--; 8.字母X 输入整数n值和首字母,输出以首字母为中心,边长为n的X形。 其中,上两条边上字母递增,下两条边上字母递减。 且认为字母是循环的,即Z与A相邻。 若输入的不是大写字母,则输出”inputerror"提示。 输入: 4A 输出: D D C C B B A Z Z Y Y X X 程序: #include #include intmain() { inti,j,n,k; charch; scanf("%d%c",&n,&ch); if(ch<'A'||ch>'Z')printf("inputerror\n"); else { ch=ch+n-1;//得到首行字符 for(i=1;i<=n;i++) {for(k=1;k<=5;k++) { if(ch<'A')ch=ch+26;//注意,首行字符向下递减的时候,可能会 if(ch>'Z')ch=ch-26;//出现字符大于Z或者小于A的情形 }//当n的值过大的时候,需要多做几次判断 for(j=1;j<=2*n-i;j++) { if(j==i||j==2*n-i)putchar(ch); elseputchar(''); } putchar('\n'); ch--; } for(i=1;i<=n-1;i++) { if(ch<'A')ch=ch+26;//只需判断ch是否小于A for(j=1;j<=n+i;j++) { if(j==n-i||j==n+i)putchar(ch); elseputchar(''); } putchar('\n'); ch--; } } system("pause"); return0; } 算法分析: 先按规律求出首行字符,再依次打印,注意只需使用一个字符变量,相邻两行字符变化有规律。 重要语法: for(k=1;k<=5;k++) { if(ch<'A')ch=ch+26;// if(ch>'Z')ch=ch-26;// } 对前半段的字符,需要同时判断是否大于Z,小于A. 9.打印空心数字梯形 输入行数n和首数字字符,在屏幕上输出由数字围起的高和下底宽度均n的空心梯形。 要求: 输出的数字是循环的,即输出数字9后再输出的数字是0。 输入: 行数n和首字符 输出: 空心梯形 程序: #include #include intmain() { inti,j,n; charch;//仅用一个字符变量,通过递增或递减输出字符,将本题 scanf("%d%c",&n,&ch);//数字当作字符输出 if(n==1){putchar(ch);putchar('\n');}//特殊情况是n=1! 特殊对待 else { for(j=1;j<=3*n-2;j++) { if(ch>'9')ch=ch-10; if(j%2==0)putchar(''); elseputchar(ch++); }//注意此处,j的值是加了1的,所以判断语句如下 if(j%2! =0)ch--;elsech=ch-2;//用该语句即可概括奇偶的 for(j=3*n-1;j<=6*n-5;j++)//不必用两个语句分开讨论奇偶 { if(ch<'0')ch=ch+10;//注意该判断条件 if(j%2==0)putchar(''); elseputchar(ch--); }//注意找规律,不论是奇数还是偶数,第一行的字符数为 putchar('\n');ch++;ch++;//6*n-5 for(i=1;i<=n-2;i++)//输出中间的n-2行 { if(ch>'9')ch=ch-10;//注意该判断条件 for(j=1;j<=6*n-5-2*i;j++) { if(j==2*i+1||j==6*n-5-2*i)putchar(ch); elseputchar(''); } putchar('\n'); ch++; } for(j=1;j<=2*n-2;j++) putchar('');//打印最后一行前面空格 for(j=2*n-1;j<=3*n-2;j++)//输出最后一行思路与第一行相同, {//只是循环次数不同 if(ch>'9')ch=ch-10; if(j%2==0)putchar(''); elseputchar(ch++); } if(j%2! =0)ch--;elsech=ch-2; for(j=3*n-1;j<=4*n-3;j++) { if(ch<'0')ch=ch+10; if(j%2==0)putchar(''); elseputchar(ch--); } } putchar('\n'); system("pause"); return0; } 算法分析: 第一: 将此处的数字当作字符处理,直接打印字符,另外总体思路为只用一个字符来递增或递减输出。 第二: 此处需要处理特殊情况,即n=1的情形。 n>=2时,分第一行,中间行以及最后行输出。 其中第一行和最后一行输出规律相同,只是循环次数不同。 第三,关键在于找到每行字符个数,以及字符数的递变规律。 另外注意奇偶的输出区别。 重要语法: 1.if(j%2! =0)ch--;elsech=ch-2; 用来处理n为奇数和n为偶数的两种情形 2.for(j=3*n-1;j<=6*n-5;j++) 由分析得,首行的字符数均为6*n-5个 注意: 本题不该用把字符当作数字按照%2d的形式输出,应为中间的行里面,数字的间距不同 10.空心数字菱形 输入: n 输出: 数字菱形 友情提示: 同学们总结一下打印星号组成的实心图形程序的编程思路: 第一步,打印星号组成的正方形;第二步,改变每行星号的个数,打印每行星号数量不一样的图形;如果是空心图形,每行第一个和最后一个位置输出星号,其他位置输出空格。 程序: #include #include intmain() { inti,j,n,k; scanf("%d",&n); k=n;//注意此处n有两个作用,一个用来递变,一个用来控制 for(i=1;i<=k;i++)//次数,故应该用另一个变量保存n { for(j=1;j<=k-i;j++) printf(""); for(j=k-i+1;j<=k;j++)//注意循环起始条件 printf("%-2d",n--); n++;n++; for(j=k+1;j<=k+i-1;j++)//注意循环起始条件 printf("%-2d",n++); n--;putchar('\n'); } for(i=1;i<=k-1;i++) { for(j=1;j<=i;j++) printf(""); for(j=i+1;j<=k;j++)//注意循环起始条件 printf("%-2d",n--); n++;n++; for(j=k+1;j<=2*k-1-i;j++)//注意循环起始条件 printf("%-2d",n++); n--;putchar('\n'); } system("pause"); return0; } 算法分析: 首先,由于本题输出的数字有的为两位数,故不可以用将这些数字看作字符,而应该当作数字处理。 此时,数字间的空格可以通过输出的格式,即%-2d,来打印出来。 其次,本题中输入的n有两个作用,一个是用来递变,另一个是控制循环的次数。 故应该用另一个变量保存n的值,使之为定值来控制循环次数。 另外,对于每行的输出,关键在于找到每次循环的起始和终止条件! 重要语法: 1.k=n; 用k来保存n的值,依次来控制循环次数 2.for(j=k-i+1;j<=k;j++) 3.for(j=i+1;j<=k;j++) 4.for(j=k+1;j<=2*k-1-i;j++) 注意各起始和终止条件 11.空心的倒三角形 输入: 输入三角形的高度(h>=0)。 输出: 打印相应的空心倒三角形。 程序: #include #include intmain() { intn,i,j; scanf("%d",&n); if(n==1)putchar('*');//n=1是特殊情况,要单独讨论 else { for(j=1;j<=2*n-1;j++)//注意循环次数 putchar('*'); putchar('\n'); for(i=2;i<=n;i++) { for(j=1;j<=2*n-i;j++) if(j==i||j==2*n-i)putchar('*'); elseputchar(''); putchar('\n'); } } system("pause"); return0; } 算法分析: 考虑第一行的特殊情况即可,其他思路与前面的类似 12.空心字符菱形 输入: 菱型起始字母和菱形的高度。 输出: 参看测试用例,打印空心的由字符组成的菱形。 程序: #include #include intmain() { inti,j,n; charch; scanf("%c%d",&ch,&n); for(i=1;i<=n;i++) { for(j=1;j<=n+i-1;j++)//注意循环起始和终止条件 if(j==n-i+1||j==n+i-1)putchar(ch); elseputchar(''); putchar('\n');ch++; } ch--;ch--; for(i=1;i<=n-1;i++) { for(j=1;j<=2*n-1-i;j++)//注意循环起始和终止条件 if(j==i+1||j==2*n-1-i)putchar(ch); elseputchar(''); putchar('\n');ch--; } system("pause"); return0; } 算法分析: 与上题类似。 13.数字正方形 输入n的值,输出如下例(n=4)所示的由数字组成的正方型。 1234 5678 9101112 13141516 输入: n 输出: 数字组成的正方型 程序: #include #include<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 复习 纲要