内容正文:
《C语言程序设计》
期末复习卷(四)
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一.程序设计题(本大题共10小题,每小题10分,共100分)
1.编写程序,使用指针将数组arr中前n个元素循环右移k个位置。例如arr=[1,2,3,4,5], n=5, k=2 → 输出结果 [4,5,1,2,3]
#include <stdio.h>
/*******space*******/
void reverse(int *a, int start, int end) {
int temp;
while(start < end) {
temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
/*******space*******/
void rightShift(int *arr, int n, int k){
/*******space*******/
k = k % n;
if(k == 0) return;
reverse(arr, 0, n-1);
reverse(arr, 0, k-1);
reverse(arr, k, n-1);
/*******space*******/
}int main(){
int arr[] = {1,2,3,4,5};
rightShift(arr, 5, 2);
for(int i=0;i<5;i++) printf("%d ", arr[i]);
return 0;
}
2.编写函数,使用递归函数gcd(a,b)求两个整数的最大公约数
#include <stdio.h>
int gcd(int a, int b){
/*******space*******/
if(b == 0) return a;
return gcd(b, a % b);
/*******space*******/
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d
", gcd(a,b));
return 0;
}
3.编写程序删除字符串 str 中所有字符 ch,返回删除后的新字符串。例如:输入str="hello world", 输入ch='l' → 输出"heo word"
#include <stdio.h>
void delChar(char *str, char ch){
/*******space*******/
char *p = str;
while(*str) {
if(*str != ch) {
*p = *str;
p++;
}
str++;
}
*p = '\0';
/*******space*******/
}int main(){
char str[100] = "hello world";
delChar(str, 'l');
puts(str);
return 0;
}
4.编写程序:输入一个正整数n,输出它的所有质因子(重复的也要输出)。
例如:n=12 → 2 3
#include<stdio.h>
void primeFactors(int n){
/*******space*******/
int i;
for(i=2;i<=n;i++){
while(n%i==0){
printf("%d ",i);
n/=i;
}
}
/*******space*******/
}
int main(){
int n;
scanf("%d", &n);
primeFactors(n);
return 0;
}
5.编写程序,输入一串字符串,找出该字符串中最长的回文子串,若有多个输出第一个。
#include<stdio.h>
#include<string.h>
void longestPalindrome(char *s, char *result){
/*******space*******/
int len = strlen(s);
int start = 0, maxLen = 1;
for(int i = 0; i < len; i++) {
int l = i, r = i;
while(l >= 0 && r < len && s[l] == s[r]) {
if(r - l + 1 > maxLen) {
maxLen = r - l + 1;
start = l;
}
l--;
r++;
}
l = i; r = i + 1;
while(l >= 0 && r < len && s[l] == s[r]) {
if(r - l + 1 > maxLen){
maxLen = r - l + 1;
start = l;
}
l--; r++;
}
}
strncpy(result, s + start, maxLen); result[maxLen] = '\0';
/*******space*******/
}
int main(){
char s[1000],
res[1000];
scanf("%s", s);
longestPalindrome(s, res);
puts(res);
return 0;
}
6.编写程序,输入一个字符串,将该字符串中连续重复的字符压缩成“字符+次数”的形式。
#include<stdio.h>
void compress(char *s, char *t){
/*******space*******/
int i = 0,
j = 0,
count;
while(s[i]){
t[j++] = s[i];
count = 1;
while(s[i] == s[i+1]){
count++;
i++;
}
if(count>1){
t[j++]=count+'0';
}
i++;
}
t[j] = '\0';
/*******space*******/
}
int main(){
char s[100],t[200];
scanf("%s", s);
compress(s,t);
puts(t);
return 0;
}
7.编写程序在升序数组arr中使用递归二分法查找目标值target,并返回下标,若不存在时则返回-1
/#include<stdio.h>
int binarySearch(int arr[], int left, int right, int target) {
/*******space*******/
if(left > right) return -1;
int mid = (left + right) / 2;
if(arr[mid] == target) return mid;
if(arr[mid] > target) return binarySearch(arr, left, mid-1, target); return binarySearch(arr, mid+1, right, target);
/*******space*******/
}
int main(){
int arr[] = {1,3,5,7,9,11};
printf("%d
", binarySearch(arr,0,5,7));
return 0;
}
8.编写程序,输入一串字符串,统计字符串中每个单词出现的次数,按单词首次出现顺序输出。例如输入i want python want.0
#include<stdio.h>
#include<string.h>
void wordCount(char *s)
{
/*******space*******/
char words[100][50];
int count[100] = {0},
wordNum = 0;
char *token = strtok(s, " ");
while(token){
int found = 0;
for(int i = 0; i<wordNum; i++){
if(strcmp(words[i],token)==0){
count[i]++;
found = 1;
break;
}
}
if(!found){
strcpy(words[wordNum], token);
count[wordNum++] = 1;
}
token = strtok(NULL, " ");
}
for(int i=0;i<wordNum;i++){
printf("%s:%d ",words[i],count[i]);
}
/*******space*******/
}
int main(){
char s[1000];
gets(s);
wordCount(s);
return 0;
}
9.编写程序,输入两串字符串,判断第二个字符串是否为第一个字符串的循环移位后的结果,例如:s1="abcde", s2="cdeab" → 是
#include<stdio.h>
#include<string.h>
int isRotation(char *s1, char *s2){
/*******space*******/
int len1 = strlen(s1),
len2 = strlen(s2);
if(len1 != len2) return 0;
char temp[200];
strcpy(temp, s1);
strcat(temp, s1);
return strstr(temp, s2)!= NULL;
/*******space*******/
}
int main(){
char s1[100], s2[100];
scanf("%s%s", s1, s2);
printf("%d
", isRotation(s1,s2));
return 0;
}
10.背包问题:有n个物品,重量 w[i],价值 v[i],背包容量 W,求能装的最大价值
#include<stdio.h>
int knapSack(int W, int w[], int v[], int n) {
/*******space*******/
int dp[100][100] = {0};
for(int i = 1; i <= n; i++){
for(int j = 1; j <= W; j++) {
if(w[i-1] <= j) {
int take = v[i-1] + dp[i-1][j - w[i-1]];
int notTake = dp[i-1][j];
dp[i][j] = (take > notTake) ? take : notTake;
}else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][W];
/*******space*******/
}
int main(){
int w[] = {2,3,4,5};
int v[] = {3,4,5,6};
printf("%d
", knapSack(8, w, v, 4));
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
《C语言程序设计》
期末复习卷(四)
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一.程序设计题(本大题共10小题,每小题10分,共100分)
1.编写程序,使用指针将数组arr中前n个元素循环右移k个位置。例如arr=[1,2,3,4,5], n=5, k=2 → 输出结果 [4,5,1,2,3]
#include <stdio.h>
/*******space*******/
/*******space*******/
void rightShift(int *arr, int n, int k){
/*******space*******/
/*******space*******/
}int main(){
int arr[] = {1,2,3,4,5};
rightShift(arr, 5, 2);
for(int i=0;i<5;i++) printf("%d ", arr[i]);
return 0;
}
2.编写函数,使用递归函数gcd(a,b)求两个整数的最大公约数
#include <stdio.h>
int gcd(int a, int b){
/*******space*******/
/*******space*******/
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d
", gcd(a,b));
return 0;
}
3.编写程序删除字符串 str 中所有字符 ch,返回删除后的新字符串。例如:输入str="hello world", 输入ch='l' → 输出"heo word"
#include <stdio.h>
void delChar(char *str, char ch){
/*******space*******/
/*******space*******/
}int main(){
char str[100] = "hello world";
delChar(str, 'l');
puts(str);
return 0;
}
4.编写程序:输入一个正整数n,输出它的所有质因子(重复的也要输出)。
例如:n=12 → 2 3
#include<stdio.h>
void primeFactors(int n){
/*******space*******/
/*******space*******/
}
int main(){
int n;
scanf("%d", &n);
primeFactors(n);
return 0;
}
5.编写程序,输入一串字符串,找出该字符串中最长的回文子串,若有多个输出第一个。
#include<stdio.h>
#include<string.h>
void longestPalindrome(char *s, char *result){
/*******space*******/
/*******space*******/
}
int main(){
char s[1000],
res[1000];
scanf("%s", s);
longestPalindrome(s, res);
puts(res);
return 0;
}
6.编写程序,输入一个字符串,将该字符串中连续重复的字符压缩成“字符+次数”的形式。
#include<stdio.h>
void compress(char *s, char *t){
/*******space*******/
/*******space*******/
}
int main(){
char s[100],t[200];
scanf("%s", s);
compress(s,t);
puts(t);
return 0;
}
7.编写程序在升序数组arr中使用递归二分法查找目标值target,并返回下标,若不存在时则返回-1
/#include<stdio.h>
int binarySearch(int arr[], int left, int right, int target) {
/*******space*******/
/*******space*******/
}
int main(){
int arr[] = {1,3,5,7,9,11};
printf("%d
", binarySearch(arr,0,5,7));
return 0;
}
8.编写程序,输入一串字符串,统计字符串中每个单词出现的次数,按单词首次出现顺序输出。例如输入i want python want.0
#include<stdio.h>
#include<string.h>
void wordCount(char *s)
{
/*******space*******/
/*******space*******/
}
int main(){
char s[1000];
gets(s);
wordCount(s);
return 0;
}
9.编写程序,输入两串字符串,判断第二个字符串是否为第一个字符串的循环移位后的结果,例如:s1="abcde", s2="cdeab" → 是
#include<stdio.h>
#include<string.h>
int isRotation(char *s1, char *s2){
/*******space*******/
/*******space*******/
}
int main(){
char s1[100], s2[100];
scanf("%s%s", s1, s2);
printf("%d
", isRotation(s1,s2));
return 0;
}
10.背包问题:有n个物品,重量 w[i],价值 v[i],背包容量 W,求能装的最大价值
#include<stdio.h>
int knapSack(int W, int w[], int v[], int n) {
/*******space*******/
/*******space*******/
}
int main(){
int w[] = {2,3,4,5};
int v[] = {3,4,5,6};
printf("%d
", knapSack(8, w, v, 4));
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$