大学生C语言期末必背题目,考研必背题目,找工作基础题目
1、输出9*9口诀。共9行9列,i控制行,j控制列。
//99乘法表
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d x %d = %-4d",i,j,i*j);
}
printf("\n");
}
}
运行结果:
2、古典问题:有一对兔子,从出生后第3个月起每个闯都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(斐波那契数列)
//兔子繁殖问题
#define month 20
int main()
{
long x1 = 1, x2 = 1;
for (int i = 1; i <= month; i++)
{
printf("%-12ld%-12ld", x1, x2);
if (i % 2 == 0)
{
printf("\n");
}
x1 = x1 + x2;
x2 = x1 + x2;
}
return 0;
}
3、判断101-200之间有多少个素数,并输出所有素数及素数的个数。
解析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
//素数判断
int main()
{
int count = 0;
for (int i = 101; i <= 200; i++)
{
int flag = 0;
for (int j = 2; j < sqrt(i) + 1; j++)
{
if (i % j == 0)
{
flag = 1;
break;
}
}
if (!flag)
{
++count;
printf("%d ", i);
if (count % 8 == 0)
{
printf("\n");
}
}
}
printf("\n%d", count);
return 0;
}
4、—个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
//完数
int main()
{
int count = 0;
for (int i = 2; i < 1000; i++)
{
int sum = 1;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
sum += j;
}
}
if (sum == i)
{
++count;
printf("%d = 1", sum);
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
printf("+%d", j);
}
}
printf("\n");
}
}
printf("%d", count);
}
运行结果:
5、下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出,请在空白处完善程序。
//矩阵转置
#define ROW 4
#define COL 4
int main()
{
int arr[ROW][COL] = { 0 };
for (int i = 0; i < COL; i++)
{
for (int j = 0; j < ROW; j++)
{
scanf("%d", &arr[j][i]);
}
}
printf("\n");
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
6、杨辉三角
//杨辉三角
#define ROW 20
#define COL 20
int main()
{
int arr[ROW][COL] = { 0 };
arr[0][0] = 1;
for (int i = 1; i < ROW; i++)
{
arr[i][0] = arr[i][i] = 1;
for (int j = 1; j < COL-1; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j <= i; j++)
{
printf("%-5d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
7、通过键盘输入3名学生4门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩。要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。
//学生成绩
int main()
{
double arr[4][5] = { 0 };
int i, j,sum;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%lf", &arr[i][j]);
}
}
for (i = 0; i < 3; i++)
{
sum = 0;
for (j = 0; j < 4; j++)
{
sum+=arr[i][j];
}
arr[i][4] = sum/4;
}
for (i = 0; i < 5; i++)
{
sum = 0;
for (j = 0; j < 3; j++)
{
sum += arr[j][i];
}
arr[3][i] = sum/3;
}
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5; j++)
{
printf("%2.2lf ", arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
8、完善程序,实现将输入的字符串反序输出,如输入windows输出swodniw。
//字符串逆序-常规
int main()
{
char c[100] = { 0 };
gets(c);
int len = strlen(c);
int left = 0, right = len - 1;
while (left < right)
{
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
printf("%s", c);
return 0;
}
//字符串逆序-指针
int main()
{
char c[100] = { 0 };
gets(c);
int len = strlen(c);
int left = 0, right = len - 1;
while (left < right)
{
char temp = *(c+left);
*(c + left) = *(c + right);
*(c + right) = temp;
left++;
right--;
}
printf("%s", c);
return 0;
}
9、从字符串中删除字符
//从字符串中删除字符
int main()
{
char str[100] = { 0 };
gets(str);
char c = { 0 };
scanf("%c", &c);
int i, j;
for (i = 0, j = 0; str[i] != '\0'; i++)
{
if (str[i] != c)
{
str[j] = str[i];
j++;
}
}
str[j] = '\0';
printf("%s", str);
return 0;
}
运行结果:
//从字符串中删除字符
int main()
{
char str[100] = { 0 };
gets(str);
char c = { 0 };
scanf("%c", &c);
int i, j;
for (i = 0, j = 0; str[i] != '\0'; i++)
{
if (str[i] != c)
{
str[j] = str[i];
j++;
}
}
str[j] = '\0';
printf("%s", str);
return 0;
}
10、编写一个void sort(int *x,int n)实现将x数组中的n个数据从大到小排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件p9_1.out中。
//排序
void sort(int* x, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 1+i; j < n; j++)
{
if (x[i] < x[j])
{
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%d ", x[i]);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
sort(arr, n);
return 0;
}
运行结果:
11、已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列
整了点花活,但是程序没问题,一样用。。。
//插入排序
void sort(int* x, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 1+i; j < n; j++)
{
if (x[i] < x[j])
{
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%d ", x[i]);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int *x = (int*)malloc(n*sizeof(int));
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &x[i]);
}
int num = 0;
scanf("%d", &num);
x = (int*)realloc(x, (n+1)*sizeof(int));
x[i] = num;
sort(x, n+1);
return 0;
}
运行结果:
12、编写函数replace(char*s,char c1,charc2)度实现将s所指向的字符串中所有字符c1用c2替换,字符串、字符c1和c2均在主函数中输入,将原始字符串和替换后的字符串显示在屏幕上,并输出到文件p10_2.out中
//替换字符串中字符
replace(char* s, char c1, char c2)
{
while (*s != '\0')
{
if (*s == c1)
{
*s = c2;
}
s++;
}
}
main()
{
FILE* fp;
char str[100], a, b;
if ((fp = fopen("p10_2.out", "w")) == NULL)
{
printf("cannot open thefile\n");
exit(0);
}
printf("Enter a string:\n");
gets(str);
printf("Enter a&&b:\n");
scanf("%c,%c", &a, &b);
printf("%s\n", str);
fprintf(fp, "%s\n", str);
replace(str, a, b);
printf("Thenew string is----%s\n", str);
fprintf(fp, "Thenew string is----%s\n", str);
fclose(fp);
}
13、产在一个字串s1中查找一子串s2,若存在则返回子串在主串中的起始位置,不存在则返回-1。
//寻找子串位置
int search(char* str1, char* str2)
{
int len2 = strlen(str2);
int i = 0, j = 0;
while (str1[i])
{
for (j = 0; j < len2; j++)
{
if (str1[i + j] != str2[j])
{
break;
}
}
if (j >= len2)
{
return i;
}
else
{
++i;
}
}
return -1;
}
int main()
{
char str1[10] = "this is";
char str2[9] = "is";
printf("%d", search(str1, str2));
return 0;
}
14、用指针变量输出结构体数组元素。
//产用指针变量输出结构体数组元素。
struct student
{
int num;
char* name;
char sex;
int age;
}stu[5] = {{1001,"lihua",'F',18},{1002,"liuxing",'M',19},{1003,"huangke",'F',19},{1004,"fengshou",'F',19},{1005,"Wangming",'M',18}};
main()
{
int i;
struct student* ps;
printf("Num \tName\t\tSex\tAge\t\n");
/*用指针变量输出结构体数组元素。*/
for (ps = stu; ps < stu + 5; ps++)
{
printf("%d\t%-10s\t%c\t%d\t\n", ps->num, ps->name, ps->sex, ps->age);
}
printf("\n");
/*用数组下标法输出结构体数组元素学号和年龄。*/
for (i = 0; i < 5; i++)
{
printf("%d\t%d\t\n", stu[i].num, stu[i].age);
}
}
运行结果:
15、建立一个有三个结点的简单链表
struct student
{
int num;
char* name;
int age;
struct student* next;
};
void main()
{
struct student a, b, c, * head, * p;
a.num = 1001; a.name = "lihua"; a.age = 18; /* 对结点成员进行赋值 */
b.num = 1002; b.name = "liuxing"; b.age = 19;
c.num = 1003; c.name = "huangke"; c.age = 18;
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
p = head;
do {
printf("%5d,%s,%3d\n", p->num, p->name, p->age);
p = p->next;
} while (p != NULL);
}
16、输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。
//回文数
#define MANX 20
typedef enum { false, true } bool;
bool palindrome(char* str)
{
int len = strlen(str);
int left = 0, right = len - 1;
while (left < right)
{
if (*(str + left) != *(str + right))
{
return false;
}
left++;
right--;
}
return true;
}
int main()
{
char str[MANX] = { 0 };
gets(str);
if (palindrome(str) == 1)
{
printf("YES!");
}
else
{
printf("NO!");
}
return 0;
}
运行结果:
17、冒泡排序,选择排序从小到大,排序后结果输出到屏幕及文件myf2.out
(1)冒泡排序
//冒泡加文件
void bubble(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 1 + i; j < n; j++)
{
if (arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
FILE* fp;
if ((fp = fopen("myf2.out", "w")) == NULL)
{
printf("cannot open the file\n");
exit(0);
}
int arr[20] = { 0 };
int n = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
bubble(arr, n);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
fprintf(fp, "%d ", arr[i]);
}
fclose(fp);
return 0;
}
(2) 选择排序
//选择加文件
void choose(int* arr, int n)
{
for (int i = 0; i < n; ++i)
{
int min = arr[i],index = i;
for (int j = 1 + i; j < n; ++j)
{
if (min > arr[j])
{
min = arr[j];
index = j;
}
}
if (min < arr[i])
{
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
int main()
{
FILE* fp;
if ((fp = fopen("myf2.out", "w")) == NULL)
{
printf("cannot open the file\n");
exit(0);
}
int arr[20] = { 0 };
int n = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
choose(arr, n);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
fprintf(fp, "%d ", arr[i]);
}
fclose(fp);
return 0;
}
18、编写函数countpi,利用公式计算T的近似值,当某一项的值小于10-5时,认为达到精度要求,请完善函数。将结果显示在屏幕上并输出到文件p7_3.out中。
//计算pi近似值加文件
double count_pi(double eps)
{
double num1 = 1, num2 = 1, quotient = 1, sum = 1;
int i = 0;
while (quotient >= 1e-5)
{
i++;
num1 *= i;
num2 *= (2 * i + 1);
quotient = num1 / num2;
sum += quotient;
}
return sum * 2;
}
int main()
{
FILE* fp;
double eps = 1e-5,pi;
if ((fp = fopen("p7_3.out", "w+")) == NULL)
{
printf("cannot open the file\n");
exit(0);
}
pi = count_pi(eps);
printf("pi = %lf\n", pi);
fprintf(fp,"pi = %lf\n", pi);
fclose(fp);
return 0;
}