1. 比较交换3个实数值,并按序输出
从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。末尾输出换行。
#include<stdio.h>
int main(){
double a,b,c,t;
scanf("%lf %lf %lf",&a,&b,&c);
if(a>b){
t=a;
a=b;
b=t;
}
if(a>c){
t=a;
a=c;
c=t;
}
if(b>c){
t=b;
b=c;
c=t;
}
printf("%.2f %.2f %.2f\n",a,b,c);
return 0;
}
2. 三个整数求最大值
有3个整数a, b, c,由键盘输入,输出其中最大的数。
#include<stdio.h>
#define DA(a,b) ((a)>(b)?(a):(b))
int main(){
int a,b,c,t,m;
scanf("%d %d %d",&a,&b,&c);
t=DA(a,b);
m=DA(t,c);
printf("%d\n",m);
return 0;
}
3. 求圆周率pi的近似值
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
#include <stdio.h>
#include <math.h>
int main() {
double PI, i, n=0, sum=0;
for(i=1; ; i++) {
n = 1/(2*i-1); //第 i 项的值
if(n <= pow(10,-6)) {
printf("PI=%10.8f", PI);
return 0;
}
sum = sum-pow(-1,i)*n; // i项累加的结果
PI = sum * 4.0; // PI的值
}
return 0;
}
4. Fibonacci数列
输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。要求输入的正整数n不超过50.
#include <stdio.h>
#include <math.h>
int fib(int n){
if(n<0||n>50) return 0;
if(n==1||n==2){
return 1;
}
int a=1,b=1;
int sum=2;
for(int i=3;i<=n;i++){
sum=a+b;
a=b;
b=sum;
}
return sum;
}
int main() {
int n;
scanf("%d",&n);
int f=fib(n);
printf("%d\n",f);
return 0;
}
5. 分数序列求和
求出次数列的前20项之和。
请将结果的数据类型定义为double类型。
#include <stdio.h>
#include <math.h>
int main() {
double a[21]={1,2};
double sum=0.0;
for(int i=2;i<21;i++){
a[i]=a[i-1]+a[i-2];
}
for(int j=0;j<20;j++){
sum+=(a[j+1]/a[j]);
}
printf("%.6f\n",sum);
return 0;
}
6. 有序插入
有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。
#include <stdio.h>
int main() {
int a[10];
int n;
for(int w=0;w<9;w++){
scanf("%d ",&a[w]);
}
scanf("%d",&n);
int i=0,j;
for(;i<10;i++){ //位于a[j]
if(n>a[i]) continue;
j=i;
break;
}
for(int t=8;t>=j;t--){
a[t+1]=a[t];
}
a[j]=n;
for(int q=0;q<10;q++){
printf("%d\n",a[q]);
}
return 0;
}
7. 数组元素逆置
将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1
#include <stdio.h>
int main() {
int a[10]={0};
for(int w=0;w<10;w++){
scanf("%d",&a[w]); //%d后不能有空格!
}
for(int j=0;j<5;j++){
int temp=a[j];
a[j]=a[9-j];
a[9-j]=temp;
}
for(int i=0;i<10;i++){ //位于a[j]
printf("%d\n",a[i]);
}
return 0;
}
#include <cstdio>
#include <cstring>
int main()
{
int a[10];
for(int i=0;i<=9;i++){
scanf("%d",&a[i]);
}
for(int b=9;b>=0;b--){ //直接倒着输出
printf("%d\n",a[b]);
}
return 0;
}
8. 杨辉三角
#include <cstdio>
int main(){
int n;
scanf("%d",&n);
int i,j,a[n][n];
for (i=0;i<n;i++){
a[i][i]=1;
a[i][0]=1;
}
for (i=2;i<n;i++){
for (j=1;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for (i=0;i<n;i++){
for (j=0;j<=i;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
9. 解密
65–90:A–Z
97–122:a–z
相差32
#include <cstdio>
#include <cstring>
int main()
{
char a[20];
scanf("%s",a);
for(int i=0;i<strlen(a);i++)
{
if(a[i]>=65&&a[i]<=90) //A--Z
a[i]=26-(a[i]-65)+64;
else if(a[i]>=97&&a[i]<=122) //a--z
a[i]=26-(a[i]-97)+96;
}
printf("%s",a);
return 0;
}
10. 字符串比较
#include <cstdio>
#include <cstring>
int main()
{
char a[20],b[20];
gets(a); //输入字符串,会换行
gets(b);
int sum=0;
int min=strlen(a)>strlen(b)?strlen(b):strlen(a); //strlen
for(int i=0;i<=min;i++)
sum+=a[i]-b[i];
printf("%d",sum);
return 0;
}
11. 冒泡排序
#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
int str[10]={};
for(int i=0;i<10;i++){
scanf("%d",&str[i]);
}
for(int a=1;a<=9;a++){ //9趟排序
for(int b=0;b<=9-a;b++){
if(str[b]>=str[b+1]){
int temp=str[b];
str[b]=str[b+1];
str[b+1]=temp;
}
}
}
for(int j=0;j<10;j++){
printf("%d\n",str[j]);
}
return 0;
}
12. 字符串求最大值
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
char a[3][10];
for(int i=0;i<3;i++)
gets(a[i]);
int max=0;
for(int i=1;i<3;i++)
if(strcmp(a[max],a[i])<=0)
max=i;
printf("%s",a[max]);
return 0;
}
13. 输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理
#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
char a[20],b[20],c[20];
char *p=a,*q=b,*r=c;
scanf("%s%s%s",a,b,c);
printf("%s\n%s\n%s\n",strcmp((strcmp(p,q)>0?q:p),r)<0?(strcmp(p,q)>0?q:p):r,
strcmp((strcmp(p,q)>0?p:q),r)>0?(strcmp((strcmp(p,q)>0?q:p),r)>0?(strcmp(p,q)>0?q:p):r):(strcmp(p,q)>0?p:q),
strcmp((strcmp(p,q)>0?p:q),r)>0?(strcmp(p,q)>0?p:q):r);
return 0;
}
14. 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
#include <iostream>
using namespace std;
int a[10]={0};int i;
void get(int a[10])
{
for(i=0;i<10;i++)
cin>>a[i];
}
void change(int a[10]) //设置min max变量,与10个数依次比较大小
{
int max,min,temp;min=a[0];max=a[0];int t=0;
for(i=0;i<10;i++)
{
if(min>=a[i])
{
min=a[i];
t=i;
}
}
temp=a[t];
a[t]=a[0];
a[0]=temp; //a[0]已是最小值
for(i=0;i<10;i++)
{
if(max<=a[i])
{
max=a[i];
t=i;
}
}
temp=a[t];
a[t]=a[9];
a[9]=temp; //a[9]已是最大值
}
void out(int a[10])
{
for(i=0;i<10;i++)
cout<<a[i]<<" ";
}
int main()
{
get(a);
change(a);
out(a);
}
15. 完成一个对候选人得票的统计程序。假设有3个候选人,名字分别为Li,Zhang和Fun。使用结构体存储每一个候选人的名字和得票数。记录每一张选票的得票人名,输出每个候选人最终的得票数。
类型为 double 的包含 10 个元素的数组 balance double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。
#include <cstdio>
#include <cstring>
struct person
{
char name[20];
int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main()
{
int n;
scanf("%d",&n);
char name[100][10]; //明白要用二维数组,但不知道为什么name[100][1]也正确?
for(int i=0;i<n;i++)
scanf("%s",name[i]);
for(int i=0;i<n;i++)
if(strcmp(name[i],leader[0].name)==0)
leader[0].count++;
else if(strcmp(name[i],leader[1].name)==0)
leader[1].count++;
else if(strcmp(name[i],leader[2].name)==0)
leader[2].count++;
for(int i=0;i<3;i++)
printf("%s:%d\n",leader[i].name,leader[i].count);
return 0;
}
16. 定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。本题要求使用指向结构体数组的指针进行输入和输出。
#include<stdio.h>
#include<string.h>
struct student {
int num;
char name[20];
char sex;
int age;
};
int main()
{
int n;
scanf("%d",&n);
student stu[20];
for(int i=0;i<n;i++)
scanf("%d %s %c %d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].age);
struct student *p=&stu[0];
for(int i=0;i<n;i++)
printf("%d %s %c %d\n",(p+i)->num,(p+i)->name,(p+i)->sex,(p+i)->age);
return 0;
}
17. 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。读入这10个学生的数据,要求输出3门课程的总平均成绩,以及个人平均分最高的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
#include<stdio.h>
#include<string.h>
struct student{
int num;
char name[10];
int grade[3];
double average;
}stu[10];
void input(){
for(int i=0;i<10;i++){
scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
stu[i].average=(stu[i].grade[0],stu[i].grade[1],stu[i].grade[2])/3;
}
}
void output(){
double a=0,b=0,c=0;
int max=0;
for(int i=0;i<10;i++){
a+=double(stu[i].grade[0]);
b+=double(stu[i].grade[1]);
c+=double(stu[i].grade[2]);
if(i!=0)
{if(stu[i].average>stu[max].average)
max=i-1; //并不知道为什么要-1,猜测是因为数组,目前还没搞懂
}
}
printf("%.2f %.2f %.2f\n",a/10,b/10,c/10);
printf("%d %s %d %d %d\n",stu[max].num,stu[max].name,stu[max].grade[0],stu[max].grade[1],stu[max].grade[2]);
}
int main()
{
input();
output();
return 0;
}