课程总结报告
1●水仙花数
题意:求范围内水仙花数。
思路:①运用while循环,输入多组数据。
②用条件语句分情况讨论。
注意点:①用求余方法分别求出个、十、百位上的数字。
②两种特殊请况:1.只有一个数字时不加空格。
2.没有水仙花数时输出no。
代码:#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m,n,i,x,y,z,a;
while(cin>>m>>n)
{
int c=0;
for(i=m;i<=n;i++)
{
x=i%10;
y=i/10%10;
z=i/100;
a=x*x*x+y*y*y+z*z*z;
if(a==i)
{c++;
if(c==1)
cout<<a;
else
cout<<" "<<a;
}
}
if(c==0)
cout<<"no";
cout<<endl;
}
return 0;
}
题解:一般地,输入函数,应与头文件对应,外循环用while语句对变量进行循环,然后用增1运算符改变数字,用if -else语句对条件控制,输出的结果。
2●素数
题意:判断满足表达式n^2+n+41的值是否全为素数。
思路:利用while外循环,if-else语句分情况讨论,利用题中表达式以及特殊条件,运用素数判断方法。
注意点:①特殊情况直接跳出。
②素数判断的方法
代码:#include<cstdio>
using namespace std;
int main()
{
int x,y,a,b,c;
while(scanf("%d%d",&x,&y))
{
if(x==0&&y==0)
break;
for(int i=x;i<=y;i++)
{
b=0,c=0;
a=i*i+i+41;
for(int j=2;j<a;j++)
if(a%j==0)
{
b=1;
break;
}
if(b==1)
break;
}
if(b==1)
printf("Sorry\n");
else
printf("OK\n");
}
return 0;
}
题解:以while语句为大循环,进行循环嵌套,由于素数判断的前提是满足表达式,故素数判断应放在循环内。
3●编程计算
题意:利用编程计算求A1的值。
思路:通过题给表达式推出A1表达式,通过循环嵌套一步步定义。
注意点:①双精度实型应用double。
②先求出表达式,后用编程语言表示。
③赋值号的运用,换行。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
double C,A0,B,sum;
while(cin>>n)
{
cin>>A0>>B;
sum=B+n*A0;
for(int i=n;i>=1;i--)
{
cin>>C;
sum=sum-2*C*i;
}
sum=sum/(n+1);
printf("%.2f\n",sum);
}
return 0;
}
题解:关键在于应用数学求出表达式,在编译成代码。
4●数组
题意:上M阶台阶有多少种走法。
思路:定义数组,给数组赋值,找出递增规律,带入循环。
注意点:采用动态规划算法。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int a[100];
int main()
{
a[1]=0;
a[2]=1;
a[3]=2;
for(int i=4;i<=40;i++)
a[i]=a[i-1]+a[i-2];
int n,m;
cin>>n;
for(int j=1;j<=n;j++)
{
cin>>m;
cout<<a[m]<<endl;
}
return 0;
}
题解:考虑n阶台阶最后一次,走一步的话,前面就是m[n-1]种走法,走两步的话,前面就是m[n-2]种走法。
公式就是m[n]=m[n-1]+m[n-2]。
5●亲和数
题意:判断所给的两个数是否为亲和数。
思路:利用for循环求其约数。
注意点:约数包括1,不包括其自身。运用减1运算,递减运算。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,j,M,A,B,sum;
cin>>M;
while(M--){
sum=0;
cin>>A>>B;
for(i=1;i<A;i++)
{
if(A%i==0)
{
sum+=i;
}
}
if(sum==B)
{
cout<<"YES";
}
else
{
cout<<"NO";
}
cout<<endl;}
return 0;
}
题解:对于每一组数据,对两个分别利用for循环求出它们包括1在内不包括自身的所有约数,然后求出和判断是否相等。
6●进制转换
题意:将十进制数转化为R进制
思路:运用递归方法运算。
注意点:注意进制之间如何转化。
代码:#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n,r,i;
while(cin>>n>>r)
{
if(n<0)
{
cout<<"-";
n=-n;
}
if(n==0)
{
cout<<'0'<<endl;
continue;
}
int c=0,a[100];
while(n)
{
a[c]=(n%r);
c++;
n/=r;
}
for(i=c-1;i>=0;i--)
{
if(a[i]>=10)
{
printf("%c",'A'+a[i]-10);
}
else cout<<a[i];
}
cout<<endl;
}
return 0;
}
题解:首先,我们要弄明白十进制的数是怎样转化为R进制的,然后再来谈程序语言的实现。
十进制的数转成二进制,最常用的方法,就是除R取余法,将十进制的数n除以R取其余数,这里得到的余数是R进制数的最后一位。比如:7转化为2进制,先用7%2得到的是1,这里的1是转化后的二进制数的最后一位,再接着,令n=n/R,即为除得的整数结果(注意,这里的n需要大于0,因为后续会产生重复的操作),同上例n=7/2=3;再同以上的方法将,3%2=1作为2进制数的倒数第二位。以此类推,2进制数的倒数第三位等于3/2%2=1;这时n=0了,循环到此终止,二进制的数为111(注意是从第1位读到最后一位),即是说,代码实现时需要逆序输出(这里很容易想到用数组来存取每一个余数)。逆序输出我们很熟悉,若R进制的数共有X位,令n=X-1;n往下移动一位一直到n=0,对数组进行输出。for循环可以方便的实现。到此一个十进制的数转化成10进制以内任意R进制功能就实现了。
在接下来,考虑11到16进制的转化,很明显,因为有了字母的引入。不能直接对于数组进行直接的输出。这里,可以使用switch case 或者是if语句。倒顺序的每次判断均输出一个结果,输出结束别忘了加上\n换行。
7●回文串
题意:输出正读和反读一样的字符串
思路:运用递归,循环,动态规划
注意点:正读反读相同
代码:#include<cstdio>
#include<string.h>
int main(){
int n,i,len,j;
char s[100];
scanf("%d",&n);
getchar();
while(n--){
gets(s);
len=strlen(s);
i=0;j=len-1;
while(i<j){
if(s[i]!=s[j])
break;
i++;
j--;
}
if(i>=j)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
题解:从中间向两边扩展。
8●数组
题意:输出第n年母牛数量
思路:递推公式:第n年成年母牛=第n-1年成年母牛+第n-3年小牛的数量;
注意点:递推。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int a[55];
int main()
{
int n;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
for(int i=5;i<=55;i++)
{
a[i]=a[i-1]+a[i-3];
}
while(cin>>n)
{
if(n==0)
break;
else
cout<<a[n]<<endl;
}
return 0;
}
题解:递推公式:第n年成年母牛=第n-1年成年母牛+第n-3年小牛的数量;
9●字符串
题意:字符三角形
思路:每个样板三角形之间应空上一行,三角形的中间为空。
注意点: 注意两个输出之间是有换行了,也就是多一个换行。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char a;
int b,j,i,flag=1;
while(cin>>a)
{
if(a=='@') break;
else
{
cin>>b;
if(flag)
flag=0;
else
cout<<endl;
for(i=1;i<=b;i++)
{
if(i==b)
{
for(j=1;j<=2*b-1;j++) cout<<a;
}
else
{
for(j=1;j<=2*b-1;j++)
{
if(j==b+1-i||j==b+i-1) cout<<a;
else if(j<b+i-1) cout<<" ";
else break;
}
}
cout<<endl;
}
}
}
return 0;
}
题解:每个样板三角形之间应空上一行,三角形的中间为空。
10●求值
题意:求后两位数值
思路:求出后两位的值,假设未知数加到给的数字上,再整除给定的数
注意点:格式和for语句
代码:#include<iostream>
using namespace std;
int main()
{
int a,b,i,c;
while(cin>>a>>b)
{
c=0;
if((a==0)&&(b==0))
{
break;
}
a=a*100;
for(i=0;i<100;i++)
{
if((a+i)%b==0)
{
c=c+1;
if(c==1)
{
if(i<10)
{
cout<<0<<i;
}
else
{
cout<<i;
}
}
else
{
if(i<10)
{
cout<<" "<<0<<i;
}
else
{
cout<<" "<<i;
}
}
}
}
cout<<endl;
}
return 0;
}
题解:求出后两位的值,假设未知数加到给的数字上,再整除给定的数。
11●素数
题意:将一个偶数拆成两个素数和。
思路:把小于n/2的素数i都求出来,然后求对应的n-i是不是素数
注意点:素数的表达。
代码:#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,s,a[10000];
for(int i=3;i<=10000;i++)
{
a[i]=i;
}
for(int i=2;i<=10000;i++)
for(int j=2*i;j<=10000;j+=i)
{
a[j]=0;
}
while(scanf("%d",&n)!=EOF&&n)
{
s=0;
for(int i=3;i<n/2;i++)
{
if(a[i]+a[n-i]==n)
s++;
}
cout<<s<<endl;
}
return 0;
}
12●进制转换
题意:将数转化为不同进制
思路:利用不同进制关系转化。
注意点:进制直接转化值不同。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,s1,s2,s3;
while(cin>>n&&n!=0)
{
s1=n%10+(n/10)%10+(n/100)%10+n/1000;
s2=n%12+(n/12)%12+(n/144)%12+n/1728;
s3=n%16+(n/16)%16+(n/256)%16+n/4096;
if(s1==s2&&s2==s3)
{
cout<<n<<" ";
cout<<"is a Sky Number."<<endl;
}
else
{
cout<<n<<" ";
cout<<"is not a Sky Number."<<endl;
}
}
return 0;
}
13●运算
题意:分别表示整数的和与积。
思路:运用for循环,if条件句分情况讨论
注意点:为零时的特殊情况。
代码:#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,m,a,s;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
s=0;
for(int i=-9999;i<n/2;i++)
{
a=n-i;
if(a*i==m)
{
s++;
cout<<"Yes";
break;
}
}
if(s==0)
cout<<"No";
cout<<endl;
}
return 0;
}
14●数列
题意:将一个整数x插入已知数列
思路:第一步:如果m的值比最后一个值都要大,显而易见,m就成为数组的最后一位数。
第二步:如果m的值不比最后一个值大,通过i的值来控制m和数组中的每一个数来比较,直到m的值大于数组中值时,就把m的值赋值给该数的下一位,插入进去。
注意点:数列有序。
代码:#include<stdio.h>
int main()
{
int n, m, str[100], i;
while(scanf("%d %d", &n, &m)!=EOF){
if(n<0 || n>100){
continue;
}
else if(n==0 && m==0){
break;
}
else{
for(i=0; i<n; i++){
scanf("%d", &str[i]);
}
for(i=0; i<n; i++){
if(str[i]<=m){
if(i==(n-1)){
printf("%d\n", m);
}
else{
printf("%d ", str[i]);
}
}
if(m<str[i]){
printf("%d ", m);
for(; i<n; i++){
if(i==(n-1)){
printf("%d\n", str[i]);
}
else{
printf("%d ", str[i]);
}
}
break;
}
}
}
}
return 0;
}
15●求幂次
题意:求A^B最后三位表示的整数
思路:采用循环相乘求解,这样效率不算太高。根据公式 m ^ ( x + y ) = m ^ x * m ^ y 对指数进行二分,再结合递归求解。
注意点:循环结构,递归求解。
代码:#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a,b,i,p;
while(cin>>a>>b)
{
if(a==0&&b==0) break;
p=a%1000;
a=1;
for(i=1;i<=b;i++)
{
a=a%1000;
a=a*p;
}
printf("%d\n",a%1000);
}
return 0;
}
本课程总结:
C语言特点
1、语言简洁、紧凑,使用方便灵活
2、运算符丰富
3、数据结构丰富,具有现代化语言的各总数据结构
4、具有结构化的控制语句
5、语法限制不太严格,程序设计自由度大
6、C语言允许直接访问物理地址,可实现汇编语言的大部分功能
7、生成目标代码的质量高,程序执行效率高
8、程序可执行性好
C语言程序结构
1.C程序是由函数构成的。一个C源程序至少包含一个主函数(main或主程序)和若干个其它函数(子函数或子程序)
2.一个函数由两部分程序组成:说明部分和函数体
3.一个C程序总是从main函数开始执行,不论main函数放在程序中的什么位置。程序的流程是通过主函数main调用其它子函数,或子函数间的相互调用
4.C程序书写格式自由,一行内可以写多条语句,但每一语句必须用分号(“;”)结束
5.C语言本身没有输入/输出语句,而是用函数完成相应操作