1.打印菱形
法一:分成两部分打印,上端打印完成即打印下端
描述
由键盘输入正数n(n<30),要求输出如下2*n+1行的菱形图案。
输出格式
菱形右边不留多余空格
输入样例
2
输出样例
*
//1.打印菱形
//由键盘输入正数n(n<30),要求输出如下2*n+1行的菱形图案。
/*
*
***
*****
*** j=0,n=2,i=2*n-1
*
*/
//由图可知
/*应该要用两个变量,一个控制行,一个控制列,i,j
**如果用i控制行,此时n为2,那么第一行(i=0)就是n-i个空格,有2*i+1个星号
**第二行:(i=1),有n-i个空格,有2*i+1个星号
**第三行无空格,i=2,2*+1个星号
**至于下端,那么初始i=n-1,那么下端的第一行应该是n-i个空格,会有2*i+1个星号
**
**
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i,j,n;
scanf("%d",&n);
for(j=0;j<n;j++)
{
for(i=0;i<n-j;i++)
{
printf(" ");
}
for(i=0;i<2*j+1;i++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<2*n+1;i++)
{
printf("*");
}
printf("\n");
for(j=0;j<n;j++)
{
for(i=0;i<j+1;i++)
{
printf(" ");
}
for(i=0;i<2*(n-j)-1;i++)
{
printf("*");
}
printf("\n");
}
return 0;
}
链表的合并
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LEN sizeof(struct student)
struct student
{
long num;
int score;
struct student *next;
};
struct student *create(int n)//参数表表示的是链表的长度,需要多长的链表
{
struct student *head=NULL,*p1=NULL,*p2=NULL;
for(int i=1;i<=n;i++)
{
p1=(struct student*)malloc(LEN);
scanf("%ld",&p1->num);
scanf("%d",&p1->score);
p1->next=NULL;
if(i==1)
{
head=p1;//如果这个表是空的,那么头结点就是现在读入数据的结点
}
else
{
p2->next=p1;//p2相当于一个中间变量,每次新建一个结点的时候,都会出现p2,
//p2的作用是用p2内置的指针域指向现在所创建的结点
//比如说第一次新建的结点是p_first 然后赋给了头结点 最后也赋给了p2,这时候p2内的内容就和p_first里面的内容一模一样
//之后,第二次新建的结点是p_seconde,然后赋给了p2->next,p2->next代表的是调用了p_first内的指针域
//来指向目前的结点,而我们在这里再重新统观全局,p_first和p_second就被连接起来了
//为了方便理解,再引入第三个结点,这时候p2是p_second,p_first和p_second已经通过指针链接起来了
//p_second调用内置指针域来指向p_third,又链接起来了,由此可以理解p2=p1是下次链接的准备工作
}
p2=p1;//最后是把p1的地址赋给了p2
}
return (head);
}
struct student *merge(struct student *head,struct student *head2)//参数表里面分别是两个链表的头尾
{
struct student *p=NULL;
p=head;
if(head==NULL)
{
return head2;
}
while(p->next!=NULL)
{
p=p->next;
}
p->next=head2;
return (head);
}
void print(struct student *head)
{
struct student *p=NULL;
p=head;
while(p!=NULL)
{
printf("%8ld%8d",p->num,p->score);
p=p->next;
printf("\n");
}
}
int main()
{
struct student *head, *head2;
int n;
long del_num;
scanf("%d",&n);
//依次输入学生个数,然后读入数据
head=create(n);
print(head);
scanf("%d",&n);
head2=create(n);
print(head2);
head = merge(head, head2);
print(head);
return 0;
}
学生信息统计
输入10个学生5门课的考试成绩,分别用函数实现以下功能:
(1) 计算一个学生的平均分。
(2) 计算每门课程的平均分。
(3) 找出每门课程的最高分。
显示结果,显示两位小数。
#include <stdio.h>
void average(double a[][5], int n)
{
}
void average2(double a[][5], int n)
{
}
void top(double a[][5], int n)
{
}
int main()
{
double a[10][5];
int i, j;
for(i=0; i<10; i++)
for(j=0; j<5; j++)
scanf("%lf", &a[i][j]);
average(a,10);
average2(a,10);
top(a,10);
return 0;
}
全部代码
#include <stdio.h>
void average(double a[][5], int n) //学生的平均分
{
int i,j;double sum=0;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
sum=sum+a[i][j];
}
printf("%.2lf ",sum/5.0);
sum=0;
}
printf("\n");
}
void average2(double a[][5], int n)
{
double sum=0;int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
sum=sum+a[j][i];
}
printf("%.2lf ",sum/10.0);
sum=0;
}
printf("\n");
}
void top(double a[][5], int n)
{
int i,j,k;
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<9;k++)
{
if(a[k][i]>a[k+1][i])
{
double temp=0;
temp=a[k][i];
a[k][i]=a[k+1][i];
a[k+1][i]=temp;
}
}
}
}
for(i=0;i<5;i++)
{
printf("%.2lf ",a[9][i]);
}
printf("\n");
}
int main()
{
double a[10][5];
int i, j;
for(i=0; i<10; i++)
for(j=0; j<5; j++)
scanf("%lf", &a[i][j]);
average(a,10);
average2(a,10);
top(a,10);
return 0;
}
统计不同数字的个数
描述
由键盘输入20个整数,统计不同数字的个数。
输入样例
70 5 14 22 19 2 99 67 13 66 5 93 44 38 22 11 39 22 33 11
输出样例
16
Hint
因为5有1个重复数字,11有1个重复数字,22有2个重复数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main()
{
int a[20]={0};
int i,j,count=0;
for(i=0;i<20;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<20;i++)
{
int target=a[i],index=i;
for(j=index;j<20;j++)
{
if(j==index)
{
continue;
}
if(target==a[j])
{
break;
}
}
if(j==20)
{
count++;
}
}
printf("%d",count);
return 0;
}
找鞍点
描述
由键盘输入一个3*4(3行4列)的数字矩阵,其中任意两个数字均不相同。要求输出该数字矩阵中的鞍点(即在矩阵行中最大,列中最小的数)。
若没有鞍点,输出“NO”字样。
输入样例
87 90 110 98
70 97 210 65
99 45 120 30
输出样例
110
#in clude <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
/*
由键盘输入一个3*4(3行4列)的数字矩阵,其中任意两个数字均不相同。
要求输出该数字矩阵中的鞍点(即在矩阵行中最大,列中最小的数)。
若没有鞍点,输出“NO”字样。
*/
int main()
{
int a[3][4]={0};
int i,j,flag=-1;
int answer=-1;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
int max=0;
for(i=0;i<3;i++)
{
flag=-1;
int maxnum=a[i][0];
for(j=0;j<4;j++)
{
if(a[i][j]>maxnum)
{
maxnum=a[i][j];
max=j;
}
}
flag=-1;
for(j=0;j<3;j++)
{
if(a[i][max]>a[j][max])
{
flag=1;
break;
}
}
if(flag==1)
{
continue;
}
else
{
answer=a[i][max];
break;
}
}
if(answer>0)
{
printf("%d",answer);
}
else
{
printf("NO");
}
return 0;
}
```c
#include <stdio.h>
int sort(int a[], int n)
{
int i,j,k,tmp;
for(i=0;i<n-1; i++)
{
k=i;
for(j=k+1;j<10;j++)
if(a[i]>a[j]) k=j;
tmp=a[k];a[k]=a[i];a[i]=tmp;
}
}
int main()
{
int a[10];
int i;
for(i=0; i<10; i++) scanf("%d", &a[i]);
sort(a,10);
for(i=0; i<10; i++) printf("%d\n", a[i]);
return 0;
}
二维数组每行中的最大值
#include <stdio.h>
void find(int a[][4])
{
int (*p)[4], *q, *max;
for()
{
max=*p;
for()
{
}
printf("%d\n", *max);
}
}
int main()
{
int a[4][4],i,j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d", &a[i][j]);
find(a);
return 0;
}
数字交换
输入10个整数,把其中最小的数与第一个数交换,最大的数与最后一个数交换。使用3个函数解决问题:
(1) 输入10个整数的函数
(2) 进行交换处理的函数
(3) 输出10个数的函数
输入格式
输入10个整数
输出格式
输出结果,一行一个数字
输入样例
2 1 3 4 5 6 7 8 9 0
输出样例
input done
swap done
0
1
3
4
5
6
7
8
2
9
display done
#include <stdio.h>
void input(int a[])
{
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
}
void swap(int a[])
{
int i,temp,index_min=0,index_max=9;
int min=a[0],max=a[9];
for(i=1;i<10;i++)
{
if(a[i]<min)
{
min=a[i];
index_min=i;
}
}
temp=a[0];
a[0]=a[index_min];
a[index_min]=temp;
for(i=8;i>=0;i--)
{
if(a[i]>max)
{
max=a[i];
index_max=i;
}
}
temp=a[9];
a[9]=a[index_max];
a[index_max]=temp;
}
void display(int a[])
{
int i;
for(i=0; i<10; i++)
printf("%d\n", a[i]);
}
int main()
{
int a[10];
input(a);
printf("input done\n");
swap(a);
printf("swap done\n");
display(a);
printf("display done\n");
return 0;
}
矩阵的行与行交换 列与列交换
输入格式
输入一个4*4矩阵
输出格式
输出经过变换的矩阵
输入样例
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出样例
6 8 5 7
14 16 13 15
2 4 1 3
10 12 9 11
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp=*a;*a=*b;*b=temp;
}
void col(int a[][4], int i, int j)
{
for(int k=0;k<4;k++)
{
swap(&a[k][i],&a[k][j]);
}
}
void row(int a[][4], int i, int j)
{
for(int k=0;k<4;k++)
{
swap(&a[i][k],&a[j][k]);
}
}
int main()
{
int a[4][4];
int i,j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d", &a[i][j]);
col(a,0,2);
row(a,0,2);
col(a,1,3);
row(a,1,3);
col(a,0,3);
row(a,0,3);
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
printf("%d “, a[i][j]);
printf(”\n");
}
return 0;
}
学生成绩表
输入格式
10个学生信息,每行一个学生
输出格式
如题
输入样例
1 aaa 50 60 70
2 bbb 50 50 50
3 ccc 60 70 80
4 ddd 40 40 40
5 eee 70 80 90
6 fff 30 30 30
7 ggg 80 90 100
8 hhh 20 20 20
9 iii 100 100 100
10 jjj 10 10 10
#include <stdio.h>
struct data
{
int num;
char name[10];
double score[3];
double average;
};
int main()
{
int i,j;
struct data stu[10],tmp;
for(i=0; i<10; i++)
{
scanf("%d",&stu[i].num);
scanf("%s",stu[i].name);
scanf("%lf%lf%lf",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
for(i=0; i<9; i++)
for(j=0; j<9-i; j++)
{
if(stu[j].average<stu[j+1].average)
{
tmp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=tmp;
}
}
for(i=0; i<10; i++)
{
printf("%d %s %.0lf %.0lf %.0lf\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
}
return 0;
}
判断点是否在圆上
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
double x,y;
scanf("%lf,%lf",&x,&y);
if(fabs(sqrt(x*x+y*y)-1)<1e-3)
{
printf("Y");
}
else
{
printf("N");
}
}
找出3个数中最大的数
主要是冒泡排序容易写错
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int a[3]={0};
for(int i=0;i<3;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("%d",a[2]);
}
判断平方数
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int x;
scanf("%d",&x);
if((int)sqrt(x)*(int)sqrt(x)==x)
{
printf("Y");
}
else
{
printf("N");
}
}
分期还款(加强版)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/*
从银行贷款金额为d,准备每月还款额为p,月利率为r。
请编写程序输入这三个数值,计算并输出多少个月能够还清贷款,输出时保留1位小数。
如果无法还清,请输出“God”
*/
//输入格式
//三个数,分别为货款金额、每月还款和月利率,以空格分隔,均为非负数,其中d,p,r>=0
int main()
{
double d,p,r;
scanf("%lf%lf%lf",&d,&p,&r);
if(d==0)
{
printf("0.0");
return 0;
}
else
{
if(p-d*r<=0)
{
printf("God\n");
}
if(r==0)
{
printf("%.1lf",d/p);
}
else
{
printf("%.1lf",log(p/(p-d*r))/log(r+1));
}
}
return 0;
}
简单计算器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
float a,b,c;char op;
scanf("%f%c%f",&a,&op,&b);
switch(op)
{
case'+':
{
c=a+b;break;
}
case'-':
{
c=a-b;break;
}
case'*':
{
c=a*b;break;
}
case'/':
{
if(b==0)
{
printf("error");
exit(0);
}
else
{
c=a/b;
break;
}
}
default:printf("error");exit(0);
}
printf("result=%.2f",c);
return 0;
}
20秒后的时间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
int hour,minute,sec;
scanf("%d:%d:%d",&hour,&minute,&sec);
if(sec+20<60)
{
printf("%02d:%02d:%02d",hour,minute,sec+20);
return 0;
}
if(sec+20>=60)
{
if(minute+1<60)
{
printf("%02d:%02d:%02d",hour,minute+1,sec+20-60);
}
if(minute+1>=60)
{
if(hour+1>=24)
{
printf("00:00:%02d",sec+20-60);
}
if(hour+1<24)
{
printf("%02d:%02d:%02d",hour+1,minute+1-60,sec+20-60);
}
}
}
return 0;
}
计算阶乘
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
int i,n,sum=1;scanf("%d",&n);
for(i=n;i>0;i--)
{
sum=i*sum;
}
printf("%d",sum);
return 0;
}
求最大公约数(理解迭代法)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
int m,n;scanf("%d,%d",&m,&n);
int max=0,min=0;
if(m>n)
{
max=m;
min=n;
}
else
{
max=n;
min=m;
}
while(min!=0)
{
int temp=min;
min=max%min;
max=temp;
}
printf("%d",max);
return 0;
}
百万富翁
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
/*
一个百万富翁遇到一个陌生人,陌生人找他谈了一个换钱的计划。该计划如下:我每天给你m元,
而你第一天只需给我一分钱。第二天我仍给你m元,你给我2分钱。第三天,我仍给你m元,
你给我4分钱。依次类推,你每天给我的钱是前一天的两倍,直到一个月(30天)。
百万富翁很高兴,欣然接受这个契约。现要求,编写一个程序,由键盘输入m,
计算多少天后,百万富翁开始亏钱。
*/
int main()
{
int day=0;
double pay=0.01,get=0,sum=0;
int m;scanf("%d",&m);
while(1)
{
get=m-pay;
sum=sum+get;
pay*=2;
day++;
if(sum<0)
{
break;
}
}
printf("%d",day);
return 0;
}
计算自由落体(迭代法)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
//一个球从100米的高度自由落下,每次落地后弹起的原来高度的一半。
//计算并输出第n次落地时,共经过了多少米,第n次弹起的高度是多少?结果显示3位小数。
/*
2 100/2 100+100/2*2
3 100/2/2 100+100/2*2+100/2/2*2
*/
int main()
{
int n;scanf("%d",&n);
double last_height=50,sum=100;
if(n==1)
{
printf("100.000 50.000");
return 0;
}
else
{
for(int i=1;i<n;i++)
{
sum=sum+last_height*2;
last_height/=2;
}
}
printf("%.3lf %.3lf",sum,last_height);
return 0;
}
迭代法求平方根
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
double x1=1,x2=1,a;
scanf("%lf",&a);
x2=(x1+a/x1)/2;
while(fabs(x2-x1)>1e-5)
{
x1=x2;
x2=(x1+a/x1)/2;
}
printf("%.4lf",x2);
return 0;
}
勾股数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
int i,j,k;double temp;
int n;scanf("%d",&n);
for(i=3;i<=n;i++)
{
for(j=i;j<=n;j++)
{
temp=sqrt(i*i+j*j);
{
if((int)sqrt(i*i+j*j)==temp&&temp<=n)
{
k=(int)sqrt(i*i+j*j);
printf("%d %d %d\n",i,j,k);
}
}
}
}
return 0;
}
统计单词个数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main()
{
char ch;
int count=0,word=0;
while((ch=getchar())!='\n')
{
if(!((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')))
{
word=0;
}
else if(word==0)
{
word=1;
count++;
}
}
printf("%d",count);
return 0;
}
链表的倒序
struct student *plat=NULL,*ptemp=NULL,*pfront=NULL;
pfront=head;
while(pfront!=NULL)
{
plat=pfront->next;
pfront->next=ptemp;
ptemp=pfront;
pfront=plat;
}
return ptemp;
链表的排序
struct student *p1,*p2;
p1=head;p2=head;
p2=p2->next;//要注意这两个循环不能调换
p1->next=NULL;
p1=p2;
while(p1->next!=NULL)
{
p2=p2->next;
p1->next=NULL;
head=insert(head,p1);
p1=p2;
}
head=insert(head,p1);
return head;
链表的删除
struct student *del(struct student *head,long num)
{
struct student *p1,*p2;
p1=head;
while(p1!=NULL)
{
if(p1->num == num)
{
if(p1 == head) head=p1->next;
else p2->next=p1->next;
free(p1);
break;
}
p2=p1;
p1=p1->next;
}
return(head);
}
文件
文件-字符读入
(ch=fgetc(fp))!=EOF
文件-字符写入
FILE *fp;char ch;
if((fp=fopen("answer.txt","w"))==NULL)
{
return 1;
}
while((ch=getchar()))
{
fputc(ch,fp);
if(ch=='b')
{
if((ch=getchar())=='y')
{
fputc(ch,fp);
if((ch=getchar())=='e')
{
fputc(ch,fp);
break;
}
}
}
}
fclose(fp);
文件-单词选择排序
char w[10000+5][10+5],tmp[10];int n;
FILE *fp;
if((fp=fopen("case1.in","r"))==NULL)
{
return 1;
}
while(fgets(w[n],10,fp))
{
n++;
}
fclose(fp);
if((fp=fopen("answer.txt","w"))==NULL)
{
return 1;
}
for(int i=0;i<n-1;i++)
{
for(int k=0;k<n-1-i;k++)
{
if(strcmp(w[k],w[k+1])>0)
{
strcpy(tmp,w[k]);
strcpy(w[k],w[k+1]);
strcpy(w[k+1],tmp);
}
}
}
for(int i=0;i<n;i++)
{
fputs(w[i],fp);
}
fclose(fp);
最六的数
#include "stdio.h"
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a[3]={0};
for(int i=0;i<3;i++)
{
scanf("%d",&a[i]);
}
int min=a[0],pre=a[0],now=a[0];
for(int i=0;i<3;i++)
{
now=a[i];
if(abs(now-6)<abs(min-6))
{
min=now;
pre=now;
}
if(abs(now-6)==abs(min-6))
{
if(pre>now)
{
min=now;
pre=now;
}
}
}
printf("%d",min);
}
多个数的最大公约数
#include "stdio.h"
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a[10+5]={0};int n;scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
int min=a[0],max=a[1],answer=0,answer_now=0;
while(min!=0)
{
int temp=min;
min=max%min;
max=temp;
}
answer=max,answer_now=max;
for(int i=0;i<n-1;i++)
{
min=a[i],max=a[i+1];
while(min>0)
{
int temp=min;
min=max%min;
max=temp;
}
answer_now=max;
if(answer_now<answer)
{
answer=answer_now;
}
}
printf("%d",answer);
}
元音字母
#include "stdio.h"
void yuan(char *s,char *s2)
{
int i=0,j=0;
while(s[i]!='\0')
{
if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='o'||s[i]=='O'||s[i]=='i'||s[i]=='I'||s[i]=='U'||s[i]=='u')
{
s2[j++]=s[i++];
}
else
{
i++;
}
}
s2[j]='\0';
}
int main()
{
char str[81], str2[81];
gets(str);
yuan(str,str2);
printf("%s", str2);
}
两个圆是否相交
给出平面坐标中两个圆的圆心坐标与半径,判断这两个圆是否相交(即圆边有交点),是则输出yes,否则输出no。
输入格式
两行,每行三个数,分别为X坐标,Y坐标以及半径
输出格式
yes或no
输入样例
1.1 1.1 1.1
2.2 2.2 1.5
#include "stdio.h"
#include "string.h"
#include <math.h>
int main()
{
double x1,y1,r1;scanf("%lf%lf%lf",&x1,&y1,&r1);
double x2,y2,r2;scanf("%lf%lf%lf",&x2,&y2,&r2);
double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
if(d<=r1+r2&&d>=fabs(r1-r2))
{
printf("yes");
}
else
{
printf("no");
}
}