c语言 求解答

Python024

c语言 求解答,第1张

C 语言中的字符本质上是一个数字,通过一张 ASCII 表来确定字符和数字的对应关系:

根据这个表得到字母的规律:

小写字母 a-z 从 97 到 122

大写字母 A-Z 从 65 到 90

对同一个字母,小写字母比大写字母多 32

有了这个三个规律,对于一个输入的字符,我们的算法就出来了:

如果一个字符的值在 97 和 122 之间,说明它是小写字母,把它减32,就得到大写字母

如果它的值在 65 到 90 之间,说明它是大写字母,把它加32,得到小写字母

如果都不在这两个区间里面,说明它是其它字符,不对它做修改

所以,我们的代码就是这样的:

【第一行】:

x=1,y=1,z=1

if((x=2)&&(y=2)&&(z=2))

首先,x=2是赋值,执行后x==2,并且此等式的值为2,所以if (x=2)的结果是true。

其次,按照if的判断规则,遇到a&&b&&c这样的判断,当a为true后,会进行b的判断,如果b也为true,就继续进行c的判断。所以这一行会依次进行x=2,y=2,z=2的赋值并且总的判断结果是true (true&&true&&true),结果打印出222。

【第二行】:

一样的,先进行x=0的赋值和判断。赋值后x的值为零。但是由于x=0这个等式的值为0即false,所以此处(x=0)&&(y=2)&&(z=2)总的结果也为false,并且后面的y=2和z=2的赋值并不进行,因为第一项为false了,后两项就不进行判断了(效率上的优化),无论后两项是true还是false,总的结果都是false。所以此时x==0,y==1,z==1,但是不会打印。

【第三行】:

一样的,先进行x=2的赋值和判断,结果为true,此时x==2。

但是注意此时是if(a||b||c)这样形式的判断,如果a是true了,无论后两项结果是什么,总的结果都是true,后两项就 不进行赋值和判断了(效率上的优化)。所以此时x==2,y==1,z==1。

打印出211。

【第四行】:

先进行x=0的赋值和判断,此时x==0,(x=0)的结果是false,所以需要继续进行y=2的赋值和判断。此时y==2,并且(y=2)的值为true。

此时总的结果是false||true||?,为true,第三项不需要进行赋值和判断了(效率上的优化)。

打印出此时xyz的值021

【第五行】:

先进行x=0的赋值和判断,此时x==0,(x=0)的结果是false,所以(x=0)&&(y=2)的结果就是false了,y=2这一步不进行赋值和判断了(效率上的优化),y的值仍旧为1。

因为(x=0)&&(y=2)的结果是false,所以需要进行和它相或的z=2的赋值和判断,此时z==2,并且(z=2)的值为true,总的结果是(false&&?||true),为true。

打印出此时xyz的值012

【总的原则】:

a&&b&&c...的时候,只要遇到false的,总的结果就是false了,后面的就不必进行了。

a||b||c...的时候,只要遇到true的,总的结果就是true了,后面的就不必进行了。

这题考的就是这种提高效率的机制。

以上,未理解的话可以继续追问。

根据题意:

1、项目序号应为唯一值,用自增变量填充。

2、时间使用struct tm结构体(考虑如需时间运算,可使用相关函数)。

3、自定义结构类型SIINFO,分别实现插入链表和打印链表两个功能。

4、由于这个演示程序执行完就结束程序了。所以链表我没有写free释放内存,如你后期扩充代码,自己写释放(除程序结束,malloc申请内存不会自动释放)。

下面是演示代码:

#include <stdio.h>

#include <malloc.h>

#include <time.h>

#define MS 4//最大类型个数

#define MN 20//名称最大字符长度

char stypes[MS][10]={"速度型","力量型","耐力型","对抗型"}//项目类别,自行扩展,对应修改MS常量

typedef struct SportsItemInfo//定义一个体育项目结构类型

{

  int id//项目序号,从数据结构考虑,该项不能重复,应设为自增从0开始(实际开发,这个值由数据库分配)。

  char name[MN+1]//项目名称

  int stype//项目类(对应stypes行下标)

  int n//参赛人数

  struct tm sDate//竞赛时间

  struct SportsItemInfo *next

}SIINFO

SIINFO *insert2List(SIINFO *p_sHead)//插入新数据,首次插入参数传NULL。参数:链表头节点地址(不是首节点)。成功返回头节点,失败返回NULL。

void selectFList(SIINFO *p_sHead)//查询链表

int main()

{

  char c

  SIINFO *p_sHead=NULL,*stemp=NULL

  printf("新增体育项目:\n")

  while(1)

  {

      stemp=insert2List(p_sHead)

      if(!stemp)

      {

          printf("ERROR!\n")

          return 1

      }

      p_sHead=stemp

      printf("是否继续输入(Y/N):")

      c=0

      while(c!='Y' &&c!='N')scanf("%c",&c)

      if(c=='N') break

  }

  selectFList(p_sHead)

  return 0

}

void selectFList(SIINFO *pht)

{

  int i=0

  if(pht)

  {

      printf("\n输出链表信息:\n")

      while(pht->next)

      {

          printf("-----------项目%d---------\n",++i)

          printf("项目序号:%d\n",pht->next->id)

          printf("项目名称:%s\n",pht->next->name)

          printf("项目类别:%s\n",stypes[pht->next->stype])

          printf("参赛人数:%d\n",pht->next->n)

          printf("参赛时间:%04d-%02d-%02d %02d:%02d:%02d\n",pht->next->sDate.tm_year+1900,pht->next->sDate.tm_mon+1,pht->next->sDate.tm_mday,pht->next->sDate.tm_hour,pht->next->sDate.tm_min,pht->next->sDate.tm_sec)

          printf("--------------------------\n")

          pht=pht->next

      }

  }

}

SIINFO *insert2List(SIINFO *p_sHead)

{

  static int x=0

  static SIINFO *p_sTail=NULL

  int i

  SIINFO *p_new=NULL

  if(!p_sHead){

      p_sHead=(SIINFO*)malloc(sizeof(SIINFO))

      if(!p_sHead)

          return NULL

      p_sHead->next=NULL

      p_sTail=NULL

  }

  p_new=(SIINFO*)malloc(sizeof(SIINFO))

  if(!p_new)

      return NULL

  p_new->next=NULL

  p_new->id=x++

  printf("--------------------------\n")

  printf("项目名称:"),scanf("%s",p_new->name)

  for(i=0,printf("项目类(")i<MS-1printf("%d、%s,",i,stypes[i]),i++)

  printf("%d、%s):",i,stypes[i])

  p_new->stype=-1

  while(p_new->stype<0 || p_new->stype>MS-1)scanf("%d",&p_new->stype)

  printf("参赛人数:"),scanf("%d",&p_new->n)

  printf("参赛时间(输入格式:年-月-日 时:分:秒):")

  scanf("%d-%d-%d %d:%d:%d",&p_new->sDate.tm_year,&p_new->sDate.tm_mon,&p_new->sDate.tm_mday,&p_new->sDate.tm_hour,&p_new->sDate.tm_min,&p_new->sDate.tm_sec)

  p_new->sDate.tm_mon--//tm结构的月份是从0开始对应1月

  p_new->sDate.tm_year=p_new->sDate.tm_year-1900//tm结构的年份是实际年份-1900

  if(!p_sHead->next)

      p_sHead->next=p_new

  else

      p_sTail->next=p_new

  p_sTail=p_new

  printf("--------------------------\n")

  return p_sHead

}