【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;
else
return 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);
else
printf("%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);
}