pta——组织星期信息,你今天刷快手了吗

程序设计实训8月19日个人编程

7-2 组织星期信息

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

定义一个指针数组将下面的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。

Sunday Monday Tuesday Wednesday Thursday Friday Saturday

输入输出示例:括号内为说明,无需输入输出

输入样例 (repeat=3) :
3
Tuesday
Wednesday
year
输出样例:
3
4
-1
ssn:指针数组,可能学过,但没用过的东西。当时个人编程两道题第一题就通过一个测试点,跟完全没做出来差不多,第二题剩的时间也不多了,我就胡乱写了个判断的没用指针数组,竟然过了。

#include<stdio.h>
int main()
{
	int repeat,i;
	char str[17];
	scanf("%d",&repeat);
	for(i=0;i<repeat;i++){
		scanf("%s",&str);
		if(str[0]=='S'&&str[1]=='u') {
			printf("1\n");
			continue;
		}
		else if(str[0]=='M') {
			printf("2\n");
			continue;
		}
		else if(str[0]=='T'&&str[1]=='u') {
			printf("3\n");
			continue;
		}
		else if(str[0]=='W' ){
			printf("4\n");
			continue;
		} 
		else if(str[0]=='T'&&str[1]=='h') {
			printf("5\n");
			continue;
		}
		else if(str[0]=='F') {
			printf("6\n");
			continue;
		}
		else if(str[0]=='S'&&str[1]=='a'){
			printf("7\n");
			continue;
		}
		printf("-1\n");
		return 0;
	}
}

在这里插入图片描述
小声bb:有的时候考试做题,时间不够了直接上来蒙测试点(如果有五六个测试点的话,很多情况下都会有输入样例和输出样例的测试点),学校oj测试是暗箱操作的话能混点分。
还是想回头来看一下正确该怎么做,我对于指针数组的浅薄理解是一个用来装指针的数组,这道题应该是用一个数组里面装着分别指向Sunday到Saturday的指针。(我看别人写的都是直接定义一个二维的字符型数组,倒也没毛病,a[ ]就是a[ ][ ]的指针嘛)。

#include<stdio.h>
#include<string.h>
int main()
{
	char *a[7];
	char b[10];
	int i,j,repeat;
	scanf("%d",&repeat);
	a[0] = "Sunday";
	a[1] = "Monday";
	a[2] = "Tuesday";
	a[3] = "Wednesday";
	a[4] = "Thursday";
	a[5] = "Friday";
	a[6] = "Saturday";	
	gets(b);
	for(i=0;i<repeat;i++){
		gets(b);
		//getchar();
		for(j=0;j<7;j++){
			if(strcmp(b,a[j])==0){
				printf("%d\n",j+1);
				break;
			}
		}
		if(j==7){
			printf("-1\n");
		}
	}
	return 0;
}

这样会有警告但是能运行,答案一样通过。为什么会警告,怎么解决,这个大佬写的很明白

7-1 你今天刷快手了吗

快手是比较火的一款短视频app软件,里面每天都会更新一些有趣的视频,因此它的出现成为了我们打发时间的一种方式,但是有些同学进去看到有趣的视频就会停不下来,导致沉迷于此。当你进入和退出快手app的时候它的后台都有一个记录数据,即进入快手的时间和退出的时间。你的班主任想知道你们班每位同学每天刷快手的情况,于是就向快手平台要了你们班的后台记录数据,但是这些数据都是零散的,你的班主任让你帮他将每一个同学刷视频的时间按从小到大排序。

输入格式:
在第一行给两个整数n和m(1≤n≤1000,0≤m≤10^4),n代表你们班上的人数,m代表数据的条数,接下来m行每行给一组数据,格式为:学号 进入时间 退出时间,你们班的学号为从0~n-1编号并且为三位数。题目保证给出的所有时间均是同一天之内的。

输出格式:
将每个同学一天中刷快手的总时间从小到大排序输出(若出现并列情况,则按学号从小到大输出),输出格式为:学号 时间,最后输出最长的时间。

