C语言复习纲要.docx

上传人:b****3 文档编号:3680135 上传时间:2022-11-24 格式:DOCX 页数:35 大小:26.44KB
下载 相关 举报
C语言复习纲要.docx_第1页
第1页 / 共35页
C语言复习纲要.docx_第2页
第2页 / 共35页
C语言复习纲要.docx_第3页
第3页 / 共35页
C语言复习纲要.docx_第4页
第4页 / 共35页
C语言复习纲要.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

C语言复习纲要.docx

《C语言复习纲要.docx》由会员分享,可在线阅读,更多相关《C语言复习纲要.docx(35页珍藏版)》请在冰豆网上搜索。

C语言复习纲要.docx

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<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1