C程序设计(第二版) 第八章习题

 程序来自配套的习题解答一书

8.5写一函数,使输入的字符串反序存放,在主函数中输入和输出字符串

#include <stdio.h>
#include <string.h>
void main()
{
 void inverse(char str[]);
 char str[100];
 printf("Input String:");
 scanf("%s",str);
 inverse(str);
 printf("Inverse string:%s/n",str);
}
void inverse(char str[])
{
 char t;
 int i,j;
 for(i=0,j=strlen(str);i<strlen(str)/2;i++,j--)
 {
  t=str[i];
  str[i]=str[j-1];
  str[j-1]=t;
 }
}

8.8写一函数,输入一个4位数,要求输出这4个数字字符,但每两个数字间有一个空格。例:输入1990输出1 9 9 0
#include <stdio.h>
#include <string.h>
void main()
{
 char str[80];
 void insert(char str[]);
 printf("/nInput four digit:");
 scanf("%s",str);
 insert(str);
}
void insert(char str[])
{
 int i;
 for(i=strlen(str);i>0;i--)
 {
  str[2*i]=str[i];
  str[2*i-1]=' ';
 }
 printf("/nOutput:%s/n",str);
}

8.10写一函数,输入一行字符,将此字符串中最长的单词输出
#include <stdio.h>
#include <string.h>
int alphabetic(char c)//判断当前字符是否是字母
{
 if((c>='a' && c<='z')||(c>='A' && c<='Z'))
  return 1;
 else
  return 0;
}

int longest(char string[])//寻找最长单词的起始位置

 int len=0,i,length=0,flag=1,place=0,point;
 for(i=0;i<=strlen(string);i++)
 {
  if(alphabetic(string[i]))
  {
   if(flag)//flag表示新单词是否已开始,flag=0表示未开始,flag=1表示开始
   {
    point=i;//point代表当前单词的起始位置(用下标表示)
    flag=0;
    len++;//len表示当前单词已累计的字母个数
   }
   else
    len++;
  }
  else
  {
   flag=1;
   if(len>=length)//length代表先前单词中最长单词的长度
   {
    length=len;
    place=point;//place代表最长单词的起始位置
    len=0;
   }
   else
    len=0;
  }
 }
 return place;//返回最长单词的起始位置
}

void main()
{
 int i;
 char line[100];
 printf("Input one line:/n");
 gets(line);
 printf("/nThe longest word is:");
 for(i=longest(line);alphabetic(line[i]);i++)//输出最长单词直到遇到空格
  printf("%c",line[i]);
 printf("/n");
}

8.14输入10个学生5门课成绩,分别用函数求:(1)每个学生的平均分(2)每门课的平均分(3)找出最高分数所对应的学生和课程
#include <stdio.h>
#define N 10
#define M 5
float score[N][M];
float a_stu[N],a_cour[M];
int r,c;
void main()
{
 float highest();
 void input_stu();
 void aver_stu();
 void aver_cour();
 int i,j;
 float h;
 input_stu();//输入10个学生成绩
 aver_stu();//计算10个学生平均成绩
 aver_cour();//计算5门课平均成绩
 printf("/nNO.     cour1   cour2  cour3  cour4 cour5  aver");
 for(i=0;i<N;i++)
 {
  printf("/nNo.%2d",i+1);
  for(j=0;j<M;j++)
  {
   printf("%8.2f",score[i][j]);//输出1个学生各门课成绩   
  }
  printf("%8.2f",a_stu[i]);//输出1个学生平均成绩
 }
 printf("/nAverrage:");
 for(j=0;j<M;j++)
  printf("%8.2f",a_cour[j]);//输出5门课平均成绩
 h=highest();//求最高分和它属于哪个学生哪门课
 printf("/nhighest:%7.2f NO.%2d course%2d/n",h,r,c);//输出最高分和学生号,课程号
}

void input_stu()
{
 int i,j;
 for(i=0;i<N;i++)
 {
  printf("/nInput score of student%2d:/n",i+1);
  for(j=0;j<M;j++)
   scanf("%f",&score[i][j]);
 }
}

void aver_stu()
{
 int i,j;
 float s;
 for(i=0;i<N;i++)
 {
  for(j=0,s=0;j<M;j++)
  {
   s+=score[i][j];
  }
  a_stu[i]=s/5.0;
 }
}

void aver_cour()
{
 int i,j;
 float s;
 for(j=0;j<M;j++)
 {
  s=0;
  for(i=0;i<N;i++)
  {
   s+=score[i][j];
  }
  a_cour[j]=s/(float)N;
 }
}

float highest()
{
 float high;
 int i,j;
 high=score[0][0];
 for(i=0;i<N;i++)
  for(j=0;j<M;j++)
  {
   if(score[i][j]>high)
   {
    high=score[i][j];
    r=i+1;//数组行号i从0开始,学生号r从1开始,故r=i+1
    c=j+1;//数组行号j从0开始,学生号c从1开始,故c=j+1
   }
  }
 return high;
}

