第11周编程题在线测试
NOTE:
- 指针变量:保存地址型数据,必须初始化才能使用,否则会指向不确定的存储单元。
- &a[i] 等于 *(a + i)
- ‘^’ 异或操作:0和任何数异或等于本身;1和任何数异或取相反数;数自己和自己异或等于0。
- 二维数组a[N][N]中,a代表二维数组的首地址,第0行的地址,行地址,a + i代表第i行的首地址,并非表示&a[0][i]。
- int (* p) [3] 定义的是行指针,基类型为“int[3]型”,意思是指向一个含有3个整型元素的数组的指针 a[i][j] 等于 *( *(a + i) + j ) ,与此易混淆的是 int * p[3] 这个定义的是一个指针数组,同理,对于函数定义 int * p( ) 返回的是int * 型,而int ( *p)( )返回值为整型,其中 指针变量p指向返回值为整型的函数。、
- int *p = *a; //a[0] 定义的是列指针;a[i][j] 等于 *( p + i * n + j)。
- 关于main函数中的命令行参数:我们知道C99标准中对于main函数的正确写法只有两种,吐槽一下老谭酸菜程序设计面=-=,言归正传,请看下面:
int main(void) //不带参数的main函数
{
//TODO
return 0;
}
int main(int argc, char* argv[]) //带参数的main函数
{
//TODO
return 0;
}
从第二个带参数的main函数中可以看到,第一个参数为int型的变量,大小为命令行参数的个数,第二个参数为指向字符串的指针数组,其中argv[0]为自身.c文件编译后的可执行文件.exe的路径,其余的需要自己定义,比如在CodeBlocks下可以在Project–>Set programs’ arguments弹出的对话框中设置。
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)。注意,沿山路原路返回时,原本是上坡的路段变成了下坡路段,原本是下坡的路段变成了上坡路段。小白想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多少个路段。请你编程帮助她计算。
函数原型: long Fun(long M, long T, long U, long F, long D, char str[]);
函数功能: 计算在限时M秒内T个路段的情况下,最多往返可跑的路段数。 参数:M,T,U,F,D分别代表限时、路段数,以及上坡、平地、下坡的耗时,数组str保存整条山路的路段状况,返回值:最多可跑的路段数。
#include<stdio.h>
#include<string.h>
long Fun(long M, long T, long U, long F, long D, char str[]);
int main(void)
{
long M, T, U, F, D, num;
char str[100000];
printf( "Input M,T,U,F,D:");
scanf("%ld%ld%ld%ld%ld",&M,&T,&U,&F,&D);
printf("Input conditions of road:");
scanf("%s",str);
num = Fun(M,T,U,F,D,str);
printf("num=%ld\n",num);
return 0;
}
long Fun(long M, long T, long U, long F, long D, char str[])
{
long i;
long sum = 0;
for(i = 0; i < T; i++)
{
if(str[i] == 'f')
sum += 2*F;
else
sum += U + D;
if(sum > M)
return i;
}
return T - 1; //我觉得应该是 8, 怎么会是7呢,这么多时间肯定能跑完啊,有问题
}
2. 奇偶数分离
题目内容:
输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。
函数原型: void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数
解题思路: 用两个循环分别输出奇数和偶数,在输出第一个数时用"%d"格式字符,在输出其余数时用",%d"格式字符,用标志变量记录和判断是否是第一个奇数或偶数。
#include<stdio.h>
#define N 100
void Seperate(int a[], int n);
int main(void)
{
int n;
int a[N] = {
0};
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 i, count = 0;
for(i = 0; i < n; i++)
{
if(a[i]%2 == 1)
{
if(count == 0)
printf("%d",a[i]);
else
printf(",%d",a[i]);
count++;
}
}
count = 0;
printf("\n");
for(i = 0; i < n; i++)
{
if(a[i]%2 == 0)
{
if(count == 0)
printf("%d",a[i]);
else
printf(",%d",a[i]);
count++;
}
}
}
3. 子串判断
题目内容:
从键盘输入两个长度小于80的字符串A和B,且A的长度大于B的长度,编程判断B是不是A的子串,如果是,则输出”Yes”,否则输出”No”。这里所谓的该串的子串是指字符串中任意多个连续的字符组成的子序列。
函数原型: int IsSubString(char a[], char b[]);
函数功能: 判断b是否是a的子串,是则返回1,否则返回0
#include<stdio.h>
#include<string.h>
#define N 80
int IsSubString(char a[], char b[]);
int main(void)
{
char a[N], b[N];
printf("Input the first string:");
gets(a);
printf("Input the second string:");
gets(b);