1.编写递归函数int change(char*s),将字符串s中的所有空格后的字母转换为大写字母。注:不允许使用string.h头文件和其声明的相关函数。
cpp
#include <stdio.h>
int change(char *str) {
int i=0;
while(str[i]!='\0') {
if(str[i]==' '&&str[i+1]>-'a'&&str[i+1]<='z')
str[i+1]=str[i+1]-'a'+'A';
i++;
}
printf("%s",str);
}
2.编写函数,将一个正整数分解质因数,即多个质因子相乘的形式,只需返回质因子的个数。例: 90=2*3*3*5, 函数返回4
cpp
#include <stdio.h>
#include <math.h>
int isprime(int n){
if(n<=1)
return 0;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
int getcount(int n){
int count=1;
for(int i=2;i<n;i++)
if(n%i==0&&isprime(i)){
n/=i;
i--;
count++;
}
return count;
}
int main(){
printf("%d",getcount(90));
}
3.编写函数int de(int a[][10], int n),求二维整型数组中每行的和,并删除和最大的一行.要求:数组中剩余元素保存原来次序顺序存储,并返回最大的和。
cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int del(int a[][N],int n) {
int max=0,maxflag,sum;
for(int i=0; i<n; i++) {
sum=0;
for(int j=0; j<n; j++)
sum+=a[i][j];
if(sum>max) {
max=sum;
maxflag=i;
}
}
for(int i=maxflag; i<n; i++)
for(int j=0; j<n; j++)
a[i][j]=a[i+1][j];
return max;
}
void generateRandomArray(int arr[][N], int rows, int cols) {
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
arr[i][j] = rand() % 100;
}
void printArray(int arr[][N], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%4d ", arr[i][j]);
printf("\n");
}
}
int main() {
int arr[N][N];
srand(time(NULL));
generateRandomArray(arr, N, N);
printf("max = %d\n",del(arr,N));
printArray(arr, N-1, N);
return 0;
}
4.学生成绩信息包含学号、姓名和成绩三项,定义存储上述学生成绩信息的单向链表的结点类型,并编写函数,由键盘输入n个学生的成绩信息,创建一个用于管理学生成绩信息的单向链表A,并在创建过程中随时保证单向链表的结点顺序满足成绩从低到高。
cpp
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
char name[20];
int score;
struct node *next;
} node;
struct node *create(int n) {
struct node *head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
struct node *pre=head;
for(int i=0; i<n; i++) {
struct node *p=(struct node *)malloc(sizeof(struct node));
scanf("%d %s %d",&p->num,&p->name,&p->score);
while(pre->next!=NULL&&pre->next->score<p->score)
pre=pre->next;
p->next=pre->next;
pre->next=p;
pre=head;
}
return head->next;
}
5.编写函数,从文件classB.txt中读取另一个班级的学生成绩信息创建链表B (文件classB.txt 中的信息按照成绩从低到高的顺序存储),将单向链表B与上题中的单向链表A归并为一个按学生成绩从低到高排序的单向链表。
cpp
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
char name[20];
int score;
struct node *next;
} node;
struct node *create(int n) {
struct node *head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
struct node *pre=head;
for(int i=0; i<n; i++) {
struct node *p=(struct node *)malloc(sizeof(struct node));
scanf("%d %s %d",&p->num,&p->name,&p->score);
while(pre->next!=NULL&&pre->next->score<p->score)
pre=pre->next;
p->next=pre->next;
pre->next=p;
pre=head;
}
return head->next;
}
struct node *creatfromfile() {
FILE *file;
if((file=fopen("classB.txt","r"))==NULL) {
printf("open error");
exit(0);
}
struct node *head=(struct node *)malloc(sizeof(struct node));
struct node *pre=head;
while(!feof(file)) {
struct node *p=(struct node *)malloc(sizeof(struct node));
fscanf(file,"%d %s %d",&p->num,&p->name,&p->score);
while(pre->next!=NULL&&pre->next->score<p->score)
pre=pre->next;
p->next=pre->next;
pre->next=p;
pre=head;
}
fclose(file);
return head->next;
}
struct node *merge(struct node *head1,struct node *head2) {
struct node *head=(struct node *)malloc(sizeof(struct node));
struct node *p=head1,*q=head2,*rear=head;
while(p!=NULL&&q!=NULL) {
if(p->score<q->score) {
rear->next=p;
rear=p;
p=p->next;
} else {
rear->next=q;
rear=q;
q=q->next;
}
}
if(p!=NULL)
rear->next=p;
else
rear->next=q;
return head->next;
}