【1】九九乘法表
- 输出9*9口诀。共9行9列,i控制行,j控制列。
#include <stdio.h>
void main()
{int i,j,result;for (i=1;i<10;i++){ for(j=1;j<i;j++){result=i*j;printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/}printf("\n");/*每一行后换行*/}}
【2】斐波那契数列
//第一种,直接计算
#include<iostream>
using namespace std;
unsigned int Fib(unsigned int n)
{unsigned int fib1 = 1;unsigned int fib2 = 1;unsigned int fib;for(int i=3; i<=n; ++i)//{fib = fib1 + fib2;fib1 = fib2;fib2 = fib;}return fib;
}
void main()
{unsigned int n;cout<<"请输入n:";cin>>n;cout<<"第"<<n<<"项的斐波那契值为:>"<<Fib(n)<<endl;
}
//第二种,递归算法#include<iostream>
using namespace std;
unsigned int Fib(unsigned int n)
{if(n==1 || n==2)return 1;elsereturn Fib(n-1)+Fib(n-2);
}
void main()
{unsigned int n;cout<<"请输入n:";cin>>n;cout<<"第"<<n<<"项的斐波那契值为:>"<<Fib(n)<<endl;
}
【3】判素数
- 判断101-200之间有多少个素数,并输出所有素数及素数的个数。
//思路1
#include <stdio.h>
void main(){
int a=0;//素数个数
int n=0;//输入的整数
printf("enter a int:");
scanf("%d",&n);
for(int i=0;i<n;i++){
if(n%i==0)a++;
if(a==0)printf("%d是素数",n);
elseprintf("%d不是素数",n);
}}
//思路2
#include <stdio.h>
#include <math.h>
void main(){
int n;//输入的整数
int i;//循环
int k;//开根号
printf("enter a int:");
scanf("%d",&n);
k=(int)sqrt((double)n);//sqrt()的参数是double类型
for(i=0;i<=k;i++){
if(n%i==0)break;
}
//如果完成所有循环,那么n为素数
if(i>k){
printf("%d是素数。",n);
}
else
{
printf("%d不是素数。",n);}
}
【4】判完数
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.
- 编程找出1000以内的所有完数。
#include <stdio.h>
void main(){
int n,sum,i;
for(n=1;n<1000;n++){
sum=0;for(i=0;i<n;i++){if(n%i==0) sum+=i;
}if(sum==n) {printf("%4d",n);
}
}
}
【5】数组进行逆时针旋转90度
将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。
#include <stdio.h>
void main(){
int a[4][4],b[4][4],i,j;
printf("enter 16 nums:");
for(i=0;i<4;i++){for(j=0;j<4;j++){scanf("%d",&a[i][j]);b[3-j][i]=a[i][j];
}
}printf("array b:");
for(i=0;i<4;i++){for(j=0;h<4;j++){printf("%d",&b[i][j]);
}
}
}
【6】杨辉三角形
- 输出一个10行的杨辉三角形
#include <stdio.h>
void main(){
int a[10][10],i,j;
a[0][0]=1;
for(i=0;i<10;i++){
a[i][0]=a[0][0];//每行的第一个元素为1
for(j=0;j<=i;j++){
if(j==0) a[i][j]=a[0][0];//判断第一列
else if(i>=1&&j>=1&&(i!=j)){//判断是否为中间元素(不是第一列,也不是最后一列)
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
else if(j==i){//判断是否为最后一列
a[i][j]=a[i-1][j-1];
}
}
}
//输出杨辉三角
for(i=0;i<10;i++){
for(j=0;j<=i;j++){
printf("%5d",a[i][j]);
}
printf("\n");
}
}
【7】求平均成绩
通过键盘输入3名学生4门课程的成绩,
分别求每个学生的平均成绩和每门课程的平均成绩。
要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车
其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。
#include <stdio.h>
void main(){
float a[4][5],s1,s2
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%f",&a[i][j]);
}
}
for(i=0;i<3;i++){
s1=0;
for(j=0;j<4;j++){s1+=a[i][j];
}
a[i][4]=s1/4;
}
for(j=0;j<5;j++){
s2=0;
for(i=0;i<3;i++){s2+=a[i][j];
}
a[3][j]=s2/3;
}
for(i=0;i<4;i++){
for(j=0;j<5;j++){
printf("%6.2f",a[i][j]);
}
printf("\n");
}
}
【8】字符串反序输出
实现输入的字符串反序输出
- 输入windows 输出swodniw
//方法一
#include <stdio.h>
#include <string.h>
void main(){
char c[200],c1;
int i,j,k;
printf("enter a string:");
scanf("%s",c);
k=strlen(c);
for(i=0,j=k-1;i<k/2;i++,j--){
c1=c[i];
c[i]=c[j];
c[j]=c1;
}
printf("%s",c);
}
//方法二:指针
void invert(char *s){
char t;
int i,j,k;
k=strlen(s);
for(i=0,j=k-1;i<k/2;i++,j--){
t=*(s+i);
*(s+i)=*(s+k);
*(s+k)=t;
}
}void main(){
char c[200],*s;
*s=c;
printf("enter a string:");
scanf("%s",c);
invert(s);
printf("%s",c);
}
【9】从字符数组s中删除存放在c中的字符
- 从字符数组s中删除存放在c中的字符
#include <stdio.h>
void main(){
char s[100],c;
int j,k;
printf("enter a string\n");
gets(s);
printf("enter a character");
c=getchar();
for(j=k=0;s[j]!='\0';j++){
if(s[j]!=c){
s[k++]=s[j];
}
s[k]='\0';
}
printf("\n%s",s);
}
【10】数组排序+文件输出
编写一个void sort(int *x,int n)实现将x数组中的n个数据从大到小排序。
n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件p9_1.out中。
#include <stdio.h>
#include <cstdio>
void sort(int *x,int n){
int i,j,k,t;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(x[j]>x[k]) k=j;
}
if(k!=i){
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
void main(){
FILE *fp;
int *p,a[10],i;
p=a;
fp=fopen("p9_1.out","w");
printf("enter 10 nums:");
for(i=0;i<10;i++){
scanf("%d",p++);
}
p=a;
sort(p,10);
for(;p<a+10;p++){
printf("%d",*p);
fprintf(fp,"%d",*p);
}
system("pause");
fclose(fp);
}
【11】插入数组
已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。
#include <stdio.h>void main(){int a[10]={0,1,2,4,5,6,7};//a[0]为工作b单元,从a[1]开始存放数据int x,i,j=6;//j是元素个数printf("enter a num:");scanf("%d",&x);a[0]=x;i=j;//从最后一个单元开始while(a[i]>x)//把比x大的数往后移动一个位置{a[i+1]=a[i];i--;}a[i+1]=x;j++;//插入x后元素总数增加for(i=1;i<=j;i++){printf("%8d",a[i]);}printf("\n");
}
【12】字符替换+文件输出
编写函数replace(char *s,char c1,char c2)实现将s所指向的字符串中所有字符c1用c2替换,字符串、字符c1和c2均在主函数中输入,将原始字符串和替换后的字符串显示在屏幕上,并输出到文件p10_2.out中。
#include <stdio.h>
void replace(char *s,char c1,char c2)
{while(*s!='\0'){if(*s==c1){*s=c2;}s++;}
}
void main(){FILE *fp;char str[100],a,b;if((fp=fopen("p10_2.out", "w"))==NULL){printf("cannot open the file\n");exit(0);}printf("enter a string:\n");gets(str);printf("enter a&&b:\n");scanf("%c,%c",&a,&b);printf("%s\n",str);fprintf(fp, "%s\n",str);replace(str, a, b);printf("The new string is---%s\n",str);fprintf(fp, "The new string is---%s\n",str);fclose(fp);}
【13】查找字符子串
在一个字串s1中查找一子串s2,若存在则返回子串在主串中的起始位置,不存在则返回-1。
#include <stdio.h>int search(char s1[],char s2[]){int i=0,j,len=strlen(s2);while (s1[i]) {for(j=0;j<len;j++){if(s1[i+j]!=s2[j]) break;}if(j>=len) return i;else i++;}return -1;
}void main(){char s1[16]="this is";char s2[5]="is";printf("%d\n",search(s1,s2));
}
【14】用指针变量输出结构体数组元素
用指针变量输出结构体数组元素。
#include <stdio.h>
struct Student{int num;char *name;char sex;int age
}stu[5]={{1001,"liu",'F',18},{1002,"wang",'M',18},{1003,"huang",'F',19},{1004,"sun",'M',18},{1005,"chen",'F',18}};
void main(){int i;struct Student *ps;printf("Num \tName\t\t\tSex\tAge\t\n");//用指针变量输出结构体数组元素for (ps=stu; ps<stu+5; ps++) {printf("%d\t%-10s\t\t%c\t%d\t\n",ps->num,ps->name,ps->sex,ps->age);}//数组下标法输出结构体数组元素学号和年龄for (i=0; i<5; i++) {printf("%d\t%d\t\n",stu[i].num,stu[i].age);}
}
【15】建立链表
建立一个有三个结点的简单链表。
#include <stdio.h>
struct Student{int num;char *name;int age;struct Student *next;
};
void main(){struct Student a,b,c,*head,*p;a.num=1001;a.name="liu";a.age=18;b.num=1002;b.name="wang";b.age=18;c.num=1003;c.name="li";c.age=19;head=&a;a.next=&b;b.next=&c;c.next=NULL;//输出链表p=head;do{printf("%5d,%s,%3d\n",p->num,p->name,p->age);p=p->next;}while(p!=NULL);
}
【16】判断回文字符串
输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。
#include <stdio.h>
#include <string.h>
void main(){char s[100];int i,j,n;printf("输入字符串:");gets(s);n=strlen(s);for(i=0,j=n-1;i<j;i++,j--){if(s[i]!=s[j]) break;}if(i>=j)printf("是回文字符串\n");else printf("不是回文字符串\n");
}
【17】冒泡排序
== 冒泡排序==,从小到大,排序后结果输出到屏幕。
0.如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
…
(3)如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-1-i)次
#include <stdio.h>
void fun(int a[],int n){int i,j,t;for(i=0;i<n-1;i++){//n个数,总共n-1趟排序for (j=0; j<n-1-i; j++) {//每轮比较n-1-i次if (a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}}}
}
void main(){int a[]={6,5,4,3,2,1,0,8,9,7};int n;int i;n=sizeof(a)/sizeof(int);//sizeof返回值以字节为单位fun(a, n);for (i=0; i<n; i++) {printf("%4d",a[i]);}printf("\n");
}
【18】选择排序
算法思想:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
#include <stdio.h>
void main(){int i,j,t,k,a[10]={5,9,3,6,7,8,0,2,1,4};int n;n=sizeof(a)/sizeof(int);for (i=0; i<n-1; i++) {k=i;for (j=i+1; j<n; j++) {if (a[k]>a[j]) {k=j;}}if (k!=i) {t=a[i];a[i]=a[k];a[k]=t;}}for (i=0; i<n; i++) {printf("%4d",a[i]);}printf("\n");
}
【19】计算π的近似值
编写函数countpi,利用公式:
计算π的近似值,当某一项的值小于10-5时,认为达到精度要求。将结果显示在屏幕上。
\Gamma(z) = \int_0^\infty t{z-1}e{-t}dt,.
#include <stdio.h>
double countpi(double eps)//eps:允许误差(某一项的值要小于eps)
{int m=1;double temp=1.0,s=0;while (temp>=eps) {s+=temp;temp=temp*m/(2*m+1);m++;}return (2*s);//s=π/2
}
void main(){double eps=1e-5,pi;pi=countpi(eps);printf("pi=%f\n",pi);
}