注:输出和输出的学号为三位数(不足三位补前导0),输出的时间格式为:00:00:00

输入样例1:
3 5
000 19:48:30 19:59:24
002 18:45:40 19:01:20
000 21:32:28 21:53:30
001 12:30:16 12:43:19
001 13:05:36 13:37:33
输出样例1:
001 00:45:00
000 00:31:56
002 00:15:40
输入样例2:
3 5
000 12:03:31 12:13:12
002 12:00:28 12:54:41
001 16:04:44 16:34:47
001 07:30:29 07:54:39
000 23:17:18 23:29:33
输出样例2:
001 00:54:13
002 00:54:13
000 00:21:56
ssn:多次尝试,只能过第一个测试点。

#include<stdio.h>
struct stu{
	int num;
    int time;
}T[1001];
int main()
{
	int n,m,a1,a2,a3,b1,b2,b3;
	int i,j,c1,c2,c3;
	int q,t1,t2;
	scanf("%d %d",&n,&m);
	//学号从000到999,最多一千个学生 
	for(i=0;i<1000;i++){
		T[i].num = i;
		T[i].time = 0;
	}
	for(i=0;i<m;i++){
		scanf("%d %d:%d:%d %d:%d:%d",&q,&a1,&a2,&a3,&b1,&b2,&b3);
		c1 = (b1-a1)*3600;
		c2 = (b2-a2)*60;
		c3 = b3-a3;
		T[q].time += c1+c2+c3;
	}
	//我先试试冒泡排序超不超时 
	for(i=0;i<n-1;i++){
		for(j=0;j<n-i-1;j++){
			if(T[j+1].time > T[j].time){
				t1 = T[j].num ;
				t2 = T[j].time ;
				T[j].num = T[j+1].num ;
				T[j].time = T[j+1].time ;
				T[j+1].num = t1;
				T[j+1].time = t2;
			}
		}
	}
	for(i=0;i<n;i++){
        printf("%03d %02d:%02d:%02d\n",T[i].num,T[i].time/3600,T[i].time%3600/60,T[i].time%60);        
	}
	return 0;
} 
} 

在这里插入图片描述
用排序函数写就能全过,个人开始认为是以为是无法解决学号是跳跃的问题,但我发现满分通过的代码也无法解决。看起来都是从000顺序输出的,陷入迷茫。再仔细读题发现“学号从0~n-1”,题目不要求解决学号跳跃的问题。仔细看看原来是自己冒泡排序写错了,代码这个东西太长时间不写就会生疏,但记忆中总觉得自己还很熟练,很容易出现小错误。上面的已经改过了,也是全对的。

#include<bits/stdc++.h>
using namespace std;
struct stu{
	int num;
    int time;
}T[1001];
bool cmp(stu x,stu y)
{
	if(x.time == y.time)
	    //x的学号小返回x,否则返回y ,下面同理
	    return x.num<y.num ;
	else
	    return x.time>y.time ;
}
int main()
{
	int n,m,a1,a2,a3,b1,b2,b3;
	int i,j,c1,c2,c3;
	int q,t1,t2;
	int s[1001]={0};
	scanf("%d %d",&n,&m);
	//学号从000到999,最多一千个学生 
	for(i=0;i<1000;i++){
		T[i].num = i;
		T[i].time = 0;
	}
	for(i=0;i<m;i++){
		scanf("%d %d:%d:%d %d:%d:%d",&q,&a1,&a2,&a3,&b1,&b2,&b3);
		c1 = (b1-a1)*3600;
		c2 = (b2-a2)*60;
		c3 = b3-a3;
		T[q].time += c1+c2+c3;
		s[q]++;
	}
	sort(T,T+n,cmp);
	for(i=0;i<n;i++){
		if(s[T[i].num]==0){
			printf("%03d 00:00:00\n",T[i].num);
		}
		else
            printf("%03d %02d:%02d:%02d\n",T[i].num,T[i].time/3600,T[i].time%3600/60,T[i].time%60);        
	}
	return 0;
} 

在这里插入图片描述

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜·肉多多·狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值