1找出按字典顺序排在最前面的国名
题目内容:
输入5个国名,编程找出并输出按字典顺序排在最前面的国名。
提示:所谓字典顺序就是将字符串按由小到大的顺序排列,因此找出按字典顺序排在最前面的国名指的就是最小的字符串。
程序的运行结果示例:
Input five countries’ names:
America↙
China↙
Japan↙
England↙
Sweden↙
The minimum is:America
输入提示信息:“Input five countries’ names:\n”
输入格式: 国名输入用gets()函数
输出格式:“The minimum is:%s\n”
#include
#include
#define MAX 5
int main()
{
int i=0,j=0,minimum=0;
char str[MAX][20];;
printf("Input five countries' names:\n");
gets(str[i]);
for(i=1;i<5;i++){
gets(str[i]);
while(str[minimum][j]==str[i][j])
j++;
if(str[i][j]<str[minimum][j])
minimum=i;
}
printf("The minimum is:%s\n",str[minimum]);
return 0;
}
3月份表示
题目内容:
用指针数组保存表示每个月份的英文单词以及“Illegal month”的首地址,然后编程实现:从键盘任意输入一个数字表示月份值n,程序输出该月份的英文表示,若n不在1~12之间,则输出“Illegal month”。
程序的运行结果示例1:
Input month number:
3↙
month 3 is March
程序的运行结果示例2:
Input month number:
12↙
month 12 is December
程序的运行结果示例3:
Input month number:
14↙
Illegal month
月份输入提示信息:“Input month number:\n”
输入格式: “%d”
输出格式:
月份正确时输出格式:“month %d is %s\n”
月份错误时输出格式:"%s\n"
#include
#include
#define MAX 10
int main()
{
int n;
char str[MAX];
printf("Input month number:\n");
scanf("%d",&n);
switch(n){
case 1:strcpy(str,"January");
break;
case 2:strcpy(str,"February");
break;
case 3:strcpy(str,"March");
break;
case 4:strcpy(str,"April");
break;
case 5:strcpy(str,"May");
break;
case 6:strcpy(str,"June");
break;
case 7:strcpy(str,"July");
break;
case 8:strcpy(str,"August");
break;
case 9:strcpy(str,"September");
break;
case 10:strcpy(str,"October");
break;
case 11:strcpy(str,"November");
break;
case 12:strcpy(str,"December");
break;
default:printf("Illegal month\n");
return 0;
}
printf("month %d is %s\n",n,str);
return 0;
}
4程序改错——1
题目内容:
从键盘任意输入m个学生n门课程的成绩,然后计算每个学生各门课的总分sum和平均分aver。下面程序存在极为隐蔽的错误,请分析错误的原因,并修改程序,同时按照给出的程序运行示例检查修改后的程序。
改错:
#include
#define STUD 30 //最多可能的学生人数
#define COURSE 5 //最多可能的考试科目数
void Total(int *score, int sum[], float aver[], int m, int n);
void Print(int *score, 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, 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 * n + j);
}
aver[i] = (float) sum[i] / n;
}
}
void Print(int *score, 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 * n + j));
}
printf("%5d\t%6.1f\n", sum[i], aver[i]);
}
}
改正后(有错误的语句用/***** FOUND *****/标出了,便于大家对比):
#include
#define STUD 30 //最多可能的学生人数
#define COURSE 5 //最多可能的考试科目数
void Total(int *score, int sum[], float aver[], int m, int n);
void Print(int *score, 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, 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++)
{
/***** FOUND *****/
sum[i] = sum[i] + *(score + i * COURSE + j);
}
aver[i] = (float) sum[i] / n;
}
}
void Print(int *score, 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++)
{
/***** FOUND *****/
printf("%4d", *(score + i * COURSE + j));
}
printf("%5d%6.1f\n", sum[i], aver[i]);
}
}
5程序改错——2
题目内容:
下面主函数调用函数SortString()按奥运会参赛国国名在字典中的顺序对其入场次序进行排序,目前程序存在错误,请修改正确,并按照给出的程序运行示例检查修改后的程序。
改错:
#include
#include
#define M 150 /* 最多的字符串个数 */
#define N 10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
int i, n;
char *pStr[M];
printf("How many countries?\n");
scanf("%d",&n);
getchar(); /* 读走输入缓冲区中的回车符 */
printf("Input their names:\n");
for (i=0; i<n; i++)
{
gets(pStr[i]); /* 输入n个字符串 */
}
SortString(pStr, n); /* 字符串按字典顺序排序 */
printf("Sorted results:\n");
for (i=0; i<n; i++)
{
puts(pStr[i]); /* 输出排序后的n个字符串 */
}
return 0;
}
void SortString(char *ptr[], int n)
{
int i, j;
char *temp = NULL;
for (i=0; i<n-1; i++)
{
for (j=i+1; j<n; j++)
{
if (strcmp(ptr[j], ptr[i]) < 0)
{
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
}
改正后(有错误的语句用/***** FOUND *****/标出了,便于大家对比):
#include
#include
#define M 150 /* 最多的字符串个数 */
#define N 10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
int i, n;
char *pStr[M];
printf("How many countries?\n");
scanf("%d",&n);
getchar(); /* 读走输入缓冲区中的回车符 */
printf("Input their names:\n");
for (i=0; i<n; i++)
{
/***** FOUND *****/
//分配内存
pStr[i]=(char *)malloc(sizeof(char));
gets(pStr[i]); /* 输入n个字符串 */
}
SortString(pStr, n); /* 字符串按字典顺序排序 */
printf("Sorted results:\n");
for (i=0; i<n; i++)
{
puts(pStr[i]); /* 输出排序后的n个字符串 */
}
return 0;
}
void SortString(char *ptr[], int n)
{
int i, j;
char *temp = NULL;
for (i=0; i<n-1; i++)
{
for (j=i+1; j<n; j++)
{
if (strcmp(ptr[j], ptr[i]) < 0)
{
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
}
另一种修改方式是定义二维字符数组对指针数组进行初始化:
#include
#include
#define M 150 /* 最多的字符串个数 */
#define N 10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
int i, n;
/***** FOUND *****/
char name[M][N];
char *pStr[M];
printf("How many countries?\n");
scanf("%d",&n);
getchar(); /* 读走输入缓冲区中的回车符 */
printf("Input their names:\n");
for (i=0; i<n; i++)
{
/***** FOUND *****/
pStr[i]=name[i];
gets(pStr[i]); /* 输入n个字符串 */
}
SortString(pStr, n); /* 字符串按字典顺序排序 */
printf("Sorted results:\n");
for (i=0; i<n; i++)
{
puts(pStr[i]); /* 输出排序后的n个字符串 */
}
return 0;
}
void SortString(char *ptr[], int n)
{
int i, j;
char *temp = NULL;
for (i=0; i<n-1; i++)
{
for (j=i+1; j<n; j++)
{
if (strcmp(ptr[j], ptr[i]) < 0)
{
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
}
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分别返回最大值所在的行列下标
例如,程序的1次运行结果如下:
Input n:
3,4↙
Input 34 array:
1 2 3 4↙
5 6 7 8↙
9 0 -1 -2↙
max=9,row=2,col=0
数组行列数输入提示信息: “Input m,n:\n”
数组输入提示信息: "Input %d%d array:\n"
输入格式:
输入数组行列数:"%d,%d"
输入数组元素:"%d"
输出格式: “max=%d,row=%d,col=%d\n”
#include
void InputArray(int *p, int m, int n){
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",p+i*n+j);
}
}
}
int FindMax(int *p, int m, int n, int *pRow, int *pCol){
int i,j;
int max = p[(*pRow)*n+(*pCol)];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(p[i*n+j]>max){
max=*(p+i*n+j);
*pRow=i;
*pCol=j;
}
}
}
return max;
}
int main(){
int m,n,i,j,max,pRow=0,pCol=0;
int *p=NULL;
printf("Input m,n:\n");
scanf("%d,%d",&m,&n);
p=(int *)malloc(sizeof(int)*m*n);
printf("Input %d*%d array:\n",m,n);
InputArray(p,m,n);
max=FindMax(p,m,n,&pRow,&pCol);
printf("max=%d,row=%d,col=%d\n",max,pRow,pCol);
}
7冒泡排序
题目内容:
采用冒泡法进行升序排序法的基本原理是:对数组中的n个数执行n-1遍检查操作,在每一遍执行时,对数组中剩余的尚未排好序的元素进行如下操作:对相邻的两个元素进行比较,若排在后面的数小于排在前面的数,则交换其位置,这样每一遍操作中都将参与比较的数中的最大的数沉到数组的底部,经过n-1遍操作后就将全部n个数按从小到大的顺序排好序了。程序的某次运行结果如下:
Input n:10↙
Input 10 numbers:2 9 3 4 0 6 8 7 5 1↙
Sorting results: 0 1 2 3 4 5 6 7 8 9
输入数据个数提示:“Input n:”
输入数据提示:“Input %d numbers:”
输入格式: “%d”
输出提示:“Sorting results:”
输出格式:"%4d"
#include
void BubbleSorting(int *p,int n){
int i,j,temp;
printf("Input %d numbers:");
for(i=0;i<n;i++)
scanf("%d",p+i);
for(i=0;i<n-1;i++){
for(j=n-1;j>=i;j--){
if(*(p+j-1)>*(p+j)){
temp=*(p+j-1);
*(p+j-1)=*(p+j);
*(p+j)=temp;
}
}
}
printf("Sorting results:");
for(i=0;i<n;i++)
printf("%4d",*(p+i));
}
int main(){
int *p=NULL,n;
printf("Input n:");
scanf("%d",&n);
p=(int*)calloc(10,sizeof(int));
BubbleSorting(p,n);
}
8删除字符串中与某字符相同的字符
题目内容:
在字符串中删除与某字符相同的字符,要求用字符数组作函数参数。
程序运行结果示例:
Input a string:
hello, my friend!↙
Input a character:
!↙
Results:hello, my friend
输入字符串的提示信息: “Input a string:\n”
输入单个字符的提示信息: “Input a character:\n”
输入格式:
字符串输入用 gets()函数
单个字符输入用 getchar()函数
输出格式:“Results:%s\n”
#include
#define MAX 20
void Deletestring(char str[],char a){
char temp[MAX];
int i,j;
for(i=0,j=0;str[i]!='\0';i++){
if(str[i]!=a){
temp[j++]=str[i];
}
}
temp[j]='\0';
printf("Results:%s\n",temp);
}
int main(){
char str[MAX],a;
printf("Input a string:\n");
gets(str);
printf("Input a character:\n");
a=getchar();
Deletestring(str,a);
}
9求最大数和最小数的最大公约数
题目内容:
从键盘输入10个正整数,求出最大数,最小数,以及他们的最大公约数。要求用数组实现。
程序运行结果示例1:
Input 10 numbers:
15 23 56 87 94 105 78 19 22 43↙
maxNum=105
minNum=15
15
程序运行结果示例2:
Input 10 numbers:
33 1 2 9 8 7 5 4 0 10↙
maxNum=33
minNum=0
输入提示信息:“Input 10 numbers:\n”
输入格式: “%d”
输出格式:
最大数输出格式:“maxNum=%d\n”
最小数输出格式:“minNum=%d\n”
最大公约数输出格式:"%d"
#include
#define MAX 10
int Gcd(int m,int n){
if(n==0)
return m;
else
return Gcd(n,m%n);
}
int Max_Min(int num[],int n){
int max=num[0],min=num[0],i;
for(i=0;i<n;i++){
if(num[i]>max)
max=num[i];
if(num[i]<min)
min=num[i];
}
printf("maxNum=%d\n",max);
printf("minNum=%d\n",min);
if(max==0||min==0)
return 0;
else{
printf("%d",Gcd(max,min));
}
}
int main(){
int i,num[MAX];
printf("Input 10 numbers:\n");
for(i=0;i<MAX;i++)
scanf("%d",&num[i]);
Max_Min(num,MAX);
}
10数列合并
题目内容:
已知两个不同长度的降序排列的数列(假设序列的长度都不超过5),请编程将其合并为一个数列,使合并后的数列仍保持降序排列。
【提示】假设两个降序排列的数列分别保存在数组a和数组b中,用一个循环,从前往后依次比较保存在数组a和数组b中的两个剩余序列里的第一个数,将其中的较大者存到数组c中,当一个较短的序列存完后,再将较长的序列剩余的部分依次保存到数组c的末尾。假设两个序列的长度分别是m和n,在比较剩余序列的循环中,用i和j分别记录两个序列待比较的数组元素位置,循环结束后,若i小于m,则说明数组a中的数有剩余,将数组a中剩余的数存到数组c的末尾即可;若j小于n,则说明数组b中的数有剩余,将数组b中剩余的数存到数组c的末尾即可。在第一个循环中,用k记录往数组c中存了多少个数,在第二个循环中,就从k这个位置开始继续存储较长序列中剩余的数。
函数原型:void Merge(int a[], int b[], int c[], int m, int n);
函数功能:将两个长度分别为m和n、降序排列的子序列a和b合并后放到数组c中
程序运行结果示例1:
Input m,n:3,2↙
Input array a:5 3 1↙
Input array b:4 2↙
5 4 3 2 1
程序运行结果示例2:
Input m,n:3,3↙
Input array a:31 27 -5↙
Input array b:98 30 -7↙
98 31 30 27 -5 -7
输入两个数列长度的提示信息:“Input m,n:”
输入数列a的提示信息:“Input array a:”
输入数列b的提示信息:“Input array b:”
输入格式:
数列长度的输入格式:"%d,%d"
数列中每个数据的输入格式:"%d"
输出格式:"%4d"
#include
#define MAX 5
void Merge(int a[], int b[], int c[], int m, int n){
int i,j,k=0;
for(i=0,j=0;i<m&&j<n;){
if(a[i]>b[j])
c[k++]=a[i++];
else
c[k++]=b[j++];
}
for(;i<m;i++){
c[k++]=a[i];
}
for(;j<n;j++){
c[k++]=b[j];
}
for(i=0;i<k;i++)
printf("%4d",c[i]);
}
int main(){
int i,m,n,a[MAX],b[MAX],c[MAX*2];
printf("Input m,n:");
scanf("%d,%d",&m,&n);
printf("Input array a:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
printf("Input array b:");
for(i=0;i<n;i++)
scanf("%d",&b[i]);
Merge(a,b,c,m,n);
}