实验 4 循环
1,找出 1~200之间的所有偶数并输出。
2、输入一行字符,分别统计其中字母、数字、
其他字符的个数。
#include <stdio.h>
void main()
{ int i,k=0;
printf("\n");
for(i=1;i<=200;i++)
if(i%2==0)
{ printf("%5d",i);
k++;
if(k%10==0)
printf("\n");
}
}
#include <stdio.h>
#include <string.h>
void main()
{ int i=0,zimu=0,shuzi=0,qita=0;
char a[20];
gets(a); //输入字符串
while(a[i]!='\0')
{if(((a[i]>='a')&&(a[i]<='z'))||((a[i]>='A')&&(a[i]<='Z')))
zimu++; //字母个数
else
if((a[i]>='0')&&(a[i]<='9'))
shuzi++; //数字个数
else
qita++; //其他字符个数
i++;
}
printf("zimu=%d;shuzi=%d;qita=%d",zimu,shuzi,qita);
}
实验 5 一维数组
1、输入 10个数存放到数组中,找出其中最大的数与数组的第一个数交换,找出最小的数与数组的最后一个数交换,输出结果
2、已有数组,按由小到大顺序排列好,要求输入一个数,把它插入到原有的数列中,而且仍然保持有序。
#include <stdio.h>
void main()
{ int a[20],i,max,min,j,k;
printf("\n input 10 numbers:");
for(i=0;i<10;i++)
scanf(“%d”,&a[i]); //输入 10个数
max=min=a[0];
j=k=0;
for(i=1;i<10;i++)
{ if (max<a[i]) //找出最大值及其下标
{ max=a[i];
j=i;
}
if (min>a[i]) //找出最小值及其下标
{ min=a[i];
k=i;
}
}
if(j!=0) //如果最大值不在 a[0]处,交换
{ a[j]=a[0];
a[0]=max;
}
if(k!=9) //如果最小值不在 a[9]处,交换
{ a[k]=a[9];
a[9]=min;
}
for(i=0;i<10;i++)
printf(" %d ",a[i]);
}
数组 a[15]
2 4 6 8 10 12 14 16 18 20 …
13 X
20 … 18 20 … 16 18 20 … 14 16 18 20 …12 13 14 16 …
解题思路:从数组的最后一个元素开始,依次和 x值做比较,如果 x小,则将当前的数组元素向后移动一位,
然后继续比较,直到遇到第一个小于等于 x值的数组元素时,将 x值插入到此数组元素后面即可。
测试题 1:
#include <stdio.h>
void main()
{ int i,x ;
int a[15];
printf("\n input 10 sort
number:");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n input x:");
scanf("%d",&x);
i=9;
while((i>=0)&&(x<a[i]))
{ a[i+1]=a[i];
i-- ;
};
a[i+1]=x;
for (i=0;i<=10;i++)
printf("%d ",a[i]);
}
实验 6 二维数组
1,在已有由大到小数组中折半查找任意输入的一个数
2,定义 3个字符数组 char a[6],b[6],
c[12];从键盘输入 2个字符串(只包含字母,且按字母顺序输入),分别存放在 a和 b 中,要求对 a和 b中的字符按字母顺序排列存放到 c中,最后输出 c中的字符串。
折半查找的前提是:必须在一个有序数组进行查找工作。
解题思路:
( 1)首先输入有序数组和待查找数的初始值
( 2) 用折半查找法进行查找
( 3)若找到输出该数在数组中的位置,否则输出,无此数,
20 18 16 14 12 10 8 6 4 2
从大到小的数组 a[10]:
4待查找数 X:
i=0 j=9
1) k=(i+j)/2=4
a[4]>x; i=k+1=5
i=5
2) k=(i+j)/2=7
a[7]>x; i=k+1=8
i=8
3) k=(i+j)/2=8
a[8]=x; 查找成功
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
20 18 16 14 12 10 8 6 4 2 …
从大到小的数组 a[10]:
5待查找数 X:
i=0 j=9
1) k=(i+j)/2=4
a[4]>x; i=k+1=5
i=5
2) k=(i+j)/2=7
a[7]>x; i=k+1=8
i=8
3) k=(i+j)/2=8
a[8]<x; j=k-1=7
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
j<i 则说明数组中没有要查找的数,查找失败
j=7
#include <stdio.h>
void main( )
{int a[10]={20,18,16,14,12,10,8,6,4,2};
int i,j,k,x,flag=0;
printf("\n input x:");
scanf("%d",&x); i=0; j=9;
while( (i<=j) && (flag==0) )
{ k=(i+j)/2; //取数组中间元素下标
if ( a[k]==x ) //如果 x等于中间元素,即查找成功
{ printf("x=a[%d]=%d",k,a[k]);
flag=1;
}
else
if(a[k]>x) //若 x小于中间元素则到后一半继续查找
i=k+1;
else
j=k-1; //若 x大于中间元素则到前一半继续查找
}
if ( i>j ) //若 i>j,则表示查找失败
printf("no found the number!");
}
a c h q \0a
d g j m s \0b
c
实验题 2的过程,
a c d g h j m q s \0
#include <stdio.h>
#include <string.h>
void main()
{ char a[10],b[10],c[30];
int i,j,k; // i,j指向下一个要进行比较的数组元素
// k指向 c数组下一个要存放的元素位置
printf("\ninput two strings:");
gets(a);gets(b); //输入数组 a和 b
i=0;j=0;k=0;
while((a[i]!='\0')&&(b[j]!='\0'))
if(a[i]<b[j]) //如果 a数组小于 b数组,a存入数组 c
{ c[k]=a[i];
i++;k++;
}
else //如果 b数组小于 a数组,b存入数组 c
{ c[k]=b[j];
j++;k++;
}
if(a[i]==?\0?) //若数组 b还由剩余,则全部转入 c
while(b[j]!='\0')
{ c[k]=b[j];j++;k++;}
else //若数组 b还由剩余,则全部转入 c
while(a[i]!='\0')
{ c[k]=a[i];i++;k++;}
puts(c); //输出数组 c
}
6.4、求 1! +2! +3! +4! +……+20 !
#include <stdio.h>
void main( )
{ int i,j ; long n,sum=0 ;
for ( i=1;i<=20;i++)
{ n=1;
for ( j=1; j<=i ;j++)
n = n*j; /* 这个 For循环用来求 i! */
sum = sum + n; /* sum用来存放各阶乘的累加和 */
}
printf ("\nsum=%ld",sum);
}
第六章 课后习题
6.6、求“水仙花数”(一个 3位数,其中各位数字的立方和等于该数)
#include <stdio.h>
void main()
{ int i,n1,n2,n3,n ;
for ( i=100 ; i<=999 ; i++ )
{ n=i; n1=n/100; /* n1为百位数 */
n2=n/10 - n1*10; /* n2为十位数,也可写为
n2=(n - n1*100)/10 */
n3=n - n1*100 - n2*10; /* n3为个位数 */
if (n1*n1*n1+n2*n2*n2+n3*n3*n3==i)
printf("\n this is a number:%d",i );
}
}
6.8,求分数序列 2/1,3/2,5/3,8/5,13/8…… 前 20项之和。
#include <stdio.h>
void main()
{ int i,n=1,n1=1,n2=1,m,sum=0,t ;
for ( i=1 ; i<=20 ; i++ )
{ m=n; n=n1+n2; t=n/m; sum=sum+t;
printf("\n n=%d,m=%d,t=%d,sum=%d",n,m,t,sum);
n1 = n2 ; n2 = n;
}
printf("\n sum=%d",sum);
}
n1
n2
n
1
1
2
2
3
2
3
5+
6.10、猴子吃桃。(每天吃一半多一个,第 10天只剩一个桃子,求第一天共摘了多少桃子数?)
#include <stdio.h>
void main()
{ int x=1,i ;
for ( i=1 ; i<10 ; i++ )
{ x = 2 * ( x + 1 ) ;
printf("\n x=%d",x);
}
printf("\n the num is:%d",x);
}
第七章 课后习题
7.5 将一个数组中的值按逆序存放。
解题思路:
( 1)输入一个 n个数的数组;
( 2)将数组值逆序存放;
( 3)输出结果。 可以另外定义一个数组,将原数组的元素逆序复制到该数组中,
然后将此数组依次复制回原数组输出即可
#include <stdio.h>
void main()
{ int a[10],b[10],i;
printf("\ninput 5 numbers:");
for(i=0;i<5;i++) //输入一个数组 a
scanf("%d",&a[i]);
for(i=0;i<5;i++) b[4-i]=a[i]; //将数组逆序存放到数组 b
for(i=0;i<5;i++) a[i]=b[i]; //将数组 b转入到数组 a中
printf("nixushuchu:");
for(i=0;i<5;i++)
printf(,%d”,a[i]); //输出数组 a
}
7.12 破译密码
解题思路:
找出密码规律,A->Z; B->Y; C->X;……
a->z ; b->y; c->x;……
第 i个字母变成第( 26-i+1)个字母。
( 1)输入一行电文;
( 2)将电文中的英文字母按找要求变成密文;
( 3)输出密文和原文。
#include <stdio.h>
#include <string.h>
void main()
{ char s1[50],s2[50];
int i=0;
printf("input a string:");
gets(s1); strcpy(s2,s1);
while(s1[i]!='\0')
{ if (s1[i]>='A' && s1[i]<='Z')
s1[i]='A'+26-(s1[i]-'A'+1);
if (s1[i]>='a‘ && s1[i]<='z‘ )
s1[i]='a'+26-(s1[i]-'a'+1);
i++;
}
printf("miwen is:");
puts(s1);
printf("yuanwen is:");
puts(s2);
}
7.15 字符数组赋复制
不用 strcpy函数。
解题思路:
( 1)输入字符数组 s2;
( 2)用循环语句将 s2中字符复制到字符数组
s1中;
( 3)输出字符数组 s1。
#include <stdio.h>
void main()
{ char s1[20],s2[20];
int i;
printf("\ninput a string to s2:");
gets(s2); i=0;
while(s2[i]!='\0')
{ s1[i]=s2[i]; i++; }
s1[i]='\0';
printf("output s1's string:");
puts(s1);
}