8.15写几个函数:(1)输入10个职工的姓名和工号(2)按职工号由小到大排序,姓名顺序也随之调整(3)输入1职工号,用折半查找法找出该职工姓名。从主函数输入要查找的职工号,输出该职工姓名
#include <stdio.h>
#include <string.h>
#define N 10
void input_e(int num[],char name[N][8])//录入职工数据
{
 int i;
 for(i=0;i<N;i++)
 {
  printf("/nInput NO.:");
  scanf("%d",&num[i]);
  printf("Input name:");
  getchar();
  gets(name[i]);//输入的名字不能超过8个字节
 }
}

void sort(int num[],char name[N][8])//选择法排序
{
 int i,j,min,temp1;
 char temp2[8];
 for(i=0;i<N-1;i++)
 {
  min=i;
  for(j=i+1;j<N;j++)
   if(num[min]>num[j])
    min=j;
   if(min!=j)
   {
    temp1=num[i];
    strcpy(temp2,name[i]);
    num[i]=num[min];
    strcpy(name[i],name[min]);
    num[min]=temp1;
    strcpy(name[min],temp2);
   }   
 }
 printf("/nResult:/n");
 for(i=0;i<N;i++)
  printf("/n%5d%10s",num[i],name[i]);
}

void search(int n,int num[],char name[N][8])//折半查找法
{
 int top,bott,mid,loca,sign=1;
 loca=0;
 top=0;
 bott=N-1;
 if((n<num[0]) || (n>num[N-1]))
  loca=-1;
 while((sign==1) && (top<=bott))
 {
  mid=(bott+top)/2;
  if(n==num[mid])
  {
   loca=mid;
   printf("NO.%d,his name is %s./n",n,name[loca]);
   sign=-1;
  }
  else if(n<num[mid])
   bott=mid-1;
  else
   top=mid+1;
 }
 if(sign==1 || loca==-1)
  printf("%d not been found./n",n);
}

void main()
{
 int num[N],number,flag=1,c;
 char name[N][8];
 input_e(num,name);
 sort(num,name);
 while(flag==1)
 {
  printf("/nInput number to look for:");
  scanf("%d",&number);
  search(number,num,name);
  printf("continue or not(Y/N)?");
  getchar();
  c=getchar();
  if(c=='N' || c=='n')
   flag=0;
 }
}

8.16写一函数,输入一个16进制数,输出相应的10进制数
#include <stdio.h>
#define MAX 100

int htoi(char s[])//16进制到10进制转换
{
 int i,n=0;
 for(i=0;s[i]!='/0';i++)
 {
  if(s[i]>='0' && s[i]<='9')
   n=n*16+s[i]-'0';
  if(s[i]>='a' && s[i]<='f')
   n=n*16+s[i]-'a'+10;
  if(s[i]>='A' && s[i]<='F')
   n=n*16+s[i]-'A'+10;
 }
 return n;
}

void main()
{
 char t[MAX];
 int flag=0,flag1=1,i=0; 
 char c;
 printf("/nInput a hex number:");
 while((c=getchar())!='/0' && i<MAX && flag1)//输入字符不为EOF和不超过定义长度而且flag1==1
 {
  if(c>='0' && c<='9' || c>='a' && c<='f' || c>='A' && c<='F')
  {
   flag=1;//标志是否为合法16进制字符,1表示合法,0表示非法
    t[i++]=c;
  }
  else if(flag)
  {
   t[i]='/0';
   printf("decimal number :%d/n",htoi(t));
   printf("continue or not(Y/N)?");
   c=getchar();
   if(c=='N' || c=='n')
    flag1=0;//循环终止条件
   else
   {
    flag=0;
    i=0;
    printf("/nInput a hex number:");
   }
  }
 }
}

8.17用递归法将一个整数n转换成字符串。例:输入483应输出"483"。n的位数不确定,可以是任意位数的整数
#include <stdio.h>
void convert(int n)
{
 int i;
 if((i=n/10)!=0)
  convert(i);
 putchar(n%10+'0');
}

void main()
{
 int number;
 printf("/nInput an integer:");
 scanf("%d",&number);
 printf("Output:");
 if(number<0)
 {
  putchar('-');
  number=-number;
 }
 convert(number);
}

8.18给出年、月、日,计算改日是该年的第几天
#include <stdio.h>

int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum_day(int month,int day)//计算日期
{
 int i;
 for(i=1;i<month;i++)//累加所在月之前的天数
  day+=day_tab[i];
 return day;
}

int leap(int year)//判断是否为闰年
{
 int leap;
 leap=(year%4==0 && year%100!=0 || year%400==0);
 return leap;
}

void main()
{
 int year,month,day,days;
 printf("/nInput date(year,month,day):");
 scanf("%d,%d,%d",&year,&month,&day);
 printf("/n%d/%d/%d ",year,month,day);
 days=sum_day(month,day);
 if(leap(year) && month>3)
  days=days+1;
 printf("is the %dth day in this year./n",days);
}

你可能感兴趣的:(c,String,ini,input,insert,float)