周报

C语言算法练习

题目描述 Bessie’s cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive integers I (1 <= I <= 10^60) for which Bessie must determine their parity (explained in second grade as ‘Even… or odd?’). Bessie is overwhelmed by the size of the list and by the size of the numbers. After all, she only learned to count recently.
Write a program to read in the N integers and print ‘even’ on a single line for even numbers and likewise ‘odd’ for odd numbers.
POINTS: 25
Bessie那惨无人道的二年级老师搞了一个有 N 个正整数 I 的表叫Bessie去判断“奇偶性”(这个词语意思向二年级的学生解释,就是“这个数是单数,还是双数啊?”)。Bessie被那个表的长度深深地震惊到了,竟然跟栋栋的泛做表格一样多道题!!!毕竟她才刚刚学会数数啊。
写一个程序读入N个整数,如果是双数,那么在单立的一行内输出"even",如果是单数则类似地输出"odd".
输入格式 * Line 1: A single integer: N

  • Lines 2…N+1: Line j+1 contains I_j, the j-th integer to determine even/odd
    输出格式 * Lines 1…N: Line j contains the word ‘even’ or ‘odd’, depending on the parity of I_j
    输入输出样例 输入 #1
    复制
    2
    1024
    5931
    输出 #1
    复制
    even
    odd
#include<stdio.h>
#include<string.h>
int main()
{
    char a[60];
    int n,x;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",a);
        x=a[strlen(a)-1]-'0';
        if(x%2==0)
        printf("even\n");
        else
        printf("odd\n");
    }
}

这个题本身没有难度,但是它为我提供了一个新的思路,即解决整数问题时不一定非要用整数本身,特别是一些特别大的数字时,可以用字符串解决,方便且合理。

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了NNN个111到100010001000之间的随机整数(N≤100)(N≤100)(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式 输入有两行,第111行为111个正整数,表示所生成的随机数的个数NNN
第222行有NNN个用空格隔开的正整数,为所产生的随机数。
输出格式 输出也是两行,第111行为111个正整数MMM,表示不相同的随机数的个数。
第222行为MMM个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入输出样例 输入 #1
复制
10
20 40 32 67 40 20 89 300 400 15
输出 #1
复制
8
15 20 32 40 67 89 300 400

错误代码

#include<stdio.h>
int main()
{
    int n,a[100],t,x;
    scanf("%d",&n);
    x=n;
    scanf("%d",&a[0]);
    for(int i=1;i<n;i++)
    {
        scanf("%d",&t);
        for(int j=i-1;j>=0;j--)
        {
            if(t<a[j])
            a[j+1]=a[j];
            else if(a[j]==t)
            {
                x--;
                break;
            }
            else if(t>a[j])
            {
                a[j+1]=t;
                break;
            }
        }
    }
    printf("%d\n",x);
    for(int i=0;i<x;i++)
    {
        printf("%d ",a[i]);
    }
}

一个简单的去重和排序问题,但是还是出了很多问题,最主要的问题还是想简化,把去重和排序写在一起,没有从题目中认识到逻辑顺序是先去重再简化,逻辑关系不够明确,比较混乱。

正确代码

#include<stdio.h>
int main()
{
    int n,a[1001]={0},t,x,k;
    scanf("%d",&n);
    x=n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&t);
        if(a[t]==0)
        {
            a[t]=1;
        }
        else
        {
            x--;
            continue;
        }
    }
    printf("%d\n",x);
    for(int i=0;i<1001;i++)
    {
        if(a[i]==1)
        printf("%d ",i);
    }
}

合理灵活运用各种排序,这个题用了平时不太用的桶排序,比较简单优化。
题目描述 假设一个表达式有英文字母(小写)、运算符(+,—,,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入格式 一行:表达式
输出格式 一行:“YES” 或“NO”
输入输出样例 输入 #1
复制
2
(x+y)/(1-x)@
输出 #1
复制
YES输入 #2
复制
(25+x)(a(a+b+b)@
输出 #2
复制
NO 说明/提示 表达式长度小于255,左圆括号少于20个

#include<stdio.h>
#include<string.h>
int main()
{
    char a[255],x=0;
    scanf("%s",a);
    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]=='(')
        x++;
        if(a[i]==')')
        x--;
        if(x<0)
        break;
    }
    if(x==0)
    printf("YES");
    else
    printf("NO");
}

