2020.9.1 我考上了计算机专业啦!本人是个电脑小白,来记录一下我的成长过程嘿嘿嘿。
给大家分享一下我自己写的小代码叭
目录
PTA
分苹果
一袋苹果有n个,每个孩子子可以分4个苹果,请问可以分给几个孩子,还剩几个苹果?
输入格式:
输入一个正整数表示苹果个数。
输出格式:
输出可以得到苹果的孩子人数和剩余苹果个数,两个数据之间用逗号分隔。
输入样例:
101
输出样例:
25,1
我的代码:
#include <stdio.h>
int main()
{
int applenumber,children,remain;
scanf("%d",&applenumber);
children=applenumber/4;
remain=applenumber%4;
printf("%d,%d",children,remain);
return 0;
}
3人分糖果
幼儿园里,有3个小朋友编号分别是1、2、3,他们按自己的编号顺序围坐在一张圆桌旁,每个小朋友的面前分别有8、9、10颗糖果。现在做一个分糖果游戏,从1号小朋友开始,将自己的糖果平均分成三份(如果有多余的糖果,则自己立刻吃掉),自己留一份,其余两份分给相邻座位的两个小朋友。接着,2号、3号小朋友也同样这么做。请问一轮后,每个小朋友面前分别有多少糖果?
输入格式:
本题目没有输入。
输出格式:
在一行内显示以下结果。注意行末除了换行符不能有任何多余字符。
10 8 5
输入样例:
本题目没有输入。
输出样例:
10 8 5
我的代码:
#include <stdio.h>
int main()
{
int one1=8,two1=9,three1=10;
int one2,two2,three2;
one2=one1/3;
two2=(one2+two1)/3;
three2=(one2+two2+three1)/3;
one2+=two2+three2;
two2+=three2;
printf("%d %d %d",one2,two2,three2);
return 0;
}
输入身高计算并显示标准体重
编写一段程序, 像下面那样读取表示身高的整数值, 显示出标准体重的实数值.
标准体重根据公式 (Tall−100)0.9 进行计算(其中Tall代表身高厘米数), 所得结果保留一位小数.
请输入您的身高(cm):175(回车)
您的标准体重是67.5公斤。
输入样例:
输入身高厘米数, 整数。
175 (回车)
输出样例:
请输入您的身高(cm):您的标准体重是67.5公斤。
我的代码:
#include <stdio.h>
int main()
{
int tall;
float wight;
printf("请输入您的身高(cm):");
if (scanf ("%d",&tall))
{
wight=(tall-100)*0.9 ;
printf("您的标准体重是%.1f公斤。",wight);
}
return 0;
}
计算天数
编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62
我的代码:
2020.10.23版本:
#include <stdio.h>
int main()
{
int year,month,day,number;
if (scanf("%d/%d/%d",&year,&month,&day))
{
int runnian(int month ,int day);
int pingnian(int month,int day);
if((year%4==0&&year%100!=0)||(year%400==0)) number=runnian(month,day);
else number=pingnian(month,day);
printf("%d\n",number);
}
return 0;
}
int runnian(int month ,int day)
{
int number;
if (month==1) number=day;
else if (month==2) number=31+day;
else if (month%2==0) number=((month/2)-2)*30+month/2*31+29+day;
else if(month%2!=0) number=((month/2)-1)*30+month/2*31+29+day;
return number;
}
int pingnian(int month,int day)
{
int number;
if (month==1) number=day;
else if (month==2) number=31+day;
else if (month%2==0) number=((month/2)-2)*30+month/2*31+28+day;
else if (month%2!=0) number=((month/2)-1)*30+month/2*31+28+day;
return number;
}
202012.28版本:
#include <stdio.h>
int main()
{
int a[12]={31,28,31,30,31,30,31,30,31,30,31,30};
int y,m,d,n=0,i;
scanf ("%d/%d/%d",&y,&m,&d);
if ((y%4==0&&y%100!=0)||y%400==0)
{
a[1]=29;
}
for (i=0;i<m-1;i++)
{
n+=a[i];
}
printf ("%d",n+d);
return 0;
}
PS:第一版的时候比较排斥数组总想调用函数,算了半天不仅浪费时间而且代码长不好读。
西安距离
小明来到了古都西安,想去参观大唐西市!
西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。
输入格式:
一行中四个整数,a,b,c,d,表示坐标为(a,b)与(c,d),这里0<=a,b,c,d<=1000
输出格式:
输出这两个点的西安距离。
输入样例:
0 0 3 4
输出样例:
7
我的代码:
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c,d,l;
if (scanf("%d %d %d %d",&a,&b,&c,&d)) {
l=abs(a-c)+abs(b-d);
printf("%d\n",l);}
return 0;
}
三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34
我的代码:
#include <stdio.h>
int main()
{
int a,b;
if (scanf("%d",&a))
{
b=a%5;
if ((b==4)||(b==0))
{printf("Drying in day %d\n",a);}
if ((b==1)||(b==2)||(b==3))
{printf("Fishing in day %d\n",a);}
}
return 0;
}
求奇数分之一序列前N项和
编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
23
输出样例:
sum = 2.549541
我的代码:
#include <stdio.h>
int main()
{
int n,i;
double s=0;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
s=s+1.000000/(i*2-1);
}
printf("sum = %.6f",s);
return 0;
}
找出最小值
编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
我的代码:
#include <stdio.h>
int main()
{
int n,i,a,min;
scanf("%d",&n);
scanf ("%d",&min);
for (i=0;i<n-1;i++)
{
scanf ("%d",&a);
if (a<min) min=a;
}
printf("min = %d",min);
return 0;
}
奇偶分家
给定N个正整数,请统计奇数和偶数各有多少个?
输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。
输出格式:
在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。
输入样例:
9
88 74 101 26 15 0 34 22 77
输出样例:
3 6
我的代码:
#include <stdio.h>
int main()
{
int n,i,j=0,o=0,a;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf ("%d",&a);
if (a%2==0) o++;
else j++;
}
printf("%d %d",j,o);
return 0;
}
统计MOOC证书
编写程序,输入N个学生的MOOC成绩,统计优秀、合格证书的数量,以及没有获得证书的数量。学生修读程序设计MOOC,85分及以上获得优秀证书,不到85分但是60分及以上获得合格证书,不到60分则没有证书。
输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
输出格式:
在一行中依次输出优秀证书、合格证书、没有获得证书的数量,中间以空格分隔。请注意,最后一个数字后没有空格。
输入样例1:
7
85 59 86 60 84 61 45
输出样例1:
2 3 2
输入样例2:
4
91 100 88 75
输出样例2:
3 1 0
我的代码:
#include <stdio.h>
int main()
{
int n,i,a,y=0,h=0,m=0;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf ("%d",&a);
if (a>=85) y++;
else if (a>=60) h++;
else m++;
}
printf("%d %d %d",y,h,m);
return 0;
}
求最大值及其下标
编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
输入样例:
6
2 8 10 1 9 10
输出样例:
10 2
我的代码:
#include <stdio.h>
int main()
{
int n,i,a[11],c=0,max;
scanf("%d",&n);
scanf ("%d",&a[0]);
max=a[0];
for (i=1;i<n;i++)
{
scanf ("%d",&a[i]);
if (max<a[i])
{
max=a[i];
c=i;
}
}
printf ("%d %d\n",max,c);
return 0;
}
PS:还有另外一种思路是先用for将所有数组都scanf,再用一次for比较。
交换最小值和最大值
编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
我的代码:
#include <stdio.h>
int main()
{
int n,i,a[10],maxcount=0,mincount=0,max,min,c;
scanf("%d",&n);
for (i=0;i<n;i++) //输入
{
scanf ("%d",&a[i]);
}
min=a[0]; //找出最小值
for (i=1;i<n;i++)
{
if (min>a[i])
{
min=a[i];
mincount=i;
}
}
c=a[0]; a[0]=min; a[mincount]=c;//最小值与第一个数交换
max=a[0]; //找出最大值
for (i=1;i<n;i++)
{
if (max<a[i])
{
max=a[i];
maxcount=i;
}
}
c=a[n-1]; a[n-1]=max; a[maxcount]=c; //最大值与最后一个数交换
for (i=0;i<n;i++) //输出
{
printf ("%d ",a[i]);
}
return 0;
}
PS:一定要严格按照顺序做,先最小值与第一个数交换再找最大值。我原来是想先用一个for把最大最小值求出来,再来交换顺序,结果屡屡出错,因为8不仅是最大值还在开头,不注意就容易混。
方阵主对角线元素和以及副对角线元素的积
求一个5×5方阵主对角线元素的和以及副对角线元素的积。
输入格式:
输入5行5列的矩阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。
输出格式:
在一行中按照“s=和,t=积”的顺序输出,结果均原样输出,没有列宽控制。
输入样例:
1 4 7 8 5
1 1 1 1 1
2 2 2 5 6
2 2 2 2 2
3 3 3 3 3
输出样例:
s=9,t=60
我的代码:
2020.11.15版本:
#include <stdio.h>
int main()
{
int a[5][5];
int i,j,s=0,t=1;
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
scanf ("%d",&a[i][j]);
}
}
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
if (i==j) s+=a[i][j];
if (i+j==4) t*=a[i][j];
}
}
printf ("s=%d,t=%d",s,t);
return 0;
}
2020.12.28修改:
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
if (i==j) s+=a[i][j];
if (i+j==4) t*=a[i][j];
}
这一段可以变成
for (i=0;i<5;i++)
{
s+=a[i][i];
t*=a[i][4-i];
}
稍微简化了一点计算
判断上三角矩阵
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
输出样例:
YES
NO
我的代码:
#include<stdio.h>
int main()
{
int n,a[10][10],i,j,k=0,l,t;
scanf("%d",&t);
for (l=0;l<t;l++)
{
scanf("%d",&n);
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf ("%d",&a[i][j]);
if (j<i&&a[i][j]!=0)
{
k++;
}
}
}
if(k==0) printf ("YES\n");
else printf ("NO\n");
k=0;//易漏
}
return 0;
}
矩阵转置
用指针实现将一个3*3的整型矩阵转置。
要求定义并调用函数void move(int *pointer),实现上述矩阵转置的功能。
输出格式:每行数据之间以空格分隔,最后一个数据后面没有空格
输入样例:
1 2 3
4 5 6
7 8 9
输出样例:
1 4 7
2 5 8
3 6 9
我的代码:
#include <stdio.h>
void move(int *pointer)
{
int i,j;
for(i=0;i<3;i++)
{
int a;
for(j=0;j<3;j++)
if (i<j)
{
a=*(pointer+i*3+j);
*(pointer+i*3+j)=*(pointer+j*3+i);
*(pointer+j*3+i)=a;
}
}
}
int main()
{
void move(int *pointer);
int a[3][3],i,j;
int (*p)[3]=a;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf ("%d",&a[i][j]);
}
move(*p);
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf ("%d ",a[i][j]);
printf ("%d\n",a[i][2]);
}
return 0;
}
填空题
计算综合成绩
输入学生姓名、平时成绩、期末成绩、平时成绩和期末成绩的百分比,计算综合成绩
#include <stdio.h>
struct student{
char name[20];
int s1, s2; //s1:平时成绩 s2:期末成绩
int score; //综合成绩
};
void modifyScore(_____________ pstu, int r1, int r2){
_____________ = (pstu->s1 * r1 + pstu->s2 * r2) /100;
}
int main() {
int n, r1, r2;
struct student stu;
scanf("%s%d%d", stu.name, &stu.s1, &stu.s2);
scanf("%d%d", &r1, &r2);
modifyScore(_____________ , r1, r2);
printf("%s %d\n", stu.name, stu.score);
return 0;
}
我的答案
#include <stdio.h>
struct student{
char name[20];
int s1, s2; //s1:平时成绩 s2:期末成绩
int score; //综合成绩
};
void modifyScore(struct student *pstu, int r1, int r2){
pstu->score= (pstu->s1 * r1 + pstu->s2 * r2) /100;
}
int main() {
int n, r1, r2;
struct student stu;
scanf("%s%d%d", stu.name, &stu.s1, &stu.s2);
scanf("%d%d", &r1, &r2);
modifyScore(&stu, r1, r2);
printf("%s %d\n", stu.name, stu.score);
return 0;
}
PS:当时还没有熟练的运用结构体指针,所以这一块有一点蒙。
机器人考核
输出n秒后的时间
用结构体表示时间,输入一个时间再输入一个n,以时:分:秒的形式输出原时间再过n秒后的时间。
我的代码:
#include <stdio.h>
int main()
{
struct time
{
int h;
int m;
int s;
}t1,t2;
int n;
printf ("请输入时间:");
scanf ("%d:%d:%d",&t1.h,&t1.m,&t1.s);
printf ("过去的秒数:");
scanf ("%d",&n);
t2.s=t1.s+n%60;
t2.m=t1.m+n/60%60;
t2.h=t1.h+n/3600;
if (t2.s>=60)
{
t2.s-=60;
t2.m+=1;
}
if (t2.m>=60)
{
t2.m-=60;
t2.h+=1;
}
if (t2.h>=24)
{
t2.h=0;
}
printf ("%d秒后的时间为%d:%d:%d",n,t2.h,t2.m,t2.s);
return 0;
}
运行测试:
PS:我觉得这个主要是容易漏掉分和秒满60进1还有小时满24归0。
实验报告
学生成绩管理系统
一名学生的基本信息包括:学号、姓名、年龄、6门课程的成绩、总分,请定义结构体类型描述学生的信息,其中6门课程的成绩要求使用数组进行描述。在此基础上,定义一个数组,存放N名学生的信息,编写程序实现如下功能:
(1)输入N名学生的相关信息,其中总分不用输入,根据6门课程的成绩计算而得。
(2)输出总分最高的学生的学号和姓名。
(3)输入待查找的学号,在N名学生中进行查找,如果找到该学号的学生信息,则输出该学生的所有信息,如果没有找到,则输出提示“Not Found!”。
(4)对数组中的N名学生按照总分进行降序排列,排序之后,总分最高的学生信息放在数组的第0个元素,总分第二高的学生信息放在数组的第1个元素,…输出排序之后的数组信息。
我的代码:
#include <stdio.h>
struct student
{
int xuehao;
char name[100];
int age;
int score[6];
int sumscore;
} s[100];
void input(int *p)
{
printf ("-------------------------学生资料输入---------------------------------\n");
int n,i,j;
printf ("学生人数:");
scanf ("%d",p);
for (i=0;i<*p;i++)
{
printf ("学生%d\n",i+1);
printf ("学号:");
scanf ("%d",&s[i].xuehao);
printf ("姓名:");
scanf ("%s",s[i].name);
printf ("年龄:");
scanf ("%d",&s[i].age);
printf ("课程成绩:");
for (j=0;j<6;j++)
{
scanf ("%d",&s[i].score[j]);
s[i].sumscore+=s[i].score[j];
}
}
printf ("--------------------------------------------------------------------\n");
putchar('\n');
}
void output(int *p)
{
printf ("----------------------------学生资料库-----------------------------------\n");
int i,j;
for (i=0;i<*p;i++)
{
printf ("学号:%-3d 姓名:%s 年龄:%-3d课程成绩:",s[i].xuehao,s[i].name,s[i].age);
for (j=0;j<6;j++)
{
printf ("%d ",s[i].score[j]);
}
printf ("总成绩:%d\n",s[i].sumscore);
}
printf ("---------------------------------------------------------------------\n");
putchar('\n');
}
void highscore (int *p)
{
printf ("--------------------------最高分学生存档-----------------------------\n");
int i,j,max=s[0].sumscore,flag=0;
for (i=0;i<*p;i++)
{
if (max<s[i].sumscore)
{
max=s[i].sumscore;
flag=i;
}
}
printf ("总分最高学生姓名:%s 学号:%d\n",s[flag].name,s[flag].xuehao);
printf ("---------------------------------------------------------------------\n");
putchar('\n');
}
void find (int *p)
{
printf ("-----------------------------查找系统--------------------------------\n");
int findxuehao,i,j,flag=0;
printf ("请输入待查找学生学号:");
scanf ("%d",&findxuehao);
for (i=0;i<*p;i++)
{
if (findxuehao==s[i].xuehao)
{
printf ("学号:%d 姓名:%s 年龄:%d 课程成绩:",s[i].xuehao,s[i].name,s[i].age);
for (j=0;j<6;j++)
{
printf ("%d ",s[i].score[j]);
}
printf ("总成绩:%d\n",s[i].sumscore);
flag=1;
}
}
if (flag==0) printf ("Not Found!\n");
printf ("---------------------------------------------------------------------\n");
putchar('\n');
}
void paihang(int *p)
{
int i,j;
for (i=0;i<*p-1;i++)
{
for (j=0;j<*p-1-i;j++)
{
if (s[j].sumscore<s[j+1].sumscore)
{
s[*p+1]=s[j];
s[j]=s[j+1];
s[j+1]=s[*p+1];
}
}
}
void output(int *p);
printf ("------------------------------排行榜---------------------------------\n");
output(p);
printf ("---------------------------------------------------------------------\n");
putchar('\n');
}
int main()
{
printf ("-------------------------------菜单----------------------------------\n");
printf ("1.学生信息录入\n");
printf ("2.显示学生信息\n");
printf ("3.显示总分最高学生的学号和姓名\n");
printf ("4.查找学生信息\n");
printf ("5.获取学生成绩排行榜\n");
printf ("6.退出\n");
printf ("---------------------------------------------------------------------\n");
int n,i,j,*p=&n;
void input(int *p);//声明
void output(int *p);
void highscore (int *p);
void find (int *p);
void paihang(int *p);
int a;
LOOP:
printf ("请输入功能序号:");
scanf("%d",&a);
switch (a)
{
case 1: input(p); goto LOOP;
case 2: output(p); goto LOOP;
case 3: highscore (p); goto LOOP;
case 4: find (p); goto LOOP;
case 5: paihang(p); goto LOOP;
case 6: printf ("感谢使用"); break;
}
return 0;
}
测试:(照片糊别介意)
PS:今天是2020.12.25(孤独寂寞冷的圣诞节),这是我目前写的最长的代码,虽然这只是一个简单的学生成绩管理系统但是我还是很有成就感的嘻嘻。给大家分享一点经验,就是scanf和gets不要混着用,因为scanf遇到回车停止输入后回车还是会留在缓冲区的,如果后面跟gets的话gets就会遇到那个回车停止输入,我因为基础不太扎实这个小问题卡了我好久,如果真的想混着用,可以用getchar()吃掉一个空格。我这个代码有一个BUG就是我都是靠scanf输入数据,所以名字不能打空格,本来为了让名字能打空格我想用gets的,但是好像缓冲区的空格有那么一点点多,所以我放弃了呜呜呜。还有,怎样才能对齐数据啊啊啊啊,我本来以为用制表符一定能对齐的,结果,它居然对数组不是很管用,参差不齐的看得我强迫症都犯了,所以,我还是用了%3d这种写法,虽然对的不是很齐但也好像不太离谱,哪位大佬能告诉我怎么对齐啊啊啊。