第十一周 C语言程序设计
3 月份表示
题目内容:
用指针数组保存表示每个月份的英文单词以及“Illegal month”的首地址,然后编程实现:从键盘任意输入一个数字表示月份值n,程序输出该月份的英文表示,若n不在1~12之间,则输出“Illegal month”。
#include<stdio.h>
#include<string.h>
int main()
{
char *month[]={"January","February","March","April","May","June","July","August","September","Octobor","November","December","Illegal month"};
int n;
printf("Input month number:\n");
scanf("%d",&n);
if(n<=12&&n>=1)
printf("month %d is %s\n",n,month[n-1]);
else
printf("%s\n",month[12]);
return 0;
}
4 程序改错
题目内容:
从键盘任意输入m个学生n门课程的成绩,然后计算每个学生各门课的总分sum和平均分aver。下面程序存在极为隐蔽的错误,请分析错误的原因,并修改程序,同时按照给出的程序运行示例检查修改后的程序。
总结:其中对二维数组的访问要到位
#include <stdio.h>
#define STUD 30 //最多可能的学生人数
#define COURSE 5 //最多可能的考试科目数
void Total(int (*score)[5], int sum[], float aver[], int m, int n);
void Print(int (*score)[5], int sum[], float aver[], int m, int n);
int main(void)
{
int i, j, m, n, score[STUD][COURSE], sum[STUD];
float aver[STUD];
printf("Enter the total number of students and courses:\n");
scanf("%d %d",&m,&n);
printf("Enter score:\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf("%d", &score[i][j]);
}
}
Total(score, sum, aver, m, n);
Print(score, sum, aver, m, n);
return 0;
}
void Total(int (*score)[5], int sum[], float aver[], int m, int n)
{
int i, j;
for (i=0; i<m; i++)
{
sum[i] = 0;
for (j=0; j<n; j++)
{
sum[i] = sum[i] + *(score [i] + j);
}
aver[i] = (float) sum[i] / n;
}
}
void Print(int (*score)[5], int sum[], float aver[], int m, int n)
{
int i, j;
printf("Result:\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("%4d\t", *(score [i] + j));
}
printf("%5d\t%6.1f\n", sum[i], aver[i]);
}
}
6 找数组最值
题目内容:
按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
void InputArray(int *p, int m, int n);
int FindMax(int *p, int m, int n, int *pRow, int *pCol);//函数返回最大值,pRow和pCol分别返回最大值所在的行列下标
注意在对数组访问时要确切的知道是多少列的
#include <stdio.h>
#include <string.h>
void InputArray(int *p,int m,int n);
int FindMax(int *p,int m,int n,int *pRow,int *pCol);//函数返回最大值,pRow和pCol分别是最大值所在行列下标
int main()
{
int m,n,a[10][10]={{0}},max,p1,p2;
printf("Input m,n:\n");
scanf("%d,%d",&m,&n);
InputArray(*a,m,n);
max=FindMax(*a,m,n,&p1,&p2);
printf( "max=%d,row=%d,col=%d\n",max,p1,p2);
return 0;
}
void InputArray(int *p,int m,int n)
{
printf( "Input %d*%d array:\n",m,n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",(p+i*10+j));
}
}
}
int FindMax(int *p,int m,int n,int *pRow,int *pCol)
{
*pRow=0;
*pCol=0;
int max=*(p);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(max<*(p+i*10+j))
{
max=*(p+i*10+j);
*pRow=i;
*pCol=j;
}
}
}
return max;
}
7 冒泡排序
题目内容:
采用冒泡法进行升序排序法的基本原理是:对数组中的n个数执行n-1遍检查操作,在每一遍执行时,对数组中剩余的尚未排好序的元素进行如下操作:对相邻的两个元素进行比较,若排在后面的数小于排在前面的数,则交换其位置,这样每一遍操作中都将参与比较的数中的最大的数沉到数组的底部,经过n-1遍操作后就将全部n个数按从小到大的顺序排好序了。
#include <stdio.h>
#include <string.h>
int main()
{
int n;
printf("Input n:");
scanf("%d",&n);
int a[n],x;
printf("Input %d numbers:",n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[j+1]<a[j])
{
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}
printf("Sorting results:");
for(int i=0;i<n;i++)
{
printf("%4d",a[i]);
}
return 0;
}
8 删除字符串中与某字符相同的字符
题目内容:
在字符串中删除与某字符相同的字符,要求用字符数组作函数参数。
#include <stdio.h>
#include <string.h>
void dele(char *p,char ch);
int main()
{
char str1[100],ch;
printf( "Input a string:\n");
gets(str1);
printf( "Input a character:\n");
ch=getchar();
dele(str1,ch);
printf("Results:%s\n",str1);
return 0;
}
void dele(char *p,char ch)
{
int i=0;
while(*(p+i))
{
if(ch==*(p+i))
{
int j=0;
while(*(p+i+j))
{
*(p+i+j)=*(p+i+j+1);
j++;
}
}
i++;
}
}
9 求最大数和最小数的最大公约数
题目内容:
从键盘输入10个正整数,求出最大数,最小数,以及他们的最大公约数。要求用数组实现。
#include <stdio.h>
#include <string.h>
int main()
{
int a[10]={0},max,min,x,b;
printf("Input 10 numbers:\n");
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max=a[0];
min=a[0];
for(int i=0;i<9;i++)
{
if(max<a[i])
{
max=a[i];
}
if(min>a[i])
{
min=a[i];
}
}
printf("maxNum=%d\n",max);
printf("minNum=%d\n",min);
x=max;
b=min;
if(b!=0)
{
while(x%b)
{
x=b;
b=x%b;
}
printf("%d",b);
}
return 0;
}
10 数列合并
题目内容:
已知两个不同长度的降序排列的数列(假设序列的长度都不超过5),请编程将其合并为一个数列,使合并后的数列仍保持降序排列。
#include <stdio.h>
#include <string.h>
void Merge(int a[],int b[],int c[],int m,int n);
int main()
{
int a[5]={0},b[5]={0},c[10]={0},m,n;
printf("Input m,n:");
scanf("%d,%d",&m,&n);
printf("Input array a:");
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
printf("Input array b:");
for(int j=0;j<n;j++)
{
scanf("%d",&b[j]);
}
Merge(a,b,c,m,n);
for(int i=0;i<m+n;i++)
{
printf("%4d",c[i]);
}
return 0;
}
void Merge(int a[],int b[],int c[],int m,int n)
{
int i,max,x;
for( i=0;i<m;i++)
{
c[i]=a[i];
}
for(int j=0;j<n;j++)
{
c[i+j]=b[j];
}
for(int j=0;j<m+n-1;j++)
{
max=c[j];
i=j;
for(int k=j+1;k<m+n;k++)
{
if(max<c[k])
{
max=c[k];
i=k;
}
}
x=c[i];
c[i]=c[j];
c[j]=x;
}
}
1 山地训练
题目内容:
为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练。她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。假设整条山路划分成T个长度相同的路段(1 <= T <= 100,000),并且小白用si表示第i个路段的路况,用u、f、d这3个字母分别表示第i个路段是上坡、平地、下坡。小白跑完一段上坡路的耗时是U秒(1 <= U <= 100),跑完一段平地的耗时是F秒(1 <= F <= 100),跑完一段下坡路的耗时是D秒(1 <= D <= 100)。注意,沿山路原路返回时,原本是上坡的路段变成了下坡路段,原本是下坡的路段变成了上坡路段。小白想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多少个路段。请你编程帮助她计算。
#include <stdio.h>
#include <string.h>
long fun(long M,long T,long U,long F,long D,char str[]);
int main()
{
long M,T,U,F,D,num;
char str1[100];
printf("Input M,T,U,F,D:");
scanf( "%ld %ld %ld %ld %ld",&M,&T,&U,&F,&D);
getchar();
printf("Input conditions of road:");
gets(str1);
num=fun(M,T,U,F,D,str1);
printf( "num=%ld\n",num);
return 0;
}
long fun(long M,long T,long U,long F,long D,char str[])
{
long t=0;
char *p=str;
long i=0;
while(*(p+i))
{
if(*(p+i)=='u')
{
t=t+U+D;
}
if(*(p+i)=='f')
{
t=t+2*F;
}
if(*(p+i)=='d')
{
t=t+U+D;
}
if(t>M)
{
break;
}
i++;
}
return i;
}
2 奇偶数分离
题目内容:
输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。
函数原型如下所示:
void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数
#include <stdio.h>
#include <string.h>
void Seperate(int a[],int n);
int main()
{
int n,a[100];
printf("Input n:");
scanf("%d",&n);
printf("Input numbers:");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
Seperate(a,n);
return 0;
}
void Seperate(int a[],int n)
{
int j=0;
for(int i=0;i<n;i++)
{
if(a[i]%2)
{
j++;
if(j==1)
printf("%d",a[i]);
else
printf(",%d",a[i]);
}
}
printf("\n");
j=0;
for(int i=0;i<n;i++)
{
if(a[i]%2==0)
{
j++;
if(j==1)
printf("%d",a[i]);
else
printf(",%d",a[i]);
}
}
}
3 子串判断
题目内容:从键盘输入两个长度小于80的字符串A和B,且A的长度大于B的长度,编程判断B是不是A的子串,如果是,则输出”Yes”,否则输出”No”。这里所谓的该串的子串是指字符串中任意多个连续的字符组成的子序列。
#include <stdio.h>
#include <string.h>
int IsSubString(char a[],char b[]);
int main()
{
char a[80],b[80];
printf("Input the first string:");
gets(a);
printf( "Input the second string:");
gets(b);
if(IsSubString(a,b)==1)
{
printf("Yes");
}
else
{
printf("NO");
}
return 0;
}
int IsSubString(char a[],char b[])
{
char *p1=a,*p2=b;
int i=0,j;
while(*(p1+i))
{
if(*(p1+i)==b[0])
{
j=0;
while(*(p2+j))
{
if(*(p1+i+j)!=*(p2+j))
{
break;
}
j++;
}
if(j==strlen(b))
{
return 1;break;
}
}
i++;
}
if(j==strlen(b))
return 1;
else
return 0;
}
4 星期查找
题目内容:
任意输入英文的星期几,通过查找如图所示的星期表,输出其对应的数字,若查到表尾,仍未找到,则输出错误提示信息。
#include <stdio.h>
#include <string.h>
int main()
{
char str[7][100]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char str1[100];
printf("Please enter a string:\n");
gets(str1);
int flag=0;
for(int i=0;i<7;i++)
{
if(strcmp(str1,str[i])==0)
{
printf("%s is %d\n",str1,i); flag=1;break;
}
}
if(flag==0)
printf("Not found!\n");
return 0;
}