这个题重在理解匹配与不匹配的条件。
不匹配的条件:
1.左括号与右括号的数量不相等。
2.在没有对应的左括号之前,先出现右括号。

信息管理系统

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

struct date
{
   int year,month,day;
};
typedef struct student
{
   char no[9];
   char name[20];
   struct date birthday;
   int score;
   struct student *next;
}STUDENT;

STUDENT * input_student(STUDENT *head)
{
   STUDENT *p,*q;
   p=(STUDENT *)malloc(sizeof(STUDENT));
   printf("请录入学生信息\n");
   printf("姓名:");
   scanf("%s",p->name);
   printf("学号:");
   scanf("%s",p->no);
   printf("出生日期:");
   scanf("%d.%d.%d",&p->birthday.year,&p->birthday.month,&p->birthday.day);
   printf("分数:");
   scanf("%d",&p->score);
   p->next = NULL;
   if(head==NULL)
     head=p;
   else
   {
     q=head;
     while(q->next!=NULL) 
       q=q->next;
     q->next = p;
   }
   return head;
}
//信息录入。
STUDENT * delete_student(STUDENT *head)
{
  int i;
  STUDENT *p,*q;
  char mname[20];
  i=searchbyname(head,"删除",&p,&q);
  if(i<0) 
    return head;
  strcpy(mname,q->name);
  if(p==q)
  {
     head=head->next;
  }
  else
  {
     p->next = q->next;
  }
  free(q);
  printf("\"%s\"已经被删除!按任意键返回.\n",mname);
  return head;
}
//信息删除。

void display_student(STUDENT *head)
{
  STUDENT *p;
  if(head==NULL)
  {
     printf("目前尚未录入学生信息! 按任意键返回.\n");
     getch();
     return;
  }
  printf("学生信息如下:\n");
  p=head;
  while(p!=NULL)
  {
     printf("姓名:%s\n",p->name);
     printf("学号:%s\n",p->no);
     printf("出生日期:%d.%d.%d\n",p->birthday.year,p->birthday.month,p->birthday.day);
     printf("分数:%d\n",p->score);
     printf("按任意键继续.\n");
     getch();
     p=p->next;
  }
}
//信息显示。(输出)
int main()
{
  STUDENT *head=NULL;
  int select=1;
  while(select != 0)
  {
     printf("***************************\n");
     printf("**      学生信息管理     **\n");
     printf("**                       **\n");
     printf("**     1. 信息录入       **\n");
     printf("**     2. 信息删除       **\n");
     printf("**     3. 信息修改       **\n");
     printf("**     4. 排    序       **\n");
     printf("**     5. 信息显示       **\n");
     printf("**                       **\n");
     printf("**     0. 退出           **\n");
     printf("***************************\n");
     printf("请选择输入:");
     scanf("%d",&select);
     switch(select)
     {
        case 1:
           head=input_student(head);
           break;
        case 2:
           head=delete_student(head);
           break;
        case 3:
           break;
        case 4:
           break;
        case 5:
           display_student(head);
           break;
        default:
           printf("输入错误,请新输入");
           break;
     }
  }
  return 0;
}
//信息修改还未完善,链表排序正在自学,预计下一周可以完善。

web安全

安全的三要素CIA:

机密性(confidentiality):
是不将有用信息泄漏给非授权用户的特性。可以通过信息加密、身份认证、访问控制、安全通信协议等技术实现,信息加密是防止信息非法泄露的最基本手段,主要强调有用信息只被授权对象使用的特征。

完整性(integrity):
是指信息在传输、交换、存储和处理过程中,保持信息不被破坏或修改、不丢失和信息未经授权不能改变的特性,也是最基本的安全特征。常见的保证一致性的技术手段是数字签名。

可用性(availability):
指信息资源可被授权实体按要求访问、正常使用或在非正常情况下能恢复使用的特性(系统面向用户服务的安全特性)。
威胁分析

威胁建模——STRIDE模型

在这里插入图片描述

风险分析

风险由以下因素组成:

Risk = Probability * Damage Potential

DREAD模型
在这里插入图片描述

一个优秀的安全方案应该具备的特点:

能够有效解决问题;

用户体验好;

高性能;

低耦合;

易于扩展与升级